合并文档以在 iText 中创建目录 (Java)
Merge documents to create TOC in iText (Java)
当使用 iText 创建需要 table 内容的文档时,我通常使用一个过程,在内存中创建主文档,在内存中创建 TOC 作为单独的文档(使用虚拟 links),将它们合并为第三个文档,然后使用 PdfStamper 将 links 协调到文档中并将其写入文件。
这适用于除最新版本 (5.5.6) 之外的所有 iText 版本。我将包含一个执行此过程的简单程序(实际程序要复杂得多)。当 运行 使用 iText 5.5.5 或更早版本时,它会创建所需的文档(2 页,第一页包含提供 link 以打开第二页的文本)。在 5.5.6 中,对 makeRemoteNamedDestinationsLocal
的调用导致异常 com.itextpdf.text.pdf.PdfDictionary cannot be cast to com.itextpdf.text.pdf.PdfArray.
由于在最新版本之前一直有效,我怀疑这可能是最新版本中的错误。这是一个错误,还是我做错了什么?如果它不是错误,我应该如何执行此任务?此外,通常如何为 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
当使用 iText 创建需要 table 内容的文档时,我通常使用一个过程,在内存中创建主文档,在内存中创建 TOC 作为单独的文档(使用虚拟 links),将它们合并为第三个文档,然后使用 PdfStamper 将 links 协调到文档中并将其写入文件。
这适用于除最新版本 (5.5.6) 之外的所有 iText 版本。我将包含一个执行此过程的简单程序(实际程序要复杂得多)。当 运行 使用 iText 5.5.5 或更早版本时,它会创建所需的文档(2 页,第一页包含提供 link 以打开第二页的文本)。在 5.5.6 中,对 makeRemoteNamedDestinationsLocal
的调用导致异常 com.itextpdf.text.pdf.PdfDictionary cannot be cast to com.itextpdf.text.pdf.PdfArray.
由于在最新版本之前一直有效,我怀疑这可能是最新版本中的错误。这是一个错误,还是我做错了什么?如果它不是错误,我应该如何执行此任务?此外,通常如何为 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