6

ユーザーが入力してサーバーに送信する Web サイトで利用可能な pdf フォーム ファイルがあるとします。サーバー側 (Asp.Net) で、xml 形式で受信したデータを、入力された空の pdf フォームとマージして保存したいと考えています。

私が見つけたように、それを行うにはいくつかの可能な方法があります:

  1. adobe acrobat によって作成された pdf フォームを使用し、itextsharp で埋めます。
  2. adobe acrobat によって作成された pdf フォームを使用し、FDF Toolkit .net を入力します (内部で itextsharp を使用しているようです)。
  3. pdfkt を使用してフォームに入力します。
  4. adobe livecycleで作成したpdf様式ファイルを利用し、Form Data Integration Serviceを利用してデータを統合する

私はこの種のタスクの経験がないので、どのオプションがより良い/より簡単であるかをアドバイスし、いくつかの追加のヒントを与えることができますか?

前もって感謝します。

4

3 に答える 3

3

可能であれば4番目のアプローチを使用することをお勧めします。求めていることに合わせて特別に調整されたソリューションを使用することになりますが、そのようなソリューションに利用できるリソースがない場合は、最初のオプションを使用することをお勧めします。

最初のオプションは、私が最近夢中になったものです。実装するのは比較的簡単であることがわかりました。

オプション 1 は、次の条件が当てはまる場合に使用できます。

  1. PDF フォームの開発を制御できます。
  2. xml データのフォーマットを制御できます
  3. 圧縮されていない (fastweb=false) PDF ファイルを使用しても問題ありません。

実装例:

  1. Adobe Acrobat を使用して PDF フォームを生成します。ヒント: フォームを生成するときは、Adobe Native Fonts を使用してください。ネイティブ フォントではないコントロールを追加するたびに、使用されているフォントがインポートされ、圧縮されていないときにファイルが肥大化します。私の知る限り、ITextSharp は現在、圧縮された PDF を生成しません。

  2. ITextSharp ライブラリを使用して、XML データを PDF フォームと組み合わせて、入力されたドキュメントを生成します。ヒント: xml から PDF フォームに手動で入力するには、xml 値を PDF フォームのコントロール名にマップし、以下の例に示すようにページごとに一致させる必要があります。

    using (MemoryStream stream = GeneratePDF(m_FormsPath, oXmlData))
    {
          byte[] bytes = stream.ToArray();
          Response.ContentType = "application/pdf";
          Response.BinaryWrite(bytes);
          Response.End();
    }
    
    // <summary>
    // This method combines pdf forms with xml data
    // </summary>
    // <param name="m_FormName">pdf form file path</param>
    // <param name="oData">xml dataset</param>
    // <returns>memory stream containing the pdf data</returns>
    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("/form/page" + i + "/*"))
        {
            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;
    }
    
  3. ファイルを保存するか、ファイルを ASP.Net ページの応答に投稿します。

于 2010-04-19T19:57:28.227 に答える
0

この「LiveCycle」にタグを付けたので、どこかで実行されている Adob​​e LiveCycle がインストールされていると思います (オプションで、どこかにインストールできます)。

その場合、私は 4 番を選びます ( Adobe LiveCycle Forms ES モジュールの使用を変更します)。残りの 3 つは、長期的には間違いなく互換性の問題を引き起こします。LiveCycle サーバー (Forms モジュールを実行) を使用すると、古い、新しい、静的、動的、圧縮、Acrobat ベース、LiveCycle ベースなど、あらゆるPDF を処理できます。

設定を行い、フォームからそのデータを LiveCycle サーバーに送信し、そのデータを使用してフォームに入力できるようにする必要があります。塗りつぶしは、サーバーのデータベースに保存するか、PDF フォーム (またはその他のフォーム) にルーティングして、クライアントにストリーミングすることができます。

LiveCycle Designer を使用してフォームを作成します。

簡易オプションは次のようになります: フォームを http-post に設定し (xfdf など、詳細については Acrobat を参照)、ASP サーバーに送信し、サーバーに公開します (ユーザーがフォームを開く前にダウンロードしないでください。そうしないと機能しません。フォームは Web ブラウザーで開く必要があります)。次に、Web ページから http-post をキャプチャするのと同じように、送信をキャプチャします。必要に応じて、塗りつぶしをデータベースに保存します。次に、キャプチャした xfdf ストリーム フィルをクライアントに送信します (後で http リンクを介して呼び出すこともできます)。xfdf ストリームには、入力に使用されるフォームの URL が含まれます。クライアント Web ブラウザーは、Acrobat/Adobe リーダー プラグに xfdf ストリームを処理するように要求し、プラグは、xfdf が指すフォームを見つけてダウンロードし、入力します。

ユーザーはフォームを保存して入力できるようになりました。Reader Extension は必要ありません。

于 2010-04-16T14:31:16.310 に答える
0

iTextSharpを使用して、xml データをReader Extension対応フォームに入力することもできます。正しく設定する必要があるのは次の 2 つです。

  1. BadPasswordExceptionPdfReader.unethicalreading = trueを防止するために設定します。
  2. PdfStamper のコンストラクターで追加モードを設定しないと、 Adobe Reader Extensionsの署名が壊れて、Adobe Reader は次のメッセージを表示します。もはや有効ではありません。このドキュメントの元のバージョンについては、作成者にお問い合わせください。"

だからあなたがする必要があるのはこれだけです:

PdfReader.unethicalreading = true;
using (var pdfReader = new PdfReader("form.pdf"))
{
    using (var outputStream = new FileStream("filled.pdf", FileMode.Create, FileAccess.Write))
    {
        using (var stamper = new iTextSharp.text.pdf.PdfStamper(pdfReader, outputStream, '\0', true))
        {
            stamper.AcroFields.Xfa.FillXfaForm("data.xml");
        }
    }
}

iText を使用して XFA フォームに入力する方法を参照してください。

于 2014-12-13T12:09:38.023 に答える