如何使用itextsharp修改pdf文件的trimbox

时间:2011-01-28 15:24:29

标签: c# itextsharp trim

我有一个现成的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,但是也没有做任何事情。

1 个答案:

答案 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.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());

祝你好运。