2011-01-28 39 views
2

私は準備が整えられたPDFを持っていますので、トリムボックス、ブリードボックスをSetBoxSizeで変更し、setPDFXConformanceを使用する必要があります。これを行う方法はありますか?pdfファイルのトリムボックスをitextsharpで変更するには

私はstamper.Writerで試してみたが、それは私が

2011年2月1日が設定したものを気にしません。
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(); 

答えて

2

SetPDFXConformanceは、「通常の」PDFをPDF/Xのpdfに変換しません。 SetPDFXConformanceは実際には文書生成のためのものであり、仕様を外れるとiTextは例外をスローします。

「私が設定したものは気にしない」トリムとブリードボックスは、Readerで目に見えるものではありません。あなたはどうやってそれらをテストしていますか?

いくつかのコードと出力PDFへのリンクを投稿できますか?


ああ。あなたはスタンパーを使用しています.Writer。この場合、それはうまくいかない。すべてのページレベル、PdfStamper経由のよくサポートされるアクションは、ページ番号またはページのPdfDictionaryを引数として取ります。 SetBoxSizeはちょうど文字列&を四角形にしているので、それはあなたの手がかりです。

あなたが行っているように、実際にはデフォルトのPdfWriter.setBoxSize ...は、PDFを作成するためのもので、既存のページは変更しません。

So:低レベルのPDFオブジェクトを使用して、必要な変更を加える必要があります。いいえProblemo:PDFX32002の適合性については

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(); 

、私はあなたが必要とされている正確に何を把握するために、コードのダイビングに行く必要があるとしていると思うん。 Writer.PDFXConformanceは、既存のものを変更せずに、PDFを生成するときにのみ機能するWriterの別の側面です。

良いニュースは、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

関連する問題