SetPDFXConformance
不会将“普通”PDF转换为PDF/X pdf。 SetPDFXConformance
实际上只是用于生成文档,导致iText抛出一个异常,如果你做了一些明显的规范。 “它不关心我在那里设置的东西”。修剪和流血框不是在Reader中可以看到的东西。你如何测试它们?
您可以发布一些代码,并链接到您的输出PDF?
啊。你正在使用stamper.Writer。在这种情况下,这样做效果不佳。所有页面级别,通过PdfStamper支持的操作都会将页码或页面的PdfDictionary作为参数。 SetBoxSize只需要一个字符串&一个矩形,所以这是你的线索。
将“引擎盖下”放在原位,实际上是默认返回到PdfWriter.setBoxSize ...,它仅用于创建PDF,不会修改现有页面。
因此:您需要使用低级PDF对象进行所需的更改。无Problemo:
for (int i = 1; i <= myReader.getNumberOfPages(); ++i) {
PdfDictionary pageDict = myREADER_YES_READER.getPageN(i);
PdfRectangle newBox = new PdfRectangle(20, 20, 100, 100);
pageDict.put(PdfName.TRIMBOX, newBox);
newBox = new PdfRectangle(PageSize.A4);
pageDict.put(PdfName.MEDIABOX, newBox);
}
/* drawing */
stamper.close();
至于PDFX32002一致性,我认为你将不得不去的代码跳水找出需要的到底是什么。 Writer.PDFXConformance
是Writer
的另一个方面,它只在生成PDF时才起作用,不会修改现有的PDF。
好消息是PdfXConformanceImp是一个公共类。坏消息是,它唯一的内部使用PdfWriter和PdfContentByte ...嘿。你现在的代码在行为上有一些变化(只是不够)。具体而言,如果您尝试在PdfContentByte中不允许的内容,您将得到一个PdfXConformanceException,其中包含描述您违反的限制的消息。试图添加一个可选的内容组(层)会引发例如。
啊。这并不坏。也许。试试这个:
PDFXConformanceImp pdfx = new PDFXConformanceImp();
pdfx.setConformance(PdfWriter.PDFX32002);
pdfx.commpleteInfoDictionary(stamper.Writer.getInfo());
pdfx.completeExtraCatalog(stamper.Writer.getExtraCatalog());
stamper.close();
如果删除stamper.Writer.PDFXConformance = PdfWriter.PDFX32002;
,当你做的东西在你的contentByte故宫,你不会得到例外。除此之外,我认为这不重要。
嗯..这不是完整的解决方案。extraCatalog的OutputIntents也被合并到主目录中。也许这将工作:
//replace the completeExtraCatalog call above with this
pdfx.completeExtraCatalog(myReader.getCatalog());
祝你好运。
我已更新我的问题 – SteMa 2011-02-01 09:25:48