2009-10-28 29 views
1

使用ITextSharp生成PDF並且有需要通過ColumnText使用DirectContent的情況。使用ColumnText寫入DirectContent不會更新PdfDocument.GetVerticalPosition

問題是,通過ColumnText對象寫入文本後,PdfDocument.GetVerticalPosition尚未更新?請參閱以下測試失敗:

public void TestGetVerticalPositionIsUpdated() 
    { 
     PdfContentByte cb = Writer.DirectContent; 
     var columnText = new ColumnText(cb); 

     float position1 = Writer.GetVerticalPosition(true); 
     columnText.SetSimpleColumn(Document.Left, 
            Document.Bottom, 
            Document.Right, 
            position1, 
            0, 
            Element.ALIGN_JUSTIFIED); 

     columnText.AddText(new Phrase("Test test test test test\nTest test test test test")); 
     columnText.Go(); 

     float position2 = Writer.GetVerticalPosition(true); 
     Assert.AreEqual(position1, position2); 
    } 

是否有無論如何告訴作者或文檔更新文件currentHeight。

的obvoius解決方案是使用PdfDocument.SetVerticalPosition如果只存在:-)

還是我誤解使用DirectContent的整個概念?

在我看來,如果文檔上的當前Y位置無法更新或未自動更新,則在將內容添加到DirectContent之後,您無法使用PdfDocument.Add。

回答

3

不幸的是,操作文檔的currentHeight字段是不可能的。因此,當您使用DirectContent插入絕對定位的對象時,無法「強制」添加到要插入絕對定位內容之後的文檔中的下一個內容。

似乎唯一的辦法就是自己跟蹤垂直位置並絕對地添加所有內容。

0

您可以使用multicolumntext對象跟隨您的列文本對象。然後您將所有剩餘的文檔對象放入mct對象中。

var mct = new MultiColumnText(yBottomOfColumnText, MultiColumnText.AUTOMATIC); 
mct.AddSimpleColumn(doc.Left, doc.Right); //creates one column 
for (int i = 0; i < 100; i++) 
{ 
    mct.AddElement(new Paragraph("Test Paragaph Goes HEREEEEEEEE")); //repeats 100 times for test purposes 
} 

doc.Add(mct);