1

2 つのタグ付き 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多分誰かがこれを調べるべきです

PdfCopyfixTaggedStructureタグ付けされたページをコピーすることにより、多少文字化けしているタグ付けされた構造を修正しようとする方法があります。現在の 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このコードは、 を実行することにより、その辞書にキーのエントリがあることを暗黙的に想定しdictていpg.equals(currPage)ます。残念ながら、そのエントリはオプションです。たとえば、OP によって提供されるサンプル ドキュメントには、 Pgエントリのない配列から参照されるStructElem辞書が含まれています。これにより、問題の NPE が発生します。

この場合、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 に答える