は素晴らしいアイデアです。 PDF文書をテンプレートとして使用する代わりに、ワープロ文書(doc/docx/odt)を使用して、それらを入力してからPDFに変換することができます。
このアプローチが目的に合っている場合は、Libre Office Java APIを使用してテンプレートを操作し、PDFとして保存できます。つまり、DOCまたはODTファイルをテンプレートとして(さまざまなヘッダーを使用)、データのプレースホルダを作成することができ、Javaプログラムはドキュメントをロードし、プレースホルダを更新してPDFとして保存するようにLibre Officeを制御できます。次のJavaコードはテンプレートに3つのプレースホルダを置き換えて、PDFを保存します。
// Initialise
XComponentContext xContext = Bootstrap.bootstrap();
XMultiComponentFactory xMCF = xContext.getServiceManager();
Object oDesktop = xMCF.createInstanceWithContext(
"com.sun.star.frame.Desktop", xContext);
XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(
XDesktop.class, oDesktop);
// Load the Document
String workingDir = "C:/projects/";
String myTemplate = workingDir + "letterTemplate.doc";
if (!new File(myTemplate).canRead()) {
throw new RuntimeException("Cannot load template:" + new File(myTemplate));
}
XComponentLoader xCompLoader = (XComponentLoader) UnoRuntime
.queryInterface(com.sun.star.frame.XComponentLoader.class, xDesktop);
String sUrl = "file:///" + myTemplate;
PropertyValue[] propertyValues = new PropertyValue[0];
propertyValues = new PropertyValue[1];
propertyValues[0] = new PropertyValue();
propertyValues[0].Name = "Hidden";
propertyValues[0].Value = new Boolean(true);
XComponent xComp = xCompLoader.loadComponentFromURL(
sUrl, "_blank", 0, propertyValues);
// Manipulate
XReplaceDescriptor xReplaceDescr = null;
XReplaceable xReplaceable = null;
XTextDocument xTextDocument = (XTextDocument) UnoRuntime
.queryInterface(XTextDocument.class, xComp);
xReplaceable = (XReplaceable) UnoRuntime
.queryInterface(XReplaceable.class,
xTextDocument);
xReplaceDescr = (XReplaceDescriptor) xReplaceable
.createReplaceDescriptor();
// mail merge the date
xReplaceDescr.setSearchString("<date>");
xReplaceDescr.setReplaceString(new Date().toString());
xReplaceable.replaceAll(xReplaceDescr);
// mail merge the addressee
xReplaceDescr.setSearchString("<addressee>");
xReplaceDescr.setReplaceString("Best Friend");
xReplaceable.replaceAll(xReplaceDescr);
// mail merge the signatory
xReplaceDescr.setSearchString("<signatory>");
xReplaceDescr.setReplaceString("John Steady");
xReplaceable.replaceAll(xReplaceDescr);
// save as a PDF
XStorable xStorable = (XStorable) UnoRuntime
.queryInterface(XStorable.class, xComp);
propertyValues = new PropertyValue[2];
// Setting the flag for overwriting
propertyValues[0] = new PropertyValue();
propertyValues[0].Name = "Overwrite";
propertyValues[0].Value = new Boolean(true);
// Setting the filter name
propertyValues[1] = new PropertyValue();
propertyValues[1].Name = "FilterName";
propertyValues[1].Value = "writer_pdf_Export";
// Appending the favoured extension to the origin document name
String myResult = workingDir + "letter1.pdf";
xStorable.storeToURL("file:///" + myResult, propertyValues);
System.out.println("Saved " + myResult);
// shutdown
xDesktop.terminate();
このブログjava-convert-word-to-pdf-part-1でコードの説明を見つけることができます。私はDocmosisのために働いています。
私は役立つことを願っています。
PDFはWordの処理形式ではないため、「ある単語を別の単語に置き換えたい既存のPDF文書がある」と言うと、PDFの専門家は次のように聞きます。「タマネギのスープがあります。トマトとタマネギ。 "あなたは冗談を言っていないと思うので、私はあなたの質問に笑ってみませんが、PDFフォームを見ましたか? PDF AcroFormテクノロジーをオプションとして使用していますか? –
あなたはそれらのPDFのソースがありますか?おそらくそれらは*読み取り可能な*形式を持っています。 PDFに変換する際には、単語情報やコンテンツ構造に関する他の多くの情報が失われていることを知っておく必要があります。 PDFには、この座標にあるストロークとその座標にストロークを置くようなものが入っています。そのため、PDFを操作するのは難しく、優れた編集者にはコストがかかる理由です。 – Zabuza