2016-03-23 15 views
1

を高めていると私は状況を次のようしている:私は、Apache FOPで生成されたPDFファイルが既に存在PDFBOXは、私はJavaプロジェクトに取り組んでいる二回

  1. Map<String, PDAction> actionsMap = new HashMap<String, PDAction>(); 
    PDDocumentOutline bookmarks = doc1.getDocumentCatalog().getDocumentOutline(); 
    PDOutlineItem item = bookmarks.getFirstChild(); 
    while(item != null){ 
        actionsMap.put(item.getTitle(), item.getAction()); 
        item = item.getNextSibling(); 
    } 
    
  2. 私はPDFBOX 2.0.0で(再生成FOP)は、第2のファイルを開くと、テキストの特定の部分に3 PDAnnotationLinksを追加しています:インサイド私は取得していますブックマークは、そこにあります。このファイルは、図がほとんどない単一ページです。それから私は、リンクが動作している、第二のファイルを保存した後

PDPage page = (PDPage) diagramDocument.getDocumentCatalog().getPages().get(0); 
//objCoordinates is retrieved from another class with PDFTextStripper 
Iterator entries = objCoordinates.entrySet().iterator(); 
while (entries.hasNext()) { 
    Entry entry = (Entry) entries.next(); 
    String key = (String) entry.getKey(); 
    PDAnnotationLink txtLink = new PDAnnotationLink(); 
    PDBorderStyleDictionary borderULine = new PDBorderStyleDictionary(); 
    borderULine.setWidth(0); 
    txtLink.setBorderStyle(borderULine); 
    PDActionGoTo action = (PDActionGoTo) actionsMap.get(key); 
    txtLink.setAction(action); 

    final float[] quads = (float[]) entry.getValue(); 
    PDRectangle rect = new PDRectangle(); 
    rect.setLowerLeftX(quads[0]); 
    rect.setLowerLeftY(quads[5]); 
    rect.setUpperRightX(quads[2]); 
    rect.setUpperRightY(quads[1]); 
    txtLink.setRectangle(rect); 

    page.getAnnotations().add(txtLink); 
} 
ポイント1からアクションを追加しますが、ファイルサイズが2倍になります。 PDFバージョンは1.6です。ファイルにはすでにフィルタFlateDecodeがあります。 私はオンラインのPDFファイル比較(最初のファイルと結果ファイルとリンク)を試みましたが、結果はファイルに違いがないということです。 テキストエディタでファイルを開くと、 - 元のファイル - 1タイプ/ページ/インスタンス - 結果ファイル - 18 /タイプ/ページインスタンス 私の推測では、PDFBOXに追加の(重複した)情報が追加されていると思います。

この問題が発生した場合は、アドバイスをお願いします。

おかげ

+1

明らかであると思います。他のファイルからページを参照しています。 "ページはページオブジェクトへの間接的な参照です" =>あなたのGotoアクションの行先が自分のドキュメントのページであることを確認する必要があります。ちょうど場合には、あなたは "2.0.0"と言いました、私はRC3ではなく、リリースされたバージョンだと思います。 –

+0

こんにちはティルマン、はい、私は2.0.0のリリース版を使用していますが、問題はどこにありますか。あなたが正しく言ったように、Gotoのアクションは自分のドキュメントのページでなければならず、私は別のドキュメントからページを指しています...これを指摘してくれてありがとう。コードを書き直してPDFBOXの詳細を読む必要があります – micky

+0

2番目のファイルには1ページしかないので、gotoアクションのPDPageDestinationのPDPageパラメータを割り当てるのは簡単です。 action.setDestination(page)。 –

答えて

1

は、私はちょうどあなたの信用ティルマンを与える方法を思っていた... :-) [OK]を、私は再加工し、私はそれをここに投稿することができ、コードを簡略化してきました。 は、それはファイルなしでは難しいのですが、私の気持ちはあなたが=(PDActionGoTo)actionsMap.get(キー)PDActionGoToアクションを行うときということです

import java.io.File; 
    import java.util.ArrayList; 
    import java.util.HashMap; 
    import java.util.Iterator; 
    import java.util.List; 
    import java.util.Map; 
    import java.util.Map.Entry; 

    import org.apache.pdfbox.pdmodel.PDDocument; 
    import org.apache.pdfbox.pdmodel.PDPage; 
    import org.apache.pdfbox.pdmodel.common.PDRectangle; 
    import org.apache.pdfbox.pdmodel.interactive.action.PDAction; 
    import org.apache.pdfbox.pdmodel.interactive.action.PDActionGoTo; 
    import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; 
    import org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary; 
    import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline; 
    import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem; 
    import org.apache.pdfbox.text.PDFTextStripper; 

    /** 
    * @author micky 
    * 
    * The class merges PDF files 
    * - one file with item details info 
    * - one or more files with items diagrams 
    * 
    * Purpose is to merge diagram files into item details file and create links 
    * from the items in diagrams to item details 
    */ 
    public class PDFReportHyperlinks { 

     public static void main(String[] args){ 

      PDDocument reportDocument = null; 
      try { 

       String reportFileName = "D:/ItemsDetails.pdf"; 

       Map<String, PDAction> actionsMap = new HashMap<String, PDAction>(); 
       reportDocument = PDDocument.load(new File(reportFileName)); 

       // Get the bookmarks i.e. existing GoTo actions 
       PDDocumentOutline bookmarks = reportDocument.getDocumentCatalog().getDocumentOutline(); 
       PDOutlineItem item = bookmarks.getFirstChild(); 
       while(item != null){ 
        actionsMap.put(item.getTitle(), item.getAction()); 
        item = item.getNextSibling(); 
       } 

       // Diagram files, they have single page 
       List diagamFiles = new ArrayList<String>() {{ 
         add("D:/Diagram_1.pdf"); 
         add("D:/Diagram_2.pdf"); 
         add("D:/Diagram_3.pdf"); 
       }}; 

       Iterator diagramsIt = diagamFiles.iterator(); 
       while (diagramsIt.hasNext()) { 
        String diagramName = (String) diagramsIt.next(); 

        //--<Import diagram>--------------------------------- 
        PDDocument sourceDocument = PDDocument.load(new File(diagramName)); 
        PDPage pp = (PDPage) sourceDocument .getDocumentCatalog().getPages().get(0); 
        PDPage page = reportDocument.importPage(pp); 

        //--<Create links from diagrams to objects>--------------------------------- 

        // TextStripper is separate class extending PDFTextStripper 
        // It is searching for items names and returning Map with their coordinates 
        TextStripper stripper = new TextStripper(sourceDocument, 
          new ArrayList<String>() {{ 
           add("Item1_Name"); 
           add("Item2_Name"); 
           add("Item3_Name"); 
           add("Item4_Name"); 
           add("Item5_Name"); 
          }}); 

        Map<String, float[]> objCoordinates = stripper.getObjCoordinates(); 

        Iterator entries = objCoordinates.entrySet().iterator(); 
        while (entries.hasNext()) { 
         Entry entry = (Entry) entries.next(); 
         String key = (String) entry.getKey(); 

         PDAnnotationLink txtLink = new PDAnnotationLink(); 
         PDBorderStyleDictionary borderULine = new PDBorderStyleDictionary(); 
         borderULine.setWidth(0); 
         txtLink.setBorderStyle(borderULine); 
         PDActionGoTo action = (PDActionGoTo) actionsMap.get(key); 
         txtLink.setAction(action); 

         final float[] quads = (float[]) entry.getValue(); 
         PDRectangle rect = new PDRectangle(); 
         rect.setLowerLeftX(quads[0]); 
         rect.setLowerLeftY(quads[5]); 
         rect.setUpperRightX(quads[2]); 
         rect.setUpperRightY(quads[1]); 
         txtLink.setRectangle(rect); 

         page.getAnnotations().add(txtLink); 
        } 

        //--<Create bookmarks for new pages (diagrams)>--------------------------------- 
        PDOutlineItem menuItem = new PDOutlineItem(); 
        menuItem.setTitle(diagramName); 
        menuItem.setDestination(page); 
        bookmarks.addLast(menuItem); 
        menuItem.openNode(); 
        bookmarks.openNode(); 

       } 

       reportDocument.save(new File(reportFileName)); 
       reportDocument.close(); 

       // Alternative merging documents example not feasible in this case 
       //PDFMergerUtility ut = new PDFMergerUtility(); 
       //ut.addSource(reportFileName); 
       //diagramsIt = diagamFiles.iterator(); 
       //while (diagramsIt.hasNext()) { 
       // String diagramName = (String) diagramsIt.next(); 
       // ut.addSource(diagramName); 
       // } 
       //ut.setDestinationFileName(reportFileName); 
       //ut.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly()); 

       System.out.println("COMPLETED"); 

      } catch (Exception e) { 
       System.out.println(e); 
      } finally { 
       try { 
        reportDocument.close(); 
       } catch (Exception e) { 
        System.out.println(e); 
       } 
      } 
     } 
    } 
関連する問題