2

既存の PDF AcroField の単語を別の単語に置き換える必要があります。iTEXTSHARP の PDFStamper を使用して同じことを行っていますが、正常に動作しています。ただし、その際に新しい PDF を作成する必要があり、変更を既存の PDF 自体に反映させたいと考えています。元のファイル名と同じ宛先ファイル名を設定している場合、変更は反映されません。 iTextSharp を初めて使用しますが、間違っていることはありますか? 助けてください..私が使用しているコードを提供しています

  private void ListFieldNames(string s)
    {
        try
        {
            string pdfTemplate = @"z:\TEMP\PDF\PassportApplicationForm_Main_English_V1.0.pdf";
            string newFile = @"z:\TEMP\PDF\PassportApplicationForm_Main_English_V1.0.pdf";
            PdfReader pdfReader = new PdfReader(pdfTemplate);

            for (int page = 1; page <= pdfReader.NumberOfPages; page++)
            {
                PdfReader reader = new PdfReader((string)pdfTemplate);
                using (PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create, FileAccess.ReadWrite)))
                {
                    AcroFields form = stamper.AcroFields;
                    var fieldKeys = form.Fields.Keys;
                    foreach (string fieldKey in fieldKeys)
                    {
                        //Replace Address Form field with my custom data
                        if (fieldKey.Contains("Address"))
                        {
                            form.SetField(fieldKey, s);
                        }    
                    }
                    stamper.FormFlattening = true;
                    stamper.Close();

                }

            }
        }
4

1 に答える 1

5

私の本iText in Actionに記載されているように、ファイルの読み取りと書き込みを同時に行うことはできません。Word の仕組みを考えてみてください。Word 文書を開いて直接書き込むことはできません。Word は常に一時ファイルを作成し、それに変更を書き込み、元のファイルをその一時ファイルに置き換えてから、一時ファイルを破棄します。

あなたもそれを行うことができます:

  • 、で元のファイルを読み取りPdfReaderます
  • の一時ファイルを作成し、PdfStamper完了したら、
  • 元のファイルを一時ファイルに置き換えます。

または:

  • 元のファイルbyte[]
  • これで作成PdfReaderbyte[]
  • の元のファイルへのパスを使用しますPdfStamper

この 2 番目のオプションは、 で例外を引き起こすようなことをすると元のファイルが失われるため、より危険ですPdfStamper

于 2013-04-18T12:13:32.027 に答える