簡體   English   中英

合並文檔以在iText(Java)中創建目錄

[英]Merge documents to create TOC in iText (Java)

當使用需要目錄的iText創建文檔時,通常使用以下過程:在內存中創建主文檔,在內存中將TOC創建為單獨的文檔(使用虛擬鏈接),將它們合並為第三文檔,然后然后使用PdfStamper協調鏈接到文檔中並將其寫入文件。

這適用於除最新版本(5.5.6)以外的所有iText版本。 我將包括一個執行此過程的簡單程序(實際程序要復雜得多)。 當使用iText 5.5.5或更早版本運行此文件時,它將創建所需的文檔(兩頁,第一頁包含提供打開第二頁鏈接的文本)。 在5.5.6中,對makeRemoteNamedDestinationsLocal的調用導致異常com.itextpdf.text.pdf.PdfDictionary無法轉換為com.itextpdf.text.pdf.PdfArray

由於直到最新版本都一直有效,因此我懷疑這可能是最新版本中的錯誤。 這是一個錯誤,還是我做錯了什么? 如果不是bug,該怎么辦? 此外,通常如何為iText提交錯誤報告? 在網站上,他們似乎希望將問題作為報告提交到這里。

import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.draw.*;
import java.io.*;

// WORKS CORRECTLY USING itext version 5.5.5
// FAILS WITH 5.5.6
// CAUSES AN EXCEPTION 
// "com.itextpdf.text.pdf.PdfDictionary cannot be cast to com.itextpdf.text.pdf.PdfArray"
// with makeRemoteNamedDestinationsLocal()
public class testPdf {
    public static void main (String[] args) throws Exception {
        // Create simple document
        ByteArrayOutputStream main = new ByteArrayOutputStream();
        Document doc = new Document(new Rectangle(612f,792f),54f,54f,36f,36f);
        PdfWriter pdfwrite = PdfWriter.getInstance(doc,main);
        doc.open();
        doc.add(new Paragraph("Testing Page"));
        doc.close();

        // Create TOC document
        ByteArrayOutputStream two = new ByteArrayOutputStream();
        Document doc2 = new Document(new Rectangle(612f,792f),54f,54f,36f,36f);
        PdfWriter pdfwrite2 = PdfWriter.getInstance(doc2,two);      
        doc2.open();
        Chunk chn = new Chunk("<<-- Link To Testing Page -->>");
        chn.setRemoteGoto("DUMMY.PDF","page-num-1");
        doc2.add(new Paragraph(chn));
        doc2.close();

        // Merge documents
        ByteArrayOutputStream three = new ByteArrayOutputStream();
        PdfReader reader1 = new PdfReader(main.toByteArray());
        PdfReader reader2 = new PdfReader(two.toByteArray());
        Document doc3 = new Document();
        PdfCopy DocCopy = new PdfCopy(doc3,three);
        doc3.open();
        DocCopy.addPage(DocCopy.getImportedPage(reader2,1));
        DocCopy.addPage(DocCopy.getImportedPage(reader1,1));
        DocCopy.addNamedDestination("page-num-1",2,new PdfDestination(PdfDestination.FIT));
        doc3.close();

        // Fix references and write to file
        PdfReader finalReader = new PdfReader(three.toByteArray());
        // Fails on this line
        finalReader.makeRemoteNamedDestinationsLocal();
        PdfStamper stamper = new PdfStamper(finalReader,new FileOutputStream("Testing.pdf"));
        stamper.close();    
    }
}

您已檢測到iText 5.5.6中引入的錯誤。 這已在我們的存儲庫中修復:

在此處輸入圖片說明

感謝您報告此錯誤。 您可以在github上找到此修復程序: https : //github.com/itext/itextpdf/commit/eac1a4318e6c31b054e0726ad44d0da5b8a720c2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM