La scrittura su DirectContent con ColumnText non aggiorna PdfDocument.GetVerticalPosition

StackOverflow https://stackoverflow.com/questions/1637048

  •  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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top