2009-10-28 4 views
1

Im, используя ITextSharp для создания PDF-файла и имеет ситуацию, когда необходимо использовать DirectContent через ColumnText.Запись в DirectContent с ColumnText не обновляет 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?

Мне кажется, что вы не можете использовать PdfDocument.Add после добавления контента в DirectContent, если текущая позиция Y в документе не может быть обновлена ​​или не обновляется автоматически.

ответ

3

К сожалению, манипулировать поле currentHeight документа невозможно. Поэтому, когда вы вставляете абсолютно позиционированный объект с помощью DirectContent, вы не можете «принудительно» добавить следующий контент к документу, который будет вставлен после абсолютного позиционированного содержимого.

Кажется, что единственный способ - следить за вертикальной позицией самостоятельно и полностью добавлять весь контент.

0

Вы можете следить за текстовым объектом столбца с помощью объекта с многоколоночным текстом. Затем вы разместите все остальные объекты документа в объекте 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);