web-dev-qa-db-ja.com

印刷されたフォームやPDFを作成/記入する最良の方法は?

複雑なフォームを印刷する必要があるC#アプリケーションがあります。特定の形式でなければならない複数ページの政府コンプライアンスフォームのようなもの。 PDFこれらのフォームのコピーを取得してフォームフィールドを作成できますが、このデータを入力して自動化できるPDFを作成する方法がわかりません-印刷してクライアントに送信します(紙のコピーが必要です)。

また、一部のフォームは動的であり、特定のページを繰り返す必要があります(たとえば、従業員の機会均等監査レポートの場合、50人の従業員がいるが、クライアントが250人の場合、フォームにページの5つのコピーを含める必要があります。 )。

一般に、これらのフォームにデータを入力して印刷するための最良の方法は何ですか?私たちのアプリケーションはC#ベースですが、どの言語/アプリのソリューションでも大歓迎です(必要に応じて、ソフトウェアを購入したり、他のフレームワークと統合したりできます)。

たとえば、TurboTaxは、処理する何百もの納税申告書を印刷するために何を使用しますか?

12
Beep beep

ここにはいくつかのオプションがあります。

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を介して入力する方がはるかに効率的です。

10
Mark Storer

Docotic.Pdf Library を試してみてください。このライブラリを使用すると、既存のドキュメントにフォームを入力したり、FDFデータをインポートおよびエクスポートしたり、既存のドキュメントを変更したり、フォームを最初から作成したりできます。

いくつかのサンプル:

既存のフォームへの記入方法

FDFをPDFドキュメント にインポートする方法

テキストフィールドの作成方法

Docotic.Pdfには、商用ライセンスと無料ライセンスが付属しています。

2
Vitaliy Shibaev

フォームが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に特に感謝します)

1
WoIIe

aspose.wordsを使用すると、 PDF API もあることがわかります。

0
Mark Smith
  1. PDFフォーム(高品質)を印刷する
  2. それをスキャンします(高品質で)
  3. スキャンしたファイルをビットマップ(* .dib)に変換します
  4. Visual Cの使用(VS 2010、プログラムによる)
    • ページのプロパティを設定します(つまり、ページ、デバイスコンテキストなどを準備します)
    • フォントを作成します(もちろん、好きなだけ)
    • ページの原点を設定する(ページの上部)
    • stretchDIBits(または同様のもの)をロードして使用し、PDFページ画像を印刷します
    • ページのトップに移動
    • 印刷位置を計算します(pt.xおよびpt.y)
    • pDC-> TextOut(またはその他の使用したいもの)を使用して印刷する

上記は、任意のPDFページの任意の数のフィールドで機能しますが、基盤となるOS印刷プロセスの基本的な知識が必要です。ページを完全に制御できるため、取り消し線を引くことができます。 、印刷など...あなたは好きなことをすることができます。
それをVS2017とC#に変換しても問題はありません。ライブラリは必要ありません-昔ながらの手作業によるコーディングだけです。

0
Manfred

あなたの質問に対する部分的な答えは、オープンソースライブラリであり、PDFファイルの作成に役立つ「ItextSharp」ライブラリを探索する必要があるということです。

http://sourceforge.net/projects/itextsharp/

0
Deepesh