0

PDF のフィールドを Adob​​e Life Cycle で作成されたフォームとマージする方法を実装する必要があります。テンプレート PDF と XML を受け取って PDF にデータを入力し、新しく入力されたファイルを返す必要があります。xml は次のようなものです。

 <?xml version="1.0" encoding="UTF-8"?>
<form1>
    <ReportDescription>
      <body xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
              <p><span style="font:Arial bold 12px">Name of the document</span></p>
          </body>
    </ReportDescription>
    <ReportCode>XX-000</ReportCode>
   <Contents>
      <UserData>
              <UserName>Ego ille</UserName>
              <UserPhone>Si manu vacuas</UserPhone>
              <UserNIF>999999999</UserNIF>
      </UserData>
   </Contents>
</form1>

だから、私は次のようなものを持っています:

private MemoryStream GeneratePDF(string m_FormName, XmlDocument oData)
        {
            PdfReader pdfTemplate;
            PdfStamper stamper;
            PdfReader tempPDF;
            Document doc;
            MemoryStream msTemp;
            PdfWriter pCopy;
            MemoryStream msOutput = new MemoryStream();

            pdfTemplate = new PdfReader(m_FormName);

            doc = new Document();
            pCopy = new PdfCopy(doc, msOutput);

            pCopy.AddViewerPreference(PdfName.PICKTRAYBYPDFSIZE, new PdfBoolean(true));
            pCopy.AddViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);

            doc.Open();

            for (int i = 1; i < pdfTemplate.NumberOfPages + 1; i++)
            {
                msTemp = new MemoryStream();
                pdfTemplate = new PdfReader(m_FormName);

                stamper = new PdfStamper(pdfTemplate, msTemp);

                // map xml values to pdf form controls (element name = control name)
                foreach (XmlElement oElem in oData.SelectNodes("/form1/*"))
                {
                    stamper.AcroFields.SetField(oElem.Name, oElem.InnerText);
                }

                stamper.FormFlattening = true;
                stamper.Close();
                tempPDF = new PdfReader(msTemp.ToArray());
                ((PdfCopy)pCopy).AddPage(pCopy.GetImportedPage(tempPDF, i));
                pCopy.FreeReader(tempPDF);

            }
            doc.Close();

            return msOutput;
        }
4

1 に答える 1

0

あなたの質問はやや誤解を招くものです。Adobe LiveCycle を使用して作成されたフォームの結合について話しています。ただし、コードを見ると、実際には通常の PDF をマージしようとしていることがわかります。説明させてください。

Adobe LiveCycle を使用して作成されたフォームは、2 種類の PDF ファイルになります。

  1. PDF 構文 (AcroForm テクノロジー) と XML (XML Forms Architecture、別名 XFA) のフォームを含むハイブリッド PDF ファイル。
  2. XML のコンテナーに過ぎない PDF ファイル。

ハイブリッド PDF ファイルは、コア iText ライブラリを使用して入力できます。これは私の本の第8章で説明されています。このようなフォームをフラット化すると、XML が破棄され、PDF 構文が保持されます。その瞬間から、通常の PDF ファイルがあります。

純粋な XFA フォームはXFA Workerで入力できます。XFA Worker は、iText の上に構築されたクローズド ソース製品です。PDF コンテナー内の XML を解析し、そのような PDF を通常の PDF に変換します。

あなたの質問からは、どのタイプの Adob​​e LiveCycle Form について話しているのか明確ではありませんが、それについて質問を投稿しているので、問題が発生していると想定しても安全です。コードを見ると、ハイブリッド フォームを扱っていると仮定しています。そのコードが機能しない場合は、フォームが純粋な XFA フォームであると仮定できます。

フォームへの入力とフラット化に成功したら、実際に を使用できますが、PdfCopyフォームの性質によっては を使用することを好む場合もありますPdfSmartCopy(同じテンプレートの異なるインスタンスをマージしていると仮定して)。

この答えは、多くの仮定に基づいています。これは反対票とコメントを説明しています。

たとえば、2 つの XFA フォームを (XML 構文の 2 つの PDF コンテナーという意味で) マージすることを本当に求めているとします。その場合、その質問には答えられません。フラット化されたフォームのみをマージできます。

于 2013-12-26T08:34:30.040 に答える