私はitextsharpで自分のPDF文書にページ番号を書き込もうとしています。 例hereに従ってきました。この答えは、this implementation in C#の方向に私を指しています。PdfStamperは常にA4の寸法を仮定します
ここでは、ページの向きをA4とすると、すべて正常に動作します。私の場合はそうではありません。私はランドスケープA3のページを使用しています。ページ番号をうまく配置したいので、私が作業しているページの寸法が必要です。
stamper.GetOverContent().PdfDocument.PageSize
は常にA4ページの寸法を返すようです。
矩形:1191x842(腐敗:90度)
RectangleReadOnly:595x842(腐敗:0度)
using (var ms = new MemoryStream()) { using (var doc = new Document(PageSize.A3.Rotate())) { Debug.WriteLine(doc.PageSize); var writer = PdfWriter.GetInstance(doc, ms); doc.Open(); doc.Add(new Paragraph("Hello!")); } byte[] firstPass = ms.ToArray(); PdfReader reader = new PdfReader(firstPass); using (var fs = new FileStream("out2.pdf", FileMode.Create, FileAccess.Write, FileShare.None)) { using (PdfStamper stamper = new PdfStamper(reader, fs)) { int totalPages = reader.NumberOfPages; for (var i = 1; i <= totalPages; i++) { var under = stamper.GetUnderContent(i); var over = stamper.GetOverContent(i); Debug.WriteLine(under.PdfDocument.PageSize); Debug.WriteLine(over.PdfDocument.PageSize); } } } }
となっている出力:ここ
は再現例です。 RectangleReadOnly:595x842(腐敗:0度)
どうすればPdfStamper
のドキュメントのページサイズを取得できますか?
iTextSharpでページ番号を生成することについては、ではなく、です。さまざまな回避策があります。この質問は、特に文書の正しい寸法をPdfStamper
で読むことに関するものです。これはマージンを含めフルページ・サイズが、あることを
var pageSize = reader.GetPageSizeWithRotation(i);
注:
'PdfStamper'ページの' PdfContentByte'の 'PdfDocument'インスタンスを取得する理由はありません。それを公開することで、人々はそれを使うことができると思うので、私たちはそのオブジェクトを公開してはいけません。 iTextの最初のバージョン(私は独学の開発者だったので、私は2000年にiTextの最初のバージョンをリリースしました;私は当時のコードを見るとまだ気分が悪いです)。 2016年に、私たちはついにiTextを一から書き直す手段を得ました。 iText 7のような設計上のエラーは表示されません(コードを将来的に証明したい場合に使用してください)。 –
古い(7.0より前の)APIでiTextを使用しています。そのAPIは、時には激しく成長し、奇妙な結果をもたらしました。 'PdfDocument'の' PageSize'は、そのクラスが純粋な 'PdfWriter'を使ってゼロからPDFを作成するために使われるときだけ意味を持ちます。 'PdfStamper'ユースケースでは、それは興味のないデフォルト値を含んでいます。 – mkl
@BrunoLowagieさて、私はちょっと馬鹿だと感じました - iText7がiTextSharpとは別のNuGetパッケージであることは実際にはわかりませんでした。今見てみましょう。はるかに良い感じ。先端のための乾杯 – Rob