升级到iTextSharp v5.5.8后+无效pdf

升级到iTextSharp v5.5.8后+无效pdf,itext,Itext,我正在开发一个C应用程序,它通过打开一个模板并添加文本和表格来创建报表。 这在iTextSharp v5.5.6中运行良好 因为我需要对要升级到最新版本的代码进行一些调整:v5.5.13 pdf仍在创建中。我在pdfJS中查看它没有问题,但是在下载并在AdobeAcrobatReader中打开它之后,我得到了一个关于文档中不正确内容的错误。文档仍然正确显示 在中验证PDF时,我得到以下结果: Compliance pdf1.7 Result Document does not conform

我正在开发一个C应用程序,它通过打开一个模板并添加文本和表格来创建报表。 这在iTextSharp v5.5.6中运行良好

因为我需要对要升级到最新版本的代码进行一些调整:v5.5.13

pdf仍在创建中。我在pdfJS中查看它没有问题,但是在下载并在AdobeAcrobatReader中打开它之后,我得到了一个关于文档中不正确内容的错误。文档仍然正确显示

在中验证PDF时,我得到以下结果:

Compliance  pdf1.7
Result  Document does not conform to PDF/A.
Details Validating file "foo.pdf" for conformance level pdf1.7
The name Xf1 of a xobject resource is unknown.
The document does not conform to the requested standard.
The document doesn't conform to the PDF reference (missing required entries, wrong value types, etc.).
The document's meta data is either missing or inconsistent or corrupt.
The document does not conform to the PDF 1.7 standard.
使用v5.5.6创建的pdf返回:

Compliance  pdf1.7
Result  Document validated successfully.
Details Validating file "foo.pdf" for conformance level pdf1.7
The document does conform to the PDF 1.7 standard.
我尝试了v5.5.6和v5.5.13之间的所有版本,从v5.5.8开始,我遇到了这个错误

很可能我需要调整代码,但我不确定如何调整。我确实检查了变更日志,但找不到与此错误相关的任何内容

下面是一些代码:

var ms = new MemoryStream();
var document = new Document();
var writer = PdfWriter.GetInstance(document, ms);
writer.PageEvent = new MyPageEventHandler();
document.Open();

writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_7);
writer.PdfVersion = PdfWriter.VERSION_1_7;
writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
writer.SetFullCompression();

document.SetMargins(33, 33, 35, 55);
document.AddTitle(title);
document.AddAuthor("foo");
document.AddSubject(subject);
document.AddAuthor("bar");
document.AddCreationDate();
document.AddProducer();
document.AddLanguage("NL");
document.AddCreator("fooMore");

// Add some text and table data
---
writer.CloseStream = false;
document.Close();
ms.Position = 0;
return ms;

我建议使用PdfAWriter类使用iText 5创建PdfA文档。 此类已经涵盖了PDF/a标准强制执行的一些需求。如果某个需求没有得到满足,它还会生成一个异常

    public void createPdf(String dest) throws IOException, DocumentException {
        Font font = new Font(BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 10);
        Document document = new com.itextpdf.text.Document(PageSize.A4,
                MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM);
        PdfAWriter writer = PdfAWriter.getInstance(document,
                new FileOutputStream(DEST), PdfAConformanceLevel.PDF_A_1A);
        document.addAuthor("Author");
        document.addSubject("Subject");
        document.addLanguage("nl-nl");
        document.addCreationDate();
        document.addCreator("Creator");
        document.addTitle("title");
        writer.setTagged();
        writer.createXmpMetadata();
        document.open();
        File file = new File("resources/data/sRGB_CS_profile.icm");
        ICC_Profile icc = ICC_Profile
                .getInstance(new FileInputStream(file));
        writer.setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc);
        Paragraph element = new Paragraph("Hello World", font);
        document.add(element);
        Image logoImage = Image.getInstance(LOGO);
        logoImage.setAccessibleAttribute(PdfName.ALT, new PdfString("Logo"));
        document.add(logoImage);
        document.close();
    }
通过在com.itextpdf.itext-pdfa上添加依赖项,可以将PdfAWriter类添加到应用程序中

<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-pdfa -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-pdfa</artifactId>
    <version>5.5.13</version>
    <scope>test</scope>
</dependency>

来源:

首先要感谢@KevinWillems的PDF/A建议。 我很快就会看一看

但与此同时,我解决了自己的问题。在本文中,我将所有代码都放在一个方法中,但实际上,我有几个方法被调用。其中之一是设置边距和元数据。在这个方法中,我还调用了document.open;。v5.5.8之前的版本在此基础上没有中断,但较新的版本会中断。可能是因为文档打开了两次,只有一个被关闭/释放。
移除第二个文档后。打开;Acrobat Reader不再抱怨,验证也已过去。

请与本期分享PDF样本,以供分析。接下来可能会有一些特定代码部分的请求。