我正在开发一个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}}
答案 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>
答案 1 :(得分:0)
@KevinWillems对PDF / A建议的第一赞。 我很快会看一下。
但是与此同时,我解决了自己的问题。在本文中,我将所有代码都用一种方法编写,但实际上,我有几种方法可以调用。其中之一是设置边距和元数据。在此方法中,我还调用了document.open();
。 v5.5.8之前的版本对此没有影响,但较新的版本却有影响。可能是因为文档被打开了两次,而只有一个被关闭/释放。
删除第二个document.open();
后,Acrobat Reader不再抱怨,验证也过去了。