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

时间:2018-11-07 11:25:43

标签: itext

我正在开发一个C#应用程序,该应用程序通过打开模板并添加文本和表格来创建报告。 在iTextSharp v5.5.6中可以正常工作

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

仍然创建pdf。我在pdfJS中查看它没有问题,但是在Adobe Acrobat Reader中下载并打开它之后,出现了关于文档中不正确内容的错误。该文档仍然可以正确显示。

当我在https://www.pdf-online.com/osa/validate.aspx中验证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创建的pdf返回:

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;

我尝试了v5.5.6和v5.5.13之间的所有版本,并且从v5.5.8开始,我遇到了此错误。

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

以下是一些代码:

{{1}}

2 个答案:

答案 0 :(得分:1)

我建议使用 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>

来源:iText 5 Pdf/A1 Example

答案 1 :(得分:0)

@KevinWillems对PDF / A建议的第一赞。 我很快会看一下。

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