PdfCopy和PdfACopy之间的iText差异

时间:2018-03-29 10:25:42

标签: java pdf itext pdf-generation pdfa

我编写了一个函数,使用iText 5.5.13(使用iText tutorials中的指令)将文件作为附件嵌入到PDF / A-3a文档中。

如果我使用PdfCopy类附加文件,结果是一个正确的PDF文件,但它并不声称是PDF / A(可能它符合所有要求,但它没有说明。)

如果我使用PdfACopy做同样的事情,我会得到一个错误构建的文档:

  

InvalidPdfException:重建失败:找不到预告片。原版的   消息:未找到PDF startxref。

这是我的代码有点简化。注释是使用PdfCopy的行。

public static File embedFile(File inputPdf) {

    File outputPdf = new File("./test.pdf");

    PdfReader reader = new PdfReader(inputPdf.getAbsolutePath());
    Document document = new com.itextpdf.text.Document();
    OutputStream os = new FileOutputStream(outputPdf.getAbsolutePath());
    PdfACopy copy = new PdfACopy(document, os, PdfAConformanceLevel.PDF_A_3A); // Output doc doesn't work
    // PdfCopy copy = new PdfCopy(document, os); // Output doc works but doesn't claim to be PDF/A

    document.open();
    copy.addDocument(reader);

    // Include attachment (extactly as in the sample tutorial)
    PdfDictionary parameters = new PdfDictionary();
    parameters.put(PdfName.MODDATE, new PdfDate());
    PdfFileSpecification fileSpec = PdfFileSpecification.fileEmbedded(
        writer, "./src/main/resources/com/itextpdf/invoice.xml",
        "invoice.xml", null, "application/xml", parameters, 0);
    fileSpec.put(new PdfName("AFRelationship"), new PdfName("Data"));
    writer.addFileAttachment("invoice.xml", fileSpec);
    PdfArray array = new PdfArray();
    array.add(fileSpec.getReference());
    writer.getExtraCatalog().put(new PdfName("AF"), array);

    os.flush();
    reader.close();
    document.close();
    os.close();
    copy.close();

    return outputPdf;
}

输入文件已经是PDF / A-3a文档了,所以我想我不需要重新定义所有必需的东西,比如嵌入字体,输出意图......

在使用PdfCopy不需要的PdfACopy时,是否可能缺少必需的步骤?

尝试使用iText 7会有帮助吗?

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

正如Bruno Lowagie在评论中指出的那样,这可以通过iText 7实现。这里的功能可以帮助某人:

Handler handler = new Handler();

handler.post(new Runnable() {
    public void run() {
         txtMessage.setText("Seizure Detected!!!");
                                txtMessage.setTextColor(getResources().getColor(android.R.color.holo_red_dark));
    }
});