La scrittura su DirectContent con ColumnText non aggiorna PdfDocument.GetVerticalPosition
-
06-07-2019 - |
Domanda
Sto usando ITextSharp per generare un PDF e ho una situazione in cui è necessario utilizzare DirectContent tramite un ColumnText.
Il problema è che dopo aver scritto il testo tramite l'oggetto ColumnText, PdfDocument.GetVerticalPosition non è stato aggiornato? Vedi il seguente test che fallisce:
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);
}
Esiste un modo per dire allo scrittore o al documento di aggiornare i documenti currentHeight.
La soluzione obvoius era usare PdfDocument.SetVerticalPosition se esistesse solo :-)
O sto fraintendendo l'intero concetto di utilizzo di DirectContent?
Mi sembra che non sia possibile utilizzare PdfDocument.Aggiungi dopo aver aggiunto contenuto a DirectContent, se l'attuale posizione Y sul documento non può essere aggiornata o non viene aggiornata automaticamente.
Soluzione
Sfortunatamente non è possibile manipolare il campo currentHeight del documento. Quindi quando inserisci un oggetto posizionato in modo assoluto usando DirectContent non puoi " forzare " il contenuto successivo aggiunto al documento da inserire dopo il contenuto posizionato in modo assoluto.
Sembra che l'unico modo sia tenere traccia della posizione verticale da soli e aggiungere assolutamente tutto il contenuto.
Altri suggerimenti
È possibile seguire l'oggetto di testo della colonna con un oggetto a più colonne. Quindi posizioneresti tutti gli oggetti documento rimanenti nell'oggetto 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);