web-dev-qa-db-ja.com

PDFフォームフィールドをxmlに自動的にエクスポートする方法

フォームフィールドを含むpdfファイルがあり、データをxmlファイルにエクスポートする必要があります[〜#〜]自動的に[〜#〜]。これは、テスト用に作成したサンプルフォームの画面です。

enter image description here

注:エクスポートするとうまく機能します[〜#〜]手動[〜#〜]Tools > Form > Export Form DataをクリックしてAcrobatProfessionalを使用し、最後にファイル出力にxml拡張子を選択します。これは、手動でエクスポートしたときに得られる結果です。

<?xml version="1.0" encoding="UTF-8"?>
<fields>
    <first_name>John</first_name>
    <last_name>Doe</last_name>
</fields>

ただし、自動化する必要があります。 pythonスクリプトJava実装またはいくつかコマンドラインツール。フォームフィールドデータをxmlにエクスポートするために使用できるライブラリまたはツールはありますか?ツールまたはライブラリはオープンソースである必要があり、ワークフローに統合できます。

私はすでにpython pdfminerライブラリを試しました。これは、の静的部分(Static form headerFirst name:Last name:など)をエクスポートするのに役立ちました。 pdfファイル:しかし、フォームフィールドデータ(私の場合はフォームフィールドfirst_namelast_nameの内容)をエクスポートする方法は??

編集:sample.pdfファイルをダウンロードしてください ここ

10
Michael

Apache PDFBox はどうですか?ウェブサイトには「フォームデータをPDFフォームから抽出するか、PDFフォーム」に事前入力する」と記載されているため、オープンソースであり、ニーズに合う可能性があります。

編集: PrintFieldsの例 をチェックしてください。

8
jimmyp.smith

Bashでは、これを行うことができます(少なくとも、これらのツールの私のバージョンでは、444とcat 8.13を減らします)。

less ~/Downloads/sample.pdf | cat

次のような出力が得られます。

Static form header

First name:   John

Last name:    Doe

その後、Java/Python/awk/whateverを使用してかなり明らかに解析できます。

もちろん、代わりに、これらの特定のバージョンの動作に依存したくない場合(常にこれを行うかどうかはわかりません)、 lessのソースコード を調べて方法を確認できますそれはそれをします。

2
James Kingsbery

Java PDFで動作するライブラリはいくつかありますが、一般的にPDFからフォーマットされた情報を取得するのは困難です。私はそれを実装したことはありませんが、Qoppaは見栄えがよく、高度なようですが、無料ではありません。フォームフィールドから値を抽出するのに役立つ jPDFFields が含まれています。また、コマンドラインツールに関する情報が含まれている 同様のスレッド もあります。

お役に立てば幸いです。

1
annaskulimowska

Javaソリューションの場合、 iText を使用してフィールドを読み取り、次に jackson-dataformat-xml のように結果を次のように書き込むことができます。 XML。A、やや基本的な例は次のとおりです。

// read fields
final PdfReader reader = new PdfReader("/path/to/my.pdf");

final AcroFields fields = reader.getAcroFields();
final Map<String, Object> values = new HashMap<>();
for (String fieldName : (Set<String>) fields.getFields().keySet()) {
    values.put(fieldName, fields.getField(fieldName));
}

// write
final XmlMapper mapper = new XmlMapper();
final String result = mapper.writeValueAsString(values);

System.out.println(result);

ここには確かに改善の余地がありますが、それは十分な出発点かもしれません。

0
Jonathan