2017-07-12 13 views
0

私はPDFからレイヤーを削除する機能を実装しましたが、レイヤーに描画したコンテンツはdeleteを取得しません。オプションのコンテンツグループをpdfboxを使用してpdfからそのコンテンツとともに削除するにはどうすればよいですか?

PDDocumentCatalog documentCatalog = doc.getDocumentCatalog(); 
PDOptionalContentProperties ocgProps = documentCatalog.getOCProperties(); 
PDOptionalContentGroup ocg = ocgProps.getGroup(markupLayerName); 

    COSDictionary ocgsDict = (COSDictionary)ocgProps.getCOSObject(); 
    COSArray ocgs = (COSArray)ocgsDict.getItem(COSName.OCGS); 
    int indexToBeDeleted = -1; 
    for (int index = 0; index < ocgs.size(); index++) 
    { 
     COSBase o = ocgs.get(index); 
     COSDictionary ocgDict = ToCOSDictionary(o); 
      if (ocgDict.getString(COSName.NAME) == markupLayerName) 
      { 
       indexToBeDeleted = index; 
       break; 
      } 
    } 
    if (indexToBeDeleted >= 0) 
    { 
     cgs.remove(indexToBeDeleted); 
     ocgsDict.setItem(COSName.OCGS, ocgs); 
     documentCatalog.setOCProperties(new PDOptionalContentProperties(ocgsDict)); 

     } 
+0

他に質問がありません。 –

答えて

0

マークアップデータを削除するには、PDPageのコンテンツを変更する必要があります。BDCとEMCペアのコンテンツを検索した後、そのペアが関連レイヤーに属しているかどうかを調べました。私が使用したC#コードは下にあります。

   PDPage page = (PDPage)doc.getDocumentCatalog().getPages().get(pageNum); 
       PDResources resources = page.getResources(); 
       PDFStreamParser parser = new PDFStreamParser(page); 
       parser.parse(); 
       java.util.Collection tokens = parser.getTokens(); 
       java.util.List newTokens = new java.util.ArrayList(); 
       List<Tuple<int, int>> deletionIndexList = new List<Tuple<int, int>>(); 
       object[] tokensArray = tokens.toArray(); 
       for (int index = 0; index < tokensArray.Count(); index++) 
       { 
        object obj = tokensArray[index]; 
        if (obj is COSName && (((COSName)obj) == COSName.OC)) 
        { 
         int startIndex = index; 
         index++; 
         if (index < tokensArray.Count()) 
         { 
          obj = tokensArray[index]; 
          if (obj is COSName) 
          { 
           PDPropertyList prop = resources.getProperties((COSName)obj);//Check if the COSName found is the resource name of layer which contains the markup to be deleted. 
           if (prop != null && (prop is PDOptionalContentGroup)) 
           { 
            if (((PDOptionalContentGroup)prop).getName() == markupLayerName) 
            { 
             index++; 
             if (index < tokensArray.Count()) 
             { 
              obj = tokensArray[index]; 
              if (obj is Operator && ((Operator)obj).getName() == "BDC")//Check if the token specifies the start of markup 
              { 

               int endIndex = -1; 
               index++; 
               while (index < tokensArray.Count()) 
               { 
                obj = tokensArray[index]; 
                if (obj is Operator && ((Operator)obj).getName() == "EMC")//Check if the token specifies the end of markup 
                { 
                 endIndex = index; 
                 break; 
                } 
                index++; 
               } 
               if (endIndex >= 0) 
               { 
                deletionIndexList.Add(new Tuple<int, int>(startIndex, endIndex)); 
               } 
              } 

             } 
            } 
           } 
          } 
         } 
        } 
       } 
       int tokensListIndex = 0; 
       for (int index = 0; index < deletionIndexList.Count(); index++) 
       { 
        Tuple<int, int> indexes = deletionIndexList.ElementAt(index); 
        while (tokensListIndex < indexes.Item1) 
        { 
         newTokens.add(tokensArray[tokensListIndex]); 
         tokensListIndex++; 
        } 
        tokensListIndex = indexes.Item2 + 1; 
       } 
       while (tokensListIndex < tokensArray.Count()) 
       { 
        newTokens.add(tokensArray[tokensListIndex]); 
        tokensListIndex++; 
       } 
       PDStream newContents = new PDStream(doc); 
       OutputStream output = newContents.createOutputStream(COSName.FLATE_DECODE); 
       ContentStreamWriter writer = new ContentStreamWriter(output); 
       writer.writeTokens(newTokens); 
       output.close(); 
       page.setContents(newContents); 
+0

文字列の比較に '=='を使用すると、これが一般的に動作するかどうか疑問です。 – mkl

+0

@mklこれはC#コードであり、動作します。私はそれを複数回テストしました。たぶんあなたはjava、 –

+0

ああ、okを参照しています。おそらく、あなたがどこかにjavaがPDFBoxが使用されるより一般的なコンテキストであることを示すべきでしょう。 – mkl

関連する問題