- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将文件附加到现有的 PDF/A-3。
这example解释了如何创建 PDF/A-3 并将内容附加到它。
我的下一步是调整代码并使用 PdfAStamper 代替文档。
这是我的结果代码。
private ByteArrayOutputStream append(byte[] content, InputStream inPdf) throws IOException, DocumentException {
ByteArrayOutputStream result = new ByteArrayOutputStream(16000);
PdfReader reader = new PdfReader(inPdf);
PdfAStamper stamper = new PdfAStamper(reader, result, PdfAConformanceLevel.PDF_A_3B);
stamper.createXmpMetadata();
// Creating PDF/A-3 compliant attachment.
PdfDictionary embeddedFileParams = new PdfDictionary();
embeddedFileParams.put(PARAMS, new PdfName(ZF_NAME));
embeddedFileParams.put(MODDATE, new PdfDate());
PdfFileSpecification fs = PdfFileSpecification.fileEmbedded(stamper.getWriter(), null,ZF_NAME, content , "text/xml", embeddedFileParams,0);
fs.put(AFRELATIONSHIP, Alternative);
stamper.addFileAttachment("file description",fs);
stamper.close();
reader.close();
return result;
}
这是错误的堆栈跟踪。
com.itextpdf.text.pdf.PdfAConformanceException: EF key of the file specification dictionary for an embedded file shall contain dictionary with valid F key.
at com.itextpdf.text.pdf.internal.PdfA3Checker.checkFileSpec(PdfA3Checker.java:95)
at com.itextpdf.text.pdf.internal.PdfAChecker.checkPdfAConformance(PdfAChecker.java:198)
at com.itextpdf.text.pdf.internal.PdfAConformanceImp.checkPdfIsoConformance(PdfAConformanceImp.java:70)
at com.itextpdf.text.pdf.PdfWriter.checkPdfIsoConformance(PdfWriter.java:3380)
at com.itextpdf.text.pdf.PdfWriter.checkPdfIsoConformance(PdfWriter.java:3376)
at com.itextpdf.text.pdf.PdfFileSpecification.toPdf(PdfFileSpecification.java:309)
at com.itextpdf.text.pdf.PdfIndirectObject.writeTo(PdfIndirectObject.java:157)
at com.itextpdf.text.pdf.PdfWriter$PdfBody.write(PdfWriter.java:424)
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:402)
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:381)
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:334)
at com.itextpdf.text.pdf.PdfWriter.addToBody(PdfWriter.java:819)
at com.itextpdf.text.pdf.PdfFileSpecification.getReference(PdfFileSpecification.java:256)
at com.itextpdf.text.pdf.PdfDocument.addFileAttachment(PdfDocument.java:2253)
at com.itextpdf.text.pdf.PdfWriter.addFileAttachment(PdfWriter.java:1714)
at com.itextpdf.text.pdf.PdfStamper.addFileAttachment(PdfStamper.java:497)
现在,当我尝试分析 Stacktrace 并查看PdfFileSpecification.fileEmbedded
我看到使用 F 和 UF 条目创建了一个 EF。
查看 PdfA3Checker
我看到那行 PdfDictionary embeddedFile = getDirectDictionary(dict.get(PdfName.F));
不是一个目录而是一个 strem。
if (fileSpec.contains(PdfName.EF)) {
PdfDictionary dict = getDirectDictionary(fileSpec.get(PdfName.EF));
if (dict == null || !dict.contains(PdfName.F)) {
throw new PdfAConformanceException(obj1, MessageLocalization.getComposedMessage("ef.key.of.file.specification.dictionary.shall.contain.dictionary.with.valid.f.key"));
}
PdfDictionary embeddedFile = getDirectDictionary(dict.get(PdfName.F));
if (embeddedFile == null) {
throw new PdfAConformanceException(obj1, MessageLocalization.getComposedMessage("ef.key.of.file.specification.dictionary.shall.contain.dictionary.with.valid.f.key"));
}
checkEmbeddedFile(embeddedFile);
}
这是 iText 中的错误还是我遗漏了什么?顺便说一下,我使用的是 iText 5.4.5。
更新 1
正如布鲁诺建议的那样 mkl 4.5.6-Snapshot 应该包含修复。我尝试了我的测试用例 Gist link to full test case针对当前主干。但是结果还是一样的错误。
最佳答案
您遇到的错误与 Creating PDF/A-3: Embedded file shall contain valid Params key 中的错误非常相似:
问题(如您所见)出在这段代码中
PdfDictionary embeddedFile = getDirectDictionary(dict.get(PdfName.F));
if (embeddedFile == null) {
throw new PdfAConformanceException(obj1, MessageLocalization.getComposedMessage("ef.key.of.file.specification.dictionary.shall.contain.dictionary.with.valid.f.key"));
}
在 PdfA3Checker.checkFileSpec(PdfWriter, int, Object);即使 dict
包含名为 F 的流,getDirectDictionary(dict.get(PdfName.F))
也不会返回它。原因不是,虽然,在这里寻找字典(流本质上是一个带有一些附加的字典),但它是 PdfAChecker.getDirectObject
中的一个问题,它被 PdfAChecker 调用。 getDirectDictionary
:
protected PdfObject getDirectObject(PdfObject obj) {
if (obj == null)
return null;
//use counter to prevent indirect reference cycling
int count = 0;
while (obj.type() == 0) {
PdfObject tmp = cachedObjects.get(new RefKey((PdfIndirectReference)obj));
if (tmp == null)
break;
obj = tmp;
//10 - is max allowed reference chain
if (count++ > 10)
break;
}
return obj;
}
此方法仅查找缓存对象(即在 cachedObjects
中)但在您的情况下(以及我的测试)此流已经写入文件并且不再在缓存中在返回的 null
中...更正,请参阅 PPS:它已被写入,但它一开始就未被缓存。
PS:如果在 PDF 创建期间添加符合 PDF/A-3 标准的文件附件(使用 PdfAWriter
),但如果在 PDF 操作期间添加(使用 PdfAStamper
)则无效);也许在这些用例中缓存是不同的。
PPS:确实存在差异:PdfAWriter
通过将添加的对象添加到缓存来覆盖 addToBody
重载。 PdfAStamperImp
不这样做,而且派生自 PdfStamperImp
和 PdfWriter
,而不是派生自 PdfAWriter
。
关于java - iText 将文件附加到现有 PDF/A-3 导致 PdfAConformanceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665780/
我正在尝试将文件附加到现有的 PDF/A-3。 这example解释了如何创建 PDF/A-3 并将内容附加到它。 我的下一步是调整代码并使用 PdfAStamper 代替文档。 这是我的结果代码。
我想使用 iText 7(实际上是 7.0.7)创建带有表单字段的 PDF/A-3 文件。 我检查了示例和跳转教程来执行此操作。 将表单字段添加到 here 后如图所示here ,我收到以下错误: E
我是一名优秀的程序员,十分优秀!