Itext PdfSmartCopy 获取空指针异常
Itext PdfSmartCopy getting Null pointer Exception
我现在正在使用 Itext PdfSmartCopy。我正在使用 XMLworker 将一些业务内容添加到文档对象。然后我声明了一个 reader (对于要连接到此文档对象的 pdf 文件)。然后我使用相同的文档对象和输出文件流作为参数调用 PdfSmartCopy。然后我使用常规步骤将页面复制到文档中,
addHTML(document, htmlStringToBeAdded);
document.newPage();
com.itextpdf.text.pdf.PdfCopy copy = new com.itextpdf.text.pdf.PdfSmartCopy(document, new FileOutputStream("c:\pdf_issue\bad_itext3.pdf"));
com.itextpdf.text.pdf.PdfReader reader=new com.itextpdf.text.pdf.PdfReader("c:\pdf_issue\bad1.pdf");
// loop over the pages in that document
n = reader.getNumberOfPages();
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(reader, ++page));
}
copy.freeReader(reader);
reader.close();
但是我在 getPageReference 中收到空指针异常?有什么问题?
Exception in thread "main" java.lang.NullPointerException
at com.itextpdf.text.pdf.PdfWriter.getPageReference(PdfWriter.java:1025)
at com.itextpdf.text.pdf.PdfWriter.getCurrentPage(PdfWriter.java:1043)
at com.itextpdf.text.pdf.PdfCopy.addPage(PdfCopy.java:356)
at com.jci.util.PdfTest.main(PdfTest.java:627)
但是如果我使用一个新的文档对象,即不添加业务内容,这篇文章会很好用。
我们在已关闭的问题跟踪器中遇到了类似的问题。在那张票中,似乎需要在创建 PdfCopy
实例后立即打开 Document
。
在您的案例中,我们看到了类似的问题:您使用 Document
对象从头开始创建 PDF,然后您使用 相同的 Document
创建现有 PDF 的副本。这永远行不通:您需要先关闭您从头开始创建的文档,然后为复制过程创建一个新的 Document
:
// first create the document
Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
document.open();
addHTML(document, htmlStringToBeAdded);
document.close();
// Now you can use the document you've just created
PdfReader reader = new PdfReader(baos.toArray());
PdfReader existing = new PdfReader("c:\pdf_issue\bad1.pdf");
document = new Document();
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream("c:\pdf_issue\bad_itext3.pdf"));
document.open();
copy.addDocument(reader);
copy.addDocument(existing);
document.close();
reader.close();
existing.close();
我现在正在使用 Itext PdfSmartCopy。我正在使用 XMLworker 将一些业务内容添加到文档对象。然后我声明了一个 reader (对于要连接到此文档对象的 pdf 文件)。然后我使用相同的文档对象和输出文件流作为参数调用 PdfSmartCopy。然后我使用常规步骤将页面复制到文档中,
addHTML(document, htmlStringToBeAdded);
document.newPage();
com.itextpdf.text.pdf.PdfCopy copy = new com.itextpdf.text.pdf.PdfSmartCopy(document, new FileOutputStream("c:\pdf_issue\bad_itext3.pdf"));
com.itextpdf.text.pdf.PdfReader reader=new com.itextpdf.text.pdf.PdfReader("c:\pdf_issue\bad1.pdf");
// loop over the pages in that document
n = reader.getNumberOfPages();
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(reader, ++page));
}
copy.freeReader(reader);
reader.close();
但是我在 getPageReference 中收到空指针异常?有什么问题?
Exception in thread "main" java.lang.NullPointerException
at com.itextpdf.text.pdf.PdfWriter.getPageReference(PdfWriter.java:1025)
at com.itextpdf.text.pdf.PdfWriter.getCurrentPage(PdfWriter.java:1043)
at com.itextpdf.text.pdf.PdfCopy.addPage(PdfCopy.java:356)
at com.jci.util.PdfTest.main(PdfTest.java:627)
但是如果我使用一个新的文档对象,即不添加业务内容,这篇文章会很好用。
我们在已关闭的问题跟踪器中遇到了类似的问题。在那张票中,似乎需要在创建 PdfCopy
实例后立即打开 Document
。
在您的案例中,我们看到了类似的问题:您使用 Document
对象从头开始创建 PDF,然后您使用 相同的 Document
创建现有 PDF 的副本。这永远行不通:您需要先关闭您从头开始创建的文档,然后为复制过程创建一个新的 Document
:
// first create the document
Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
document.open();
addHTML(document, htmlStringToBeAdded);
document.close();
// Now you can use the document you've just created
PdfReader reader = new PdfReader(baos.toArray());
PdfReader existing = new PdfReader("c:\pdf_issue\bad1.pdf");
document = new Document();
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream("c:\pdf_issue\bad_itext3.pdf"));
document.open();
copy.addDocument(reader);
copy.addDocument(existing);
document.close();
reader.close();
existing.close();