事前に作成されたPDFドキュメントのフォームフィールドに入力したいのですが、実行中にAcroFormでNullRefrenceエラーが発生します。
_ string fileN4 = TextBox1.Text + " LOG.pdf";
File.Copy(Path.Combine(textBox4.Text + "\\", fileN4),
Path.Combine(Directory.GetCurrentDirectory(), fileN4), true);
// Open the file
PdfDocument document = PdfReader.Open(fileN4, PdfDocumentOpenMode.Modify);
PdfTextField currentField = (PdfTextField)(document.AcroForm.Fields["<CASENUM>"]);
//const
string caseName = TextBox1.Text;
PdfString caseNamePdfStr = new PdfString(caseName);
//set the value of this field
currentField.Value = caseNamePdfStr;
// Save the document...
document.Save(fileN4);
_
したがって、PdfTextField currentField = (PdfTextField)(document.AcroForm.Fields["<CASENUM>"]);
はエラーが発生する場所です。 AcroFormがフィールドを認識していないことは明らかです。
別のオプションは、PDF(ライセンスのために使用できないため、itexsharpを使用しない)のテキストを検索して置換することです。
どんな助けでも素晴らしいでしょう!
PDFフォームフィールドにデータを入力する場合にも、これが必要です。NeedsAppearances要素をtrueに設定する必要もあります。それ以外の場合、PDFは「非表示」になります」フォームの値。これがVBコードです。
If objPdfSharpDocument.AcroForm.Elements.ContainsKey("/NeedAppearances") = False Then
objPdfSharpDocument.AcroForm.Elements.Add("/NeedAppearances", New PdfSharp.Pdf.PdfBoolean(True))
Else
objPdfSharpDocument.AcroForm.Elements("/NeedAppearances") = New PdfSharp.Pdf.PdfBoolean(True)
End If
私は今日これに取り組んでおり、実用的なソリューションを作成することができました。以下に作業コードを貼り付けました。私のコードとOPの間に見られる唯一の本当の違いは次のとおりです。
うまくいけば、これは同じことをしようとしている誰かに役立つでしょう。
string templateDocPath = Server.MapPath("~/Documents/MyTemplate.pdf");
PdfDocument myTemplate = PdfReader.Open(templateDocPath, PdfDocumentOpenMode.Modify);
PdfAcroForm form = myTemplate.AcroForm;
if (form.Elements.ContainsKey("/NeedAppearances"))
{
form.Elements["/NeedAppearances"] = new PdfSharp.Pdf.PdfBoolean(true);
}
else
{
form.Elements.Add("/NeedAppearances", new PdfSharp.Pdf.PdfBoolean(true));
}
PdfTextField testField = (PdfTextField)(form.Fields["TestField"]);
testField.Text = "012345";
myTemplate.Save(Server.MapPath("~/Documents/Amended.pdf")); // Save to new file.
私はちょうどこれに似た何かを経験しました。私が開いた最初のPDFファイルにはアクロフォームデータが含まれていなかったため、上記のようにnull例外が発生しました。問題はPDFを開くことではなく、nullの値を持つAcroformメンバー変数への参照にあります。次のコード例を使用してPDFをテストできます。
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
PdfDocument _document = null;
try
{
_document = PdfReader.Open(ofd.FileName, PdfDocumentOpenMode.Modify);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message,"FATAL");
//do any cleanup and return
return;
}
if (_document != null)
{
if (_document.AcroForm != null)
{
MessageBox.Show("Acroform is object","SUCCEEDED");
//pass acroform to some function for processing
_document.Save(@"C:\temp\newcopy.pdf");
}
else
{
MessageBox.Show("Acroform is null","FAILED");
}
}
else
{
MessageBox.Show("Uknown error opening document","FAILED");
}
}
[〜#〜]補遺[〜#〜]
また、このコード行のキーに山かっこを含めるべきではないことに気づきました
document.AcroForm.Fields["<CASENUM>"]
に変更します
document.AcroForm.Fields["CASENUM"]
私は今日、この同じ問題で立ち往生しました。ただし、ソースコードが更新されていると思うので、上記の方法を試してみると、NullExceptionErrorが発生します。代わりに、TextFieldの場合、PdfStringを生成し、.textの代わりにtestfield.Valueを使用する必要があります。これが例です。
static PdfAccess()
{
Pdf.PdfDocument doc = Pdf.IO.PdfReader.Open(@"C:\...\ Contract.pdf", Pdf.IO.PdfDocumentOpenMode.Modify);
Pdf.AcroForms.PdfAcroForm form = doc.AcroForm;
if (form.Elements.ContainsKey("/NeedAppearances"))
{
form.Elements["/NeedAppearances"] = new PdfSharp.Pdf.PdfBoolean(true);
}
else
{
form.Elements.Add("/NeedAppearances", new PdfSharp.Pdf.PdfBoolean(true));
}
var name = (Pdf.AcroForms.PdfTextField)(form.Fields["Email"]);
name.Value = new Pdf.PdfString("ramiboy");
doc.Save(@"C:\...\ Contract.pdf");
doc.Close();
NullReferenceException
を克服するための解決策は、AdobeAcrobatで既成のPDFを開き、プロパティタイプを別のものに変更することにより、フォームフィールドにデフォルト値を与えることです。 null
より。
現在のディレクトリを開こうとしたときに、現在のディレクトリを配置しようとしましたか?
変化する
PdfDocument document = PdfReader.Open(fileN4, PdfDocumentOpenMode.Modify);
に
PdfDocument document = PdfReader.Open(Path.Combine(Directory.GetCurrentDirectory(), fileN4), PdfDocumentOpenMode.Modify);
PDFの作成には [〜#〜] aspose [〜#〜] のみを使用しますが、PdfReaderには完全なファイルパスが必要になると確信しています。