一部のフィールドが静的で他のフィールドが動的であるドキュメント テンプレートがあります。一部のデータ (名前、姓、給与) を置き換えて、新しいファイルを生成する必要があります。これを行うには、どのライブラリをお勧めしますか? POI は適切ですか?私は、Spring、Java EE6、および Oracle を使用しています。
2 に答える
Apache POI を試してみることはできますが、単語ファイルを操作するために必要な POI の HWPF および XWPF 部分は、使用するのが非常に複雑です。少なくとも、単語ファイルがどのように構造化されているかを十分に理解している必要があります。
iText と PDF を使用したソリューション
私はPDFで同様のことをしました(これはあなたのオプションかもしれません)
1) LibreOffice を使用してドキュメントにフィールドを作成できます (Acrobat Pro のように)
- .odt ファイルを作成してスタイルを設定する
- または、MS Word または LibreOffice Writer を使用してテンプレートを変換します
- 次に、[表示] -> [ツールバー] -> [フォーム デザイン] に移動し、[デザイン モードのオン/オフ] を設定します。
- これで、ファイルにフィールドを追加できます (ファイルをダブルクリックすると、フィールドのプロパティが開きます)
- 終了したら: 「ファイル -> PDF としてエクスポート」
2) 作成したフィールドに iText を使用して入力できるようになりました
以下はコード例です。
public byte[] getDocumentAsByteArray(Object dataBean, String pdfTemplateName) throws KkmsException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfStamper stamp = null;
InputStream templateInputStream = null;
Locale local = new Locale(language);
try {
templateInputStream = // get the file input stream of the pdf
PdfReader reader = new PdfReader(templateInputStream);
// Create a stamper that will copy the document to a new file
stamp = new PdfStamper(reader, outputStream);
AcroFields form = stamp.getAcroFields();
// form fields are normal text in the end
stamp.setFormFlattening(true);
Map<String, AcroFields.Item> map = (Map<String, AcroFields.Item>)form.getFields();
if (map != null) {
if (map.size() == 0) {
logger.debug("There are no fields in this PDF layout");
}
for (Entry<String, AcroFields.Item> e : map.entrySet()) {
logger.debug("PDF fieldname = " + e.getKey());
// at the moment we only handle text fields
if (AcroFields.FIELD_TYPE_TEXT == form.getFieldType(e.getKey())) {
fillForm(dataBean, form, e.getKey(), local);
} else {
logger.warn("Field type is not supported: "+form.getFieldType(e.getKey()));
}
}
}
stamp.close();
} catch (Exception e) {
logger.warn("Failed to create PDF document", e);
throw new KkmsException("Failed to create PDF document: "+e.getMessage());
} finally {
if (templateInputStream != null) {
try {
templateInputStream.close();
} catch (IOException e) {
throw new KkmsException("Failed to close InputStream of PDF document", e);
}
}
}
return outputStream.toByteArray();
}
最後に PDF を取得します -> これが少しでもお役に立てば幸いです。
別の迅速で汚い解決策
odt または docx の力を使用する可能性があります -> ドキュメントを docx または odt に変換します -> それは単なる zip ファイルです -> 解凍します -> zip のルートに content.xml ファイルが表示されます -> そこにここにすべてのドキュメント コンテンツがあります。ここにいくつかのマジック タグ (例: $$$) を追加して、後でプログラムで置き換えることができます。
<text:p text:style-name="P3">SAP Customer Number:</text:p>
<text:p text:style-name="P3">SAP Customer Number: $$$sapCustomerNumber$$$</text:p>
次に、odt/docx ファイルを解凍するプログラムを作成します -> タグを置き換えます -> ファイルを再度圧縮します
これらのスライドは、私が OSDC 2012 で行ったプレゼンテーションからのもので、いくつかの主要なアプローチの概要を示しています。
最近では、「必要なものを XHTML として生成し、それを docx にエクスポートする」と追加する可能性があります。CSS @class 値の Word スタイルへの変換をサポートする docx4j-ImportXHTML を導入して以来、このアプローチをますます目にするようになりました。