2017-11-29 6 views
0

私のプロジェクト要件の一部として、実行時に置き換えてPDFを生成する固定可変部分で事前定義されたフォントとインデントを持つ定義済みのテンプレートを作成します。これらは、単一の変数の例#Nameを置き換えるか、繰り返しリスト#List of Orderを挿入することができます。テンプレートを定義してJavaを使って操作する

タグを使ってPDFを作成し、PDFBoxで読み込んで置き換えてみました。しかし、あらかじめ定義された位置を知らなくても、PDFBoxを使用してテキストを置き換える方法はありません。

私は見る必要がある選択肢はありますか?私は各ページに別々のヘッダーを持ち、タグを変数に置き換えることができる必要があります。あなたのフォントやレイアウトのテンプレートを作成

おかげ Arnab

+3

PDFはWordの処理形式ではないため、「ある単語を別の単語に置き換えたい既存のPDF文書がある」と言うと、PDFの専門家は次のように聞きます。「タマネギのスープがあります。トマトとタマネギ。 "あなたは冗談を言っていないと思うので、私はあなたの質問に笑ってみませんが、PDFフォームを見ましたか? PDF AcroFormテクノロジーをオプションとして使用していますか? –

+0

あなたはそれらのPDFのソースがありますか?おそらくそれらは*読み取り可能な*形式を持っています。 PDFに変換する際には、単語情報やコンテンツ構造に関する他の多くの情報が失われていることを知っておく必要があります。 PDFには、この座標にあるストロークとその座標にストロークを置くようなものが入っています。そのため、PDFを操作するのは難しく、優れた編集者にはコストがかかる理由です。 – Zabuza

答えて

0

は素晴らしいアイデアです。 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のために働いています。

私は役立つことを願っています。

関連する問題