2017-08-27 4 views
0

私はAngularテスト準備アプリケーション(Laravel 5.1 API付き)をビルドしています。要件の1つは、ユーザーが達成証明書を印刷できるようにすることです。カスタムデータをPDFに補間する

クライアントは、その人物の名前と資格情報を文書に補間することを望んでいる(例えば、下に強調表示されている)。ここでは、彼らが送られたPDFテンプレートのスナップショットです:

enter image description here

私はPDFの閲覧を扱うてるの方法は、単にS3上のファイルを保存し、そのファイルにそれらにリンクを与えることです。

PDF文書に情報を補間することは些細なことではないようですが、プログラムでこれを許可する情報はほとんど見つかりませんでしたが、DocHubのようなツールがあり、PDFを表示しながら編集することができます。

私は学習に興味がある:

  • は、プログラム些細これをしているのですか?
  • 私が気付いていないサードパーティのツールはありますか?
  • 私はこの情報を最初に補間するためにS3リンクに送ることさえできますか?
+0

開始するには、ここでいくつかの回答を見てください。https://stackoverflow.com/questions/34049956/generate-pdf-from-html-using-pdfmake-in-angularjs –

+0

PDFは処理チェーンの最終フォーマットです。特に、コンテンツを簡単に変更できるようには設計されていないため、既存のコンテンツをリフローする必要があります。 AcroFormフォームフィールドを含むようにテンプレートを変更して塗りつぶすことも考えられますが、それは挿入された名前によって多かれ少なかれ大きなギャップを残します。また、テンプレートを他の最終フォーマットにリモデリングすることもできます。 html、その形式で値を挿入し、pdfに変換します。 – mkl

答えて

1

通常、編集用の形式としてPDFを使用するのは悪い選択です。固定フィールドを持つフォームがあれば簡単です。対話形式のPDFテンプレートを作成します。このフォームでは、AcroFormテクノロジに基づいて、固定座標と固定サイズのフィールドを定義します。これらのフィールドにコンテンツを追加することができます。

このアプローチの大きな欠点の1つは、柔軟性の欠如です。前の段落で「固定」という言葉を3回使用したことに気付きましたか?テキストがあらかじめ定義されたフィールドに収まらない場合、あなたは不運です。フィールドの大きさが過大であれば、空白がたくさんあります。このアプローチは、データがどのようなものになるかを予測できれば素晴らしいものです。典型的なユースケースは、チケットまたはバウチャーです。たとえば、空のフォームは、自動システムが名前、日付、時刻、座席番号を置くことができる2つのフィールドだけで、本当にいいページです。

これは、あなたのスクリーンショットに表示する例のための最良の方法ではありません。テキストのすべての行、すべての単語、すべての文字の位置は、事前にわかっています。短い単語を長い単語に置き換えたい場合(またはその逆の場合)、完全なページの各行のすべての位置を再計算する必要があります。それは狂気です。このようなアイデアは、デザインスキルの低い人にしか見えません。

もっと良いアイデアは、テンプレートをHTMLとして保存することです。私たちはHTMLのスニペットを持っているのiTextのpdfHTMLチュートリアルのインスタンスchapter 5を参照してください:

<html> 
    <head> 
     <title>Invitation to SXSW 2018</title> 
    </head> 
    <body> 
     <u><b>Re: Invitation</b></u> 
     <br> 
     <p>Dear <name>SXSW visitor</name>, 
     we hope you had a great SXSW film festival experience last year. 
     And we would like to invite you to the next edition of SXSW Film 
     that takes place from March 9 until March 17, 2018.</p> 
     <p>Sincerely,<br> 
     The SXSW crew<br> 
     <date>August 4, 2017</date></p> 
    </body> 
</html> 

<name>タグと<date>タグがHTMLに存在しないので、実際に、それは、実際にHTMLではありません。すべてのHTMLプロセッサ(ブラウザなどpdfHTML)は、これらのタグを無視し、タグが<span>たかのように自分のコンテンツを扱う:

enter image description here

それは純粋のコンテキストでこのようなタグを持つようにあまり意味がありません。 HTMLですが、pdfHTMLの場合はかなり意味があります。 pdfHTMLLを使用すると、カスタムタグを設定して、以下に示すPDFファイルのように見える結果を持つことができます:「ジョン・ドウ」のための文書で

enter image description here

ルックと「ブルーノLowagie」のドキュメントとの比較します。 "John Doe"という名前は私の名前よりもはるかに短いので、その最初の行にはもっと多くの言葉が当てはまります。テキストはきれいに流れる(我々はまた、両側のテキストを正当化することもできる)。あなたのアプローチでは、この「フロー」を達成することは不可能です。なぜなら、PDFテンプレートをうまくリフローさせることができないからです。

OK、私はそれを得ます、あなたはおそらく、と言いますが、実際の面はどうですか?あなたはJava/.Netライブラリについて話していますが、LaravelとAngular.jsを使って作業しています。、私は私が原因PDFの性質上、あなたはLaravelやAngular.jsのための何かいいのPDFツールを見つけるとは思わないし、それらの開発環境は、(私の意見では、これらの技術がうまく再生されないことを伝えるまずましょう一緒に)。私の意見にかかわらず、Amazon環境で働いているので、これはあなたにとって大きな問題ではありません。 AWSはJavaをサポートしており、pdfHTMLの作業に必要なJavaコードは最小限です。 pdfHTMLチュートリアルで書いたコードサンプルのほとんどは、15行より短いです。なぜJavaとpdfHTMLを試してみませんか?

1

アマゾンサービスを既に使用している場合、オンデマンドでpdfを生成するために、アマゾンラムダ関数をiText7(java)と組み合わせて使用​​してみませんか?

このようにして、pdfが正しいことが保証され、毎回うまくレイアウトされます。

  • はプログラムであなたの文書全体、
  • 充填を作成し、XFAフォームを平坦化、

    • HTML変換:PDFの生成

      は、いずれかの方法で行うことができます。

    あなたのご使用のケースでは、オプション1または2のいずれかが最も持続可能です。