6

iTextSharpを使用して既存のPDFファイルにテキストを追加したいのですが、さまざまな方法を見つけましたが、それらすべてでライターとリーダーは別々のpdfファイルです。PDFを開いて、さまざまな位置にさまざまなものを書き込むことができる方法が必要です。今私はこのコードを持っていますが、それは新しいファイルを作ります。

using (FileStream stream1 = File.Open(path, FileMode.OpenOrCreate))
      {
      BaseFont bf = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      PdfReader reader = new PdfReader("C:\\26178DATA\\pdf\\holding.pdf");
      var pageSize = reader.GetPageSize(1);
      PdfStamper stamper = new PdfStamper(reader, stream1);
      iTextSharp.text.Font tmpFont = new iTextSharp.text.Font(bf, fontSize);
      PdfContentByte canvas = stamper.GetOverContent(1);
      Phrase ph = new Phrase(words[1], tmpFont);
      ph.Font = tmpFont;
      canvas.SetFontAndSize(bf, fontSize);
      ColumnText.ShowTextAligned(canvas, Element.ALIGN_LEFT, ph, iTextSharp.text.Utilities.MillimetersToPoints(x * 10), pageSize.GetTop(iTextSharp.text.Utilities.MillimetersToPoints(y * 10)), 0);
      stamper.Close();
            }
4

1 に答える 1

4

iTextSharpを使用して既存のPDFファイルにテキストを追加したい場合、さまざまな方法が見つかりましたが、それらすべてで、ライターとリーダーは別々のpdfファイルです。

iText(Sharp)がPdfStamperを使用してPDFを操作する通常の方法では、既存のPDF要素の大幅な再編成が必要になる可能性があるため、iTextはその場でファイルを編集しません。もう1つの方法は、追加モードを使用して、その場で編集できるようにすることです。しかし、そのようなオプションは実装されていません。インプレース編集の大きな欠点は、プログラムに障害が発生した場合に、問題のファイルが中間の使用できない状態のままになる可能性があることです。

そうは言っても、最初にファイルをメモリに完全に読み込んでから、同じパスで出力の作成を開始することにより、新しいファイルを元のファイルのパスに保存できます。出力ストリームの作成前に少なくともPdfReaderコンストラクターの使用を移動することを意味するサンプルコードの場合:

PdfReader reader = new PdfReader(path);
using (FileStream stream1 = File.Open(path, FileMode.OpenOrCreate))
{
    BaseFont bf = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    ...

または、結果ファイルをメモリ内、つまりFileStreamではなくMemoryStream内に作成し、終了したら、メモリストリームの内容をソースファイルパスに書き込むこともできます。

于 2013-02-01T07:14:21.730 に答える