我有一个现成的PDF,我需要使用SetBoxSize修改trimbox,bleedbox并使用setPDFXConformance。有没有办法做到这一点?
我尝试过压模。写作,但它并不关心我在那里设置的内容
2011.02.01。
我们用Acrobat Pro对它进行了测试,并说它没有定义修剪盒。看来压模的作者的方法/属性不会影响最终的pdf。以下是源文件和结果文件:http://stemaweb.hu/pdfs.zip
我的代码:
PdfReader reader = new PdfReader(@"c:\source.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileStream(@"c:\result.pdf", FileMode.Create));
stamper.Writer.SetPageSize(PageSize.A4);
stamper.Writer.PDFXConformance = PdfWriter.PDFX32002;
stamper.Writer.SetBoxSize("trim", new iTextSharp.text.Rectangle(20, 20, 100, 100));
PdfContentByte cb = stamper.GetOverContent(1);
/*drawing*/
stamper.Close();
因为这些框不可见,所以我尝试用编辑器修改pagesize,但是也没有做任何事情。
答案 0 :(得分:2)
SetPDFXConformance
不会将“普通”PDF转换为PDF / X pdf。 SetPDFXConformance
实际上只是用于文档生成,如果你公然违反规范,会导致iText抛出异常。
“它并不关心我在那里设置的东西”。在阅读器中,您无法直观地看到修剪和出血盒。你是如何测试它们的?
您可以发布一些代码,以及指向输出PDF的链接吗?
阿。你正在使用压模.Writer。在这种情况下,这不是很好。所有页面级别,通过PdfStamper支持的操作都将使用页码或页面的PdfDictionary作为参数。 SetBoxSize只需要一个字符串&一个矩形,这就是你的线索。
按照“引擎盖”的方式实际上默认为PdfWriter.setBoxSize ...仅用于创建PDF,而不是修改现有页面。
所以:您需要使用低级PDF对象进行所需的更改。没有问题:
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中执行禁止操作时不会出现异常。除此之外,我认为这不重要。
//replace the completeExtraCatalog call above with this
pdfx.completeExtraCatalog(myReader.getCatalog());
祝你好运。