2013-12-23 62 views
0

不久,我想提請使用iText在特定的矩形文本,它可以在PDF編輯器工具可以選擇。這裏是我的嘗試:畫出矩形可選擇的文本與iText的

Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_RESULT)); 
     document.open(); 

// first 
TextField data = new TextField(writer, new Rectangle(30, 60, 200, 200), "1- this text generated by textfiled"); 
data.setFontSize(10); 
data.setTextColor(BaseColor.GRAY); 
data.setText("1- this text generated by textfiled"); 
PdfFormField datafield = data.getTextField(); 
writer.addAnnotation(datafield); 

// second 
PdfContentByte cb = writer.getDirectContent();   
cb.saveState(); 
cb.beginText(); 
cb.moveText(200, 400); 
cb.setFontAndSize(BaseFont.createFont(), 14); 
cb.showText("2- this text is generated by PdfContentByte "); 
cb.endText(); 
cb.restoreState(); 

// third 
ColumnText ct = new ColumnText(writer.getDirectContent()); 
writer.setCompressionLevel(0);  
ct.setSimpleColumn(100,100,400,300); 
ct.setText(new Phrase("3- this text is generated by ColumnText")); 
ct.go(); 

document.close(); 

我在我的電腦和谷歌驅動文件在網絡上使用Foxit reader爲PDF格式的工具,谷歌的驅動器可以選擇文本,但福昕不能(只要再次測試)。
here是輸出。

以上三種方式並不是我想要的。我想另一種方式,我可以輸入一個矩形(左,上,下,右),文字將適合這個矩形,因爲它可以(字體大小是動態的)。有什麼想法或例子可以實現這一點嗎?

P/S:要解釋布魯諾Lowagie

  • 我不知道PdfContentByte添加文本是爲專業人士或沒有,我只是尋找和嘗試。
  • 我已經嘗試了第二種方式(PdfContentByte),但它不工作,那麼我刪除這些代碼,所以現在我要再次搜索複製併發布到StackOverflow上,我認爲這是類似於我試試。現在我再次寫測試。
+0

你沒有提到你的意思是「PDF編輯器工具」,你的指控是錯誤的。在第一個代碼片段中,創建一個AcroForm表單字段。文本字段的文本是交互式的。它是可選的,可編輯的,你可以複製/粘貼它。在你的第二個代碼片段中,你可以使用最困難的代碼在絕對位置添加靜態文本。你可能需要'ColumnText',但你應該首先更新你的問題,因爲它有不同的缺陷。請參閱http://itextpdf.com/themes/keyword.php?id=59查看「ColumnText」示例。 –

+0

我已更新我的問題。我忘記了提及我使用了'Foxit reader'(和Google Drive on web)來選擇文本,但我認爲這不是投票結束和關閉提問請求的原因。簡單地投票沒有任何意義。問題在於第一種方法,文本無法通過這些工具選擇。因爲我只是這個圖書館的新手,所以我不知道如何正確使用它,這就是我在這裏發佈的原因。我會看一下'Column Text'。謝謝! – R4j

+0

我「棄解」我的投票,但我仍然認爲這個問題很奇怪。分享PDF。如果您確實擁有AcroForm文本字段,則應該可以選擇,即使在Foxit中也是如此。這是添加* interactive *字段的整個想法。你說什麼會違反ISO的ISO標準。另外,如果你是新手,你應該從官方文檔開始。使用'PdfContentByte'添加文本是專業人士使用的。我不知道爲什麼新手會複製/粘貼這樣的代碼。 –

回答

0

我只是看着你的PDF。它在本質上包含此內容

q 
BT 
200 400 Td 
/F1 14 Tf 
(2- this text is generated by PdfContentByte) Tj 
ET 
Q 
BT 
1 0 0 1 100 284 Tm 
/F1 12 Tf 
(3- this text is generated by ColumnText) Tj 
ET 

字體正如你所看到的編碼被定義爲WinAnsiEncodingF1在這裏被定義爲

2 0 obj 
<</BaseFont/Helvetica/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>> 
endobj 

,我從內容流複製只使用這種編碼。

通過簡單地按照PDF規範部分中的文本提取說明進行操作9.10 提取文本內容因此,這很容易複製。任何PDF閱讀器不能複製&粘貼在這裏,甚至似乎沒有嘗試。

文本框是,更容易,該領域被定義爲

3 0 obj 
<< 
    /Ff 0 
    /F 4 
    /Type/Annot 
    /BS<</W 1/S/S>> 
    /Subtype/Widget 
    /Rect[30 60 200 200] 
    /FT/Tx 
    /DR<</Font<</Helv 2 0 R>>>> 
    /DA(/Helv 10 Tf 0.50196 0.50196 0.50196 rg) 
    /T(1- this text generated by textfiled) 
    /V(1- this text generated by textfiled) 
    /AP<</N 1 0 R>>>> 
endobj 

正如你可以看到,該值就像所需的定義。

關於您的以下問題:上述

三種方式不是我想要的。我想用另一種方式輸入一個矩形(左,上,下,右),並且文本將盡可能適合這個矩形(字體大小是動態的)。有什麼想法或例子可以實現這一點嗎?

你實際上需要使用您嘗試使用不同的字體大小,如果結果是太大的方法,並限制自己的PDF閱讀器,其中至少嘗試複製文本由說明書中所描述。不過,我不得不承認,我並不認爲福昕是不屬於讀者的範疇。

+0

非常感謝,只有第一種方式(textfiled)不能被福昕選擇。我只能選擇所有的矩形而不是文本。無論如何,我想我得到了這一個。但對於文本大小,問題是矩形具有動態大小,我試圖使用'BaseFont.getWidthPoint(String text,float fontSize)'來衡量文本的寬度,直到文本可以適合rect(放入while循環),但它總是大於矩形的寬度。你有推薦嗎? – R4j

+0

即使不使用上面顯示的實際值條目,而是使用外觀流,文本字段值也可以輕鬆提取。我會看看應該使用哪種方法來測量字符串寬度。 – mkl