2011-01-28 42 views
2

我有一个现成的PDF,我需要修改SetBoxSize的trimbox,bleedbox并使用setPDFXConformance。有没有办法做到这一点?如何用itextsharp修改pdf文件的trimbox

我试着stamper.Writer,但它并不关心什么,我设置有

2011.02.01。
我们已经使用Acrobat Pro对其进行了测试,并且表示trimbox未定义。看起来,该印记的作者的方法/属性不会影响最终的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(); 

因为盒是不可见的,我试图修改与作家的页面大小,但它还是不执行任何操作。

回答

2

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.PDFXConformanceWriter的另一个方面,它只在生成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()); 

祝你好运。

+0

我已更新我的问题 – SteMa 2011-02-01 09:25:48