PDFテンプレート

画像Habrahabr、親愛なる同僚!



PDFドキュメントにデータをインプリントする問題は新しいものではなく、私が最初ではなく、最後でもないので、解決の経験を共有すると同時に、小さなWebに注意を向けることにしました。このトピックに関するアプリケーション。



1. PDF形式は編集できないので、良いです。いずれにせよ、通常のユーザーがPDFドキュメントの編集に関与する可能性はほとんどありません。これは、PDF形式が法的に重要な文書の交換に非常に適していることを意味します。



2. PDF形式は編集できないため、問題があります)。自動モードでPDFドキュメントフォームのデータセットをテンプレート化して入力することは困難であり、手動モードでは有料の重いアプリケーションをインストールする必要があります。



プログラマーとして、私は主に2番目の点に関心があります。ソフトウェアアプリケーションで必要なデータセットをPDFドキュメントに印刷するにはどうすればよいですか?



このトピックに関する別のグーグルでは、結果は得られませんでした。

私はタイピングですべてが悪いことをグーグルで検索することができましたなぜPDFからテキストを抽出するのがとても難しいのですか?プログラマーの観点からPDF)そして最初にdocxファイルをテンプレート化するオプションがあります、これは難しくありません( Microsoft Wordでドキュメントを入力する...)、コンソールでlibreoffice(librewrite)docxファイルをPDFに変換します。これはすべて、アプリケーションから自動的に実行できます。



しかし、最初に、そのような決定は、プロジェクトがlibreofficeに大きく依存することを意味します。



次に、libreofficeでdocxをPDFに変換すると、ドキュメントの外観がWordでの外観や、docxファイルからWordで生成されたPDFとは少し異なります。



最後に、検討中のソリューションの本質に移りましょう。もちろん、この場合の「テンプレート化」は大げさな言葉ですが、提案されたソリューションは非常に適切で有用です。



Python(およびphp)には、文字列と画像をPDFファイルに印刷できるライブラリがいくつかあります(グーグルするのは難しいことではありません)。pdfrw+ reportlab.Canvasを使用します。つまり、原則として、データを入力するのに問題はありません。これらのライブラリの問題は、フィールドごとにドキュメント内の正確な座標を設定する必要があることですつまり、



1です。フィールドの座標をソースコード内ではなく別のファイルに保存する、ある種の統合された機能が必要です。経験から、これらの座標をファイルに保存し、バージョン管理下に置くことをお勧めします。特定のドキュメントセットを生成する対応するPDFフォームおよびメソッドとともに座標をコミットします。そして、これらの座標をデータベースに入れないでください。これにより、必要に応じて、以前のバージョン(座標)のドキュメントにロールバックすることが困難になります。ここではすべてが明確に見えます。



2.これらの座標は何らかの方法で計算する必要があり、手動で計算する場合、これは悲しい作業です。



ここでの主なアイデアは、ブラウザで移動可能なdiv要素を作成し、マウスを使用してドキュメント内の目的の場所に位置を調整し、ブラウザで取得した要素の座標をバックエンドのファイルに保存することです。実際には、これら2つのポイントはアプリケーションに実装されてい ます。



アプリケーションのモード



これは、フロントエンドとバックエンドを備えた小さなWebアプリケーションのように見えます。おそらく、Pythonパッケージとして発行することはできません。



1.ダウンロードソース ギーターからは



2依存関係をインストールし



3.読むREADME.md(静的ファイル用のnginxをインストールして設定します)



4.文書内のフォルダ、ニーズが生成されることを文書の名前と内部にサブフォルダを作成このサブフォルダーは、2つのファイルと(必要に応じて)画像を含む1つのディレクトリを作成します。



-form.pdf#データを

印刷する必要のあるドキュメントフォーム--fields.json#印刷する必要の あるフィールドのパラメーター

--images#はオプションで、入力する必要のある画像のセット

ドキュメントの生成に関係しない元のdocxファイル(存在する場合)も保存することをお勧めします が、必要な場合に役立ちます。変更を加えてPDFドキュメントフォームを再生成します

-form.docx#は必要ありません。名前はありません



。fields.jsonファイルの構造は次のとおりです。例:



{
    "0": [
        [32.25, 710.25, "fio", "DejaVuSans", 12, 420],
        [425.25, 681.75, "gender", "DejaVuSans", 12, 18],
        [206.25, 681.75, "birth_date", "DejaVuSans", 12, 173],
        [462.75, 681.53, "foto.jpg", "DejaVuSans", 12, 92],
        [146.25, 665.25, "birth_place", "DejaVuSans", 12, 418],
        [228.0, 634.5, "registration", "DejaVuSans", 12, 340]
    ],
    "1": [
        [132.0, 720.76, "1_work", "DejaVuSans", 10, 260],
        [132.0, 697.51, "2_work", "DejaVuSans", 10, 260],
        [132.0, 673.51, "3_work", "DejaVuSans", 10, 141]
    ]
}

      
      





このファイルに行を追加/削除すると、フォームに出力されるフィールドが追加/削除され



ます。5。フィールドを設定するページを開きます(http://127.0.0.1/tpdf/positioning?pdf_name=ZayavlenieNaZagranpasport&page_num=1)6



の位置を調整します ブラウザでマウスを使用してフィールドを保存し、この位置を保存します



。7。マウスは、フィールドの目的の位置を常に正確に設定できるとは限りませんフィールドの位置を調整するには、fieldd.jsonファイルを開いて修正します。手動で調整します。ファイル内のデータはY座標順に並べられ、各フィールドはファイル内の独自の行に格納されます。それら。フィールドの座標を含むファイルはきちんとフォーマットされているため、手動で簡単に必要な調整を行うことができます。



8。このタイプのドキュメントを印刷するための別の方法を作成します(何らかの方法で初期データを準備したり、フロントからではなくバックエンドから取得したりする必要がある場合)。



9.すべてが順調に進んでいる場合は、結果のデータセットfields.jsonとファイルをコミットします(私のgitではなく、ローカルのgitにコミットします。ただし、ドキュメントが他の人に役立つ場合は、パブリックドキュメントバンクを収集できます。 、それはアイデアです)。



ファイル内の座標はPDFファイルで使用される測定単位(ポイント)で記述されるため、座標を含む結果のファイルは、別のプロジェクト、たとえばphpなどの別のプログラミング言語で使用できます。



Pythonプロジェクトがある場合は、このアプリケーションのソースコードをプロジェクトに簡単に埋め込むことができ、メインのTpdfクラスを使用して、コード内の任意の場所にPDFを生成できます。



多くの場合、複数のページから1つのドキュメントを生成するだけでなく、複数のドキュメントを1つのPDFファイルにまとめる必要があります。各ドキュメントは正しい順序で印刷する必要があり、一部は複数回印刷する必要があります。このアプリケーションのメインクラスには、ドキュメントのセットを生成するこれらのニーズに対応する特別なメソッドがあります。処理メソッド/ tpdf /例/を参照してください。



データをインスタンス化するときは、データをメインクラスに渡す必要があります。メインクラスはプロパティ(@property)で拡張できます。これは入力データに基づいて計算され、プロパティ名=フィールド名でPDFに挿入されます。したがって、この例では、fioフィールドが表示され、データがlast_name、first_name、middle_nameで送信されます。



この小さなアプリケーションを独立したサービスとしてデプロイすると、環境内の他のすべてのアプリケーションがネットワーク経由で必要なドキュメントのためにアクセスします。 、しかし、ネットワークを介した送信のコストが発生します。ファイルPDFはあまり「軽量」ではなく、ドキュメントの生成自体は高速です。



何百もの言葉の代わりに、ビデオの指示を見たほうがよい場合があります(私は音を録音しませんでした)。





実装経験(レーキ)。



  1. PyPDF2, 28 3 , - . , , , , , , , - . , — . , pdfrw , , . .. 28 0.3 . : , , , .
  2. ajax, , .
  3. PDF. , , 3/4, PDF. , , .


(TODO)



  1. .



    , / / / () fields.json
  2. , , .
  3. , PDF-.
  4. データセットを入力として受け取り、ドキュメントのコレクションを返すジェネリックメソッド。



All Articles