我正在开发一个C#应用程序,该应用程序通过打开模板并添加文本和表来创建报告。这在iTextSharp v.5.6 中运行良好
因为我需要对代码进行一些调整,所以我想升级到最新版本:v5.1.13
pdf仍在创建中。我在pdfJS中查看它没有问题,但在下载并在Adobe Acrobat Reader中打开它后,我在文档中发现了一个错误。文档仍然正确显示。
当我在中验证PDF时https://www.pdf-online.com/osa/validate.aspx我得到这个结果:
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.
使用v.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.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>
来源:iText 5 Pdf/A1 示例
首先感谢@KevinWillems的PDF/A建议。我很快就会看一看。
但与此同时,我解决了自己的问题。在这篇文章中,我在一个方法中有所有代码,但实际上,我有几个方法被调用。其中之一是设置边距和元数据。在这个方法中,我也称为document.open();
。v.5.8之前的版本没有打破这一点,但更新的版本打破了这一点。可能是因为文档被打开了两次,只有一次被关闭/释放。在移除第二个document.open();
Acrobat阅读器后,没有长时间的抱怨和验证也过去了。