1

我使用 ITextSharp 生成 PDF,并且遇到需要通过 ColumnText 使用 DirectContent 的情况。

问题是,通过 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。

4

2 回答 2

3

不幸的是,无法操作文档的 currentHeight 字段。因此,当您使用 DirectContent 插入绝对定位的对象时,您不能“强制”将添加到文档的下一个内容插入到绝对定位的内容之后。

似乎唯一的方法是自己跟踪垂直位置并绝对添加所有内容。

于 2009-11-07T21:10:44.463 回答
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);
于 2011-11-01T22:14:00.773 回答