クレイジーに思えますが、Libre BaseはフォームをPDFとしてエクスポートできますが、 完成したフォームデータをPDFからLibre Baseにインポートする方法はありません。
1つのアイデアは、PDFフォームデータをFDF(または非友好的なCSV)に抽出し、それを友好的なCSVに変換して、CSVデータをLibre Baseにコピーアンドペーストできるようにすることです。
pdftk filled_form-submit_format_fdf.pdf dump_data_fields output filled_form.csv
pdftk filled_form-submit_format_fdf.pdf generate_fdf output filled_form.fdf
*注意:Libre Baseを使用して空白のフォームをXMLまたはHTMLとしてエクスポートすることもできますが、これらのファイルにデータを入力したり、そのデータをBaseにインポートする方法がわかりません。
オプションA:
awk -F "[()]" '{ if ($1=="/V ") value[$2];} \
END {printf( "CompanyName\tEmailAddress\t\tCountryOrRegion\n" ); \
for (x in value)printf("%s\t", x);print "" ; \
}' filled_form.fdf > filled_form.CSV
オプションB:
grep -oP '(?<=\/T \(txt).*(?=\))' filled_form.fdf |awk '{ORS=(NR%3?",":RS)}1'; \
grep -oP '(?<=\/V \().*(?=\))' filled_form.fdf |awk '{ORS=(NR%3?",":RS)}1';
上記のコマンドの短いバージョンは次のとおりです。
paste -sd, <(grep -oP '(?<=\/T \(txt).*(?=\))' filled_form.fdf) <(grep -oP '(?<=\/V \().*(?=\))' filled_form.fdf)
オプションC:
awk 'NR%2==0{type[$0]} NR%2{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(grep -oP '(?<=\/T \(txt|\/V \().*(?=\))' filled_form.fdf)
オプションA:
awk -F: '{ if ($1=="FieldValue") value[$2];} \
END {printf( "CountryOrRegion\tCompanyName\tEmailAddress\n" ); \
for (x in value)printf("%s\t", x) ;print ""; \
}' filled_form.csv > friendly_filled_form.CSV
オプションB:
grep -oP '(?<=FieldName: txt).*' filled_form.csv |awk '{ORS=(NR%3?",":RS)}1'; \
grep -oP '(?<=FieldValue: ).*' filled_form.csv |awk '{ORS=(NR%3?",":RS)}1'
*このコマンドは1つの線形であることに注意してください。実行するには、両方の行を入力/コピーする必要があります。
そして、これの短いバージョンは次のようになります。
paste -sd, <(grep -oP '(?<=FieldName: txt).*' filled_form.csv) <(grep -oP '(?<=FieldValue: ).*' filled_form.csv)
オプションC:
awk 'NR%2{type[$0]} NR%2==0{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(grep -oP '(?<=FieldName: txt|FieldValue: ).*' filled_form.csv)
またはこれも:
awk 'NR%2{type[$0]} NR%2==0{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(awk -F'FieldValue: |FieldName: txt' 'NF>1{print $2}' filled_form.csv)
明日pdfgrep
でソリューションを完成させますが、自分で試してみたい場合は、次のコマンドを使用してください。
pdfgrep 'CompanyName|CountryOrRegion|EmailAddress' filled_form-submit_format_fdf.pdf
出力形式で動作する必要があります。単語全体のみを取得する場合は、-C 0
オプションを使用します。幸運と私は役立つことを願っています;)
ここで特にあなたのコメントに答える:
Baseが作成したPDFファイルをBaseがデコードできるようにしたい
いいえ、合理的ではありませんanyプログラムができるはずです生成されたPDFを読み取るために、プリンタが印刷したばかりのシートをチャーンバックし、ドキュメントを返してくれることを期待しているだけです。
PDFは印刷/アーカイブ形式です。基本的には(1)「ページ内の位置x、yにWordhelloを置く」という種類の一連の命令です。そのため、PDFで見ると:
コンピュータープログラムが、2行3列または2行2列でスペースを含むかどうかを判断する方法はありません(2)。数値3
は、2.95に切り上げられることもあります。情報が存在しないため、あなたは知ることができません。ですから、PDFからデータに戻ることが可能だとは思わないでしょう(3)。
ただし、たとえばpdftotext
(4)を使用すると、情報をより管理しやすいものに変換できます。
[romano:~/tmp] 1 % pdftotext Untitled1.pdf; cat Untitled1.txt
Sheet1
shiny
mint
new
used
3
1
Page 1
...次に、スクリプト、手動編集などを使用してマッサージします。
脚注:
(1)ここで、本当に控えめに言ってください。
(2)本当に2 x 2です。
(3)作成者プログラムが長いストレッチを行って、ページに各グリフを独立してランダムに配置することでこれをほとんど不可能にし、改ざんを非常に困難にするPDFを見たことがあります。いいえ、私はもう例を見つけることができません...
(4)パッケージpoppler-utils
から
LibreOfficeはpdfフォームを作成できます。
そこからデータをCSVに取得するには、Bionic Beaver 18.04の下で適切に動作する無料のFoxit Readerを使用します。
完成したフォームをFoxit Readerにロードしたら、「接続」ドロップダウンから「フォーム」を選択します。ツールボタンは、「フォームデータのエクスポート」を提供する必要があります。保存ウィンドウは、XML、XFDF(それが何であれ)、TXTおよびCSVの選択肢を提供します。