複雑なフォームを印刷する必要があるC#アプリケーションがあります。特定の形式でなければならない複数ページの政府コンプライアンスフォームのようなもの。 PDFこれらのフォームのコピーを取得してフォームフィールドを作成できますが、このデータを入力して自動化できるPDFを作成する方法がわかりません-印刷してクライアントに送信します(紙のコピーが必要です)。
また、一部のフォームは動的であり、特定のページを繰り返す必要があります(たとえば、従業員の機会均等監査レポートの場合、50人の従業員がいるが、クライアントが250人の場合、フォームにページの5つのコピーを含める必要があります。 )。
一般に、これらのフォームにデータを入力して印刷するための最良の方法は何ですか?私たちのアプリケーションはC#ベースですが、どの言語/アプリのソリューションでも大歓迎です(必要に応じて、ソフトウェアを購入したり、他のフレームワークと統合したりできます)。
たとえば、TurboTaxは、処理する何百もの納税申告書を印刷するために何を使用しますか?
ここにはいくつかのオプションがあります。
1)FDF、 フォームデータ形式 。そして、それはひどい仕様書であり、FDFフォーマットの小さな(あまり使用されない、複雑な)部分しかカバーしていません。 FDFファイルの生成は非常に簡単で、フィールドと値のペアの山(リストオプションやその他の不要なものを保持できます)とファイルの関連付けが含まれています。 FDFを開くと、PDF(acrobat/readerとのファイルの関連付けを介して)がいっぱいになります。
これがサンプルです(読みやすくするために余分な空白があります):
%FDF-1.2
1 0 obj
<< /FDF
<< /Fields [
<< /V (Communications Co.)/T (Address1)>>
<< /V (29 Communications Road)/T (Address2)>>
<< /V (Busyville)/T (City)>>
<< /V (USA)/T (Country)>>
<< /V (24 January 2000)/T (Date)>>
<< /V (Suzie Smith)/T (Name)>>
<< /V (\(807\) 221-9999)/T (PhoneNumber)>>
<< /V (777-11-8888)/T (SSN)>>
<< /V (NJ)/T (State)>>
]
/F (TestForm.pdf)
>>
>>
endobj
trailer
<<
/Root 1 0 R
>>
%%EOF
「/ V」はフィールド値を示し、「/ T」はフィールドのタイトルです。 「/ F」は、入力するフォームへのパスです。
FDFとPDFを取り込んで、入力されたPDFフォームを生成できるメールマージ風の製品がたくさんあります。前述のiText(および他のいくつか)はプログラムでこれを行うことができ、他のアプリにはコマンドラインがあります。
繰り返す必要があるかもしれないページは、この環境では独自の形式である必要があります。フォームのマージは非常に難しい場合があります。いくつかのアプローチがありますが、最も簡単な方法は、フィールドを「フラット化」して、ページコンテンツ(ラインアートとテキスト)だけにすることです...その後、実際にはマージしませんPDFフォームもう。
もちろん、印刷の順序を制御できる場合は、フォームをマージする必要はまったくありません。正しい順序で開く/印刷するだけです。
私が覚えているように、AcrobatProのバッチコマンドはFDFデータをインポートして印刷することができます。あなたがする必要があるのは、適切なFDFファイルを生成することだけです。これは、ほとんどの場合、簡単な文字列の作成です。
FDFを使用すると、PDFフォームが既に作成されており、入力されるのを待っていることが前提となります。そうでない場合は...
2)プログラムでPDFフォームを生成します。これはiText(iTextSharpのJavaベース))で行いますが、さまざまな言語で利用できるライブラリはかなりあります。 .iText [Sharp]はAGPL(または商用)の下でライセンスされています。AGPLでは、OUTPUTにアクセスできる人は誰でもアプリケーションのソースにアクセスできる必要があります。AGPLは通常のGPLと同じように「ウイルス性」です。古いバージョンが利用可能でした。 MPLの下で。
これは厳密に内部的なものであり、PDFを印刷することを考えると、ライセンスはそれほど問題にはなりません。
フォームテンプレートを一度生成してから、直接またはFDFを介して入力する方がはるかに効率的です。
Docotic.Pdf Library を試してみてください。このライブラリを使用すると、既存のドキュメントにフォームを入力したり、FDFデータをインポートおよびエクスポートしたり、既存のドキュメントを変更したり、フォームを最初から作成したりできます。
いくつかのサンプル:
FDFをPDFドキュメント にインポートする方法
Docotic.Pdfには、商用ライセンスと無料ライセンスが付属しています。
フォームがAcroFormテクノロジーに基づいている場合:このタスクを実行するには、 itext7 を使用するだけです。 NuGetパッケージマネージャーコンソールで次のコマンドを実行して、プロジェクトに追加します。
インストール-パッケージitex7
特定のフォームフィールドを作成するには、次のようなコードを使用します。
_PdfReader reader = new PdfReader(src);
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(reader, writer);
var form = PdfAcroForm.GetAcroForm(pdfDoc, true);
var fields = form.GetFormFields();
fields.Get(key).SetValue(value);
form.FlattenFields();
pdfDoc.Close();
_
このスニペットでは、src
はPDFファイルのソースであり、dest
は結果のPDFへのパスです。key
はテンプレート内のフィールドの名前。value
は入力する値に対応します。フォームの対話性を維持する場合は、form.flattenFields();
を削除する必要があります。それ以外の場合はすべてフォームフィールドが削除され、フラットなPDFになります。
注意
Itext7はAGPLの下でライセンスされており、商用利用やクローズドソースでは無料ではないことに注意してください。 (この必要な情報を提供してくれた@da_berniに特に感謝します)
aspose.wordsを使用すると、 PDF API もあることがわかります。
上記は、任意のPDFページの任意の数のフィールドで機能しますが、基盤となるOS印刷プロセスの基本的な知識が必要です。ページを完全に制御できるため、取り消し線を引くことができます。 、印刷など...あなたは好きなことをすることができます。
それをVS2017とC#に変換しても問題はありません。ライブラリは必要ありません-昔ながらの手作業によるコーディングだけです。
あなたの質問に対する部分的な答えは、オープンソースライブラリであり、PDFファイルの作成に役立つ「ItextSharp」ライブラリを探索する必要があるということです。