2016-03-23 48 views
1

artar ve Ben durumu vardır: Ben apache FOP ile oluşturulan PDF dosyası mevcut olanPDFBOX Java proje üzerinde çalışıyorum iki kez

  1. . İçinde orada Birlikte alıyorum imleri, şunlardır: Ben ikinci dosyayı açıyorum

    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. (tekrar oluşturulan züppe) PDFBOX 2.0.0 ile ve metnin belirli bölümlerine 3 PDAnnotationLinks ekleyin. Dosya birkaç şema ile tek sayfadır. Sonra bağlantılar çalışıyoruz, ikinci dosyayı kaydettikten sonra

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); 
} 
noktası 1 den eylemleri eklemek, ancak dosya boyutu iki katına çıkarılır. PDF sürümü 1,6'dır. Dosyada zaten FlateDecode filtresi var. Çevrimiçi PDF dosyalarını karşılaştırmayı denedim (ilk dosya ve bağlantılarla sonuç dosyası) ancak sonuçta dosyaların hiçbir farkı yok. Dosyaları, metin düzenleyicisiyle açtığımda - özgün dosya - 1 Tür/Sayfa/örnek - sonuç dosyası - 18/Tür/Sayfa örnekleri Tahminim, PDFBOX'ın fazladan (yinelenen?) Bilgiler ekliyor olmasıdır.

Bu sorunla karşılaştıysanız, tavsiye vermekten memnuniyet duyarım.

Teşekkür

+1

O dosyası olmadan zor ama benim duygu olduğunu sen PDActionGoTo action = (PDActionGoTo) actionsMap.get (anahtar) ne zaman; diğer dosyadan bir sayfaya başvuruyorsunuz. "sayfa bir sayfa nesnesine dolaylı bir referanstır" => Goto eyleminizin hedefinin kendi belgenizin bir sayfası olduğundan emin olmalısınız. Btw durumunda, "2.0.0" dan bahsettiniz, umarım yayınlanmış versiyonu ve RC3 değil. –

+0

Merhaba Tilman, Evet, yayınlanmış 2.0.0 sürümünü kullanıyorum, ancak sorun başka bir yerde. Doğru şekilde söylediğin gibi, Goto eylemi kendi belgenizin bir sayfası olmalı ve başka bir belgeden sayfaya işaret ediyorum ... Bunu işaret ettiğin için teşekkür ederim. Kodumu yeniden işlemek ve PDFBOX – micky

+0

hakkında daha fazla bilgi almak istiyorum. İkinci dosyanızın sadece bir sayfası var, bu yüzden goto eyleminin PDPageDestination öğesinin PDPage parametresini atamak kolay olmalı. action.setDestination (sayfa). –

cevap

1

Sadece seni kredi Tilman vermek nasıl acaba ... :-) Tamam, elden geçirilmiş ve bu yüzden buraya gönderebilir kodu kolaylaştırmıştır. açıkça Umut

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); 
       } 
      } 
     } 
    }