2013-11-28 89 views
1

我目前使用ITextSharp,並且跟隨IText在Action第二版中,特別是第74頁使用ColumnText對象。ColumnText和truncate問題

我使用PDFReader和PDFStamper類加載PDF文件,並嘗試在PDF文檔中添加多個元素。

PdfStamper pdfStamper = new PdfStamper(pdfReader, fileStream); 
PdfContentByte canvas = pdfStamper.GetOverContent(1); 
Rectangle size = pdfReader.GetPageSizeWithRotation(1); 


ColumnText ct = new ColumnText(canvas); 
//I have multiple calls like below, with different x,y coords 
ct.SetSimpleColumn(10, 634, 100, 642); 
ct.AddText(new Chunk("1234567890 999 9 9 999000 0 877")); 
ct.Go(); 

我注意到的是文本將停止,然後開始寫本身(同一列?)。當它到達邊界的末端時,我基本上需要它停下來。我不需要額外的文本顯示在另一列。

我已閱讀有關ColumnText.HasMoreText檢查,以及Go()返回的內容。在這種情況下,它會返回NO_MORE_COLUMNS,我認爲它是2.

我不理解如何在沒有文本寫入的情況下使截斷正常工作。

該文本顯示爲「019 298397 4795 69 7989990000」,您可以看到它開始覆蓋本身。

如果任何人都可以幫助我這個Id感激。如果我需要澄清,請讓我知道。

+0

我試過用最新版本的iText重現問題,但我無法重現問題。也許你正在使用舊版本,並遇到一個已修復的錯誤。 –

+0

好吧我更新了ITextSharp到5.4.4,並且我仍然得到重疊。你能否告訴我你的測試代碼,以便我看看它是否適合我? – abbottmw

+0

我添加了一個[Gist](https://gist.github.com/abbottmw/7705800)到一些正在做我所談論的示例代碼。如果您運行該代碼並查看Test2.pdf,則會看到文本重疊。再次,如果我錯過了一些東西,請告訴我。 – abbottmw

回答

4

好的,我終於找到了一些時間來看看你的例子。

首先這個:你定義一個Font,但是你不要在任何地方使用它。默認字體用於Phrase(Helvetica 12pt,領先18pt)。

18pt的領先地位意味着您永遠無法適應y = 634y = 642之間的文字。我們來製作這個y = 634y = 652

最後,您正在使用文本模式。大多數情況下,使用複合模式會更好。當你這樣改變你的代碼時,它會起作用:

PdfReader reader = new PdfReader("resources/hello.pdf"); 
using (FileStream fileStream = new FileStream("PDF/Test2.pdf", FileMode.Create, FileAccess.Write)) { 
    PdfStamper stamper = new PdfStamper(pdfReader, fileStream); 
    ColumnText ct = new ColumnText(stamper.GetOverContent(1)); 
    ct.SetSimpleColumn(10, 634, 100, 652, 0, Element.ALIGN_LEFT); 
    ct.AddElement(new Phrase("1234567890 999 9 9 999000 0 877")); 
    ct.Go(); 
    stamper.Close(); 
} 
reader.Close(); 
+0

謝謝你的幫助。我得到這個與你的幫助。儘管我確實有一個愚蠢的問題。你如何確定文本是否適合Y?它只是我必須尋找的領導嗎?什麼是「公式」來解決這個問題?字體大小是否也起作用? – abbottmw

+1

高度取決於不同的因素:*字體大小*是字形的平均高度。 * Leading *是基線之間的距離。默認情況下,iText使用1.5倍的字體大小。所以對於12的字體大小,默認情況下,iText取18的前導(當然,您可以更改此值)。如果您想要確切的高度,請查看http://itextpdf.com/examples/iia.php?id=61 getAscentPoint()和getDescentPoint()的返回值之間的差異是實際的高度。 –