L'écriture sur DirectContent avec ColumnText ne met pas à jour PdfDocument.GetVerticalPosition

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

  •  06-07-2019
  •  | 
  •  

Question

J'utilise ITextSharp pour générer un fichier PDF et je suis confronté à la nécessité d'utiliser DirectContent via un ColumnText.

Le problème est qu’après avoir écrit du texte via l’objet ColumnText, le fichier PdfDocument.GetVerticalPosition n’a pas été mis à jour? Voir le test suivant qui échoue:

    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);
    }

Est-il possible d'indiquer à l'auteur ou au document de mettre à jour les documents currentHeight?

La solution obvoius consistait à utiliser PdfDocument.SetVerticalPosition s’il n’existait que: -)

Ou est-ce que je ne comprends pas tout le concept d'utilisation de DirectContent?

Il me semble que vous ne pouvez pas utiliser PdfDocument.Add après avoir ajouté du contenu à DirectContent, si la position Y actuelle du document ne peut pas être mise à jour ou n'est pas mise à jour automatiquement.

Était-ce utile?

La solution

Malheureusement, il n'est pas possible de manipuler le champ currentHeight du document. Ainsi, lorsque vous insérez un objet positionné de manière absolue à l’aide de DirectContent, vous ne pouvez pas "forcer". le contenu suivant ajouté au document à insérer après le contenu en positionnement absolu.

Il semble que le seul moyen est de garder vous-même la position verticale et d’ajouter tout le contenu de manière absolue.

Autres conseils

Vous pouvez suivre votre objet texte de colonne avec un objet multicolumntext. Vous placeriez ensuite tous les objets de document restants dans l'objet 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top