1

我正在尝试将两个标记的 PDF 与 iTextPDF 5.4.4 版本的 jar 合并。完成所有操作后关闭文档就行了:document.close();):。它抛出以下错误

java.lang.NullPointerException
PDF Creation Failed java.lang.NullPointerException
[B@1d5c1d5c
at com.itextpdf.text.pdf.PdfCopy.fixTaggedStructure(PdfCopy.java:878)
at com.itextpdf.text.pdf.PdfCopy.flushTaggedObjects(PdfCopy.java:799)
at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:836)
at com.itextpdf.text.Document.close(Document.java:416)
at PDFMerger.mergePDF(PDFMerger.java:189)

请让我知道可能导致此问题的原因。

下面是我使用的代码。

PdfReader reader = new PdfReader(pdf);

boolean setTagged=reader.isTagged() ; 

Document document = new Document();

PdfCopy copy = new PdfCopy(document, new FileOutputStream("Merged.pdf"));

copy.setTagged();

document.open();

int n;
n = reader.getNumberOfPages();
for (int page = 0; page < n; ) {

    copy.addPage(copy.getImportedPage(reader, ++page,true));

}
copy.freeReader(reader);
document.close();
reader.close();
4

2 回答 2

4

这看起来像是当前 iText 版本中的错误。

@Bruno 也许有人应该调查一下

PdfCopy有一种方法fixTaggedStructure试图修复通过复制标记页面而有些乱码的标记结构。直到当前的 iText 5.4.6-SNAPSHOT 包含在内,您都可以找到以下代码

PdfDictionary dict = (PdfDictionary)iobj.object;
PdfIndirectReference pg = (PdfIndirectReference)dict.get(PdfName.PG);
//if pg is real page - do nothing, else set correct pg and remove first MCID if exists
if (!pageReferences.contains(pg) && !pg.equals(currPage)){
    dict.put(PdfName.PG, currPage);
    PdfArray kids = dict.getAsArray(PdfName.K);
    if (kids != null) {
        PdfObject firstKid = kids.getDirectObject(0);
        if (firstKid.isNumber()) kids.remove(0);
    }
}

对于某个数组中的StructElem标记元素dict。此代码通过执行隐式假定该PdfName.PG字典中的键有一个条目。不幸的是,该条目是可选的,例如,OP 提供的示例文档包含从某个没有Pg条目的数组引用的此类StructElem字典。这会导致有问题的 NPE。dictpg.equals(currPage)

在这种情况下,只需更改equals调用中的顺序即可,即代替

if (!pageReferences.contains(pg) && !pg.equals(currPage)){

应该使用

if (!pageReferences.contains(pg) && !currPage.equals(pg)){

或者

if (pg != null && !pageReferences.contains(pg) && !pg.equals(currPage)){

取决于这里的实际程序逻辑。

@Bruno 请检查哪个变体在语义上是正确的;毕竟我并不是很喜欢这种标记结构的东西......

于 2013-12-11T23:00:37.820 回答
0

代码是用 C# 编写的

  public static byte[] mergeTest(byte[] pdf) {
        PdfReader reader = null;
        Document doc = null;
        PdfCopy copy = null;
        MemoryStream stream = new MemoryStream();
        byte[] output = null;

        try {
            reader = new PdfReader(pdf);
            doc = new Document();

            copy = new PdfCopy(doc, stream);
            bool tagged = reader.IsTagged();

            if (tagged)
                copy.SetTagged();


            doc.Open();

            for (int x = 1; x <= reader.NumberOfPages; x++) {
                copy.AddPage(copy.GetImportedPage(reader, x, tagged));
            }

            copy.FreeReader(reader);
            doc.Close();
            copy.Close();

            output = stream.ToArray();

            stream.Flush();
            stream.Dispose();

        } catch (Exception ex) {

        } finally {
            try {
                if (reader != null)
                    reader.Close();
            } catch (Exception) { }
        }
        return output;
    }
于 2013-11-11T12:50:12.117 回答