2011-01-28 47 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