2012-09-06 18 views
1

我在ColdFusion應用程序中使用iText庫來創建PDF,目標是在特定位置將各種文本添加到特定大小的框中。使用ColumnText將文本擬合到框中

它可以通過ColumnText完美地完成(詳見跳過):

<cfset directContent = writer.getDirectContent()> 
<cfset ct = CreateObject("java", "com.lowagie.text.pdf.ColumnText").init(directContent)> 
<cfset ct.setSimpleColumn(100, 50, 400, 400, 18, Element.ALIGN_JUSTIFIED)> 
<cfset ct.setText(createObject("java", "com.lowagie.text.Phrase").init("#text_var#")) > 
<cfset ct.go()> 

的問題是:長文本被切斷,如預期(go()回報ColumnText.NO_MORE_COLUMN)。 但在這種情況下,我需要通過在末尾放置例如'...'來顯示文本未完成(添加點或者如果需要,用'...'替換一個或兩個最後一個符號)。

有沒有簡單的方法來實現這一點?例如,在我致電go(true)後 - 我可以看到用於輸出文本的行數,而不實際輸出它。但我需要以某種方式將實際文本裝入框中。

回答

2

您使用的是強大的舊版本的iText,我不知道我要回答的是否在以我命名的軟件包中受支持。

Q1:我想在最後添加...。 A1:如果go()返回NO_MORE_COLUMN,則可以獲取已寫入的最後一行的最後一個X位置的X位置。請參閱http://api.itextpdf.com/itext/com/itextpdf/text/pdf/ColumnText.html#getLastX%28%29 您可以通過getYLine獲取Y位置。請參閱http://api.itextpdf.com/itext/com/itextpdf/text/pdf/ColumnText.html#getYLine%28%29 您可以使用此X和Y在適當的位置添加'...'。問題2:我不希望文本被刪減;我不希望文本被刪除;我不想刪除文本。我想將文字放在矩形內。 A2:這正是在這個例子中所做的:http://itextpdf.com/examples/iia.php?id=163 在方法addParagraph()中,文本被添加到仿真模式,以查看它是否適合。如果確實如此,文本將被添加爲真實;如果它不是再次添加文本,但使用較小的字體。

+0

非常感謝您的回答!我們討論的功能由ColdFusion 9提供的Itext 2.1.0支持。我的問題是Q1 - 在切割文本的末尾添加「...」,而不是更改字體大小。我瞭解getXLine和getYLine的用法。唯一的問題是,在這種情況下,'...'將被添加到最後一個符號之後 - 也就是在盒子之外。我需要用'...'替換最後的符號(多少符號 - 必須在每種情況下用getEffectiveStringWidth計算)以適應盒子內部。你能爲此提出建議嗎? – user1651973

+1

事實上,如果您的文本是正確的,X將是您的列的右邊界的座標。你所要求的不支持。我看到的唯一解決方法是首先嚐試模擬模式;如果文本不適合,則將所有以仿真模式寫入的行添加爲實數,除了最後一行使用較小高度的列(基於getYLine),然後爲第一行下的最後一行定義一個新列列,但使用較小的寬度,以便有空間添加「...」。這不是一個優雅的解決方案,我知道......對不起。 –

+0

謝謝。至於提議的解決方法,我如何知道用於包含一個縮短行的第二列的文本? – user1651973