在iText 7中编写文档时如何获得垂直光标位置?

问题描述 投票:1回答:2

在iText 5中有一个名为getVerticalPosition()的方法,它给出了下一个写入对象的页面位置。作为回答这个问题How to find out the current cursor position on a page?和哪些记录here

iText 7在页面上获取当前垂直位置以写入文档的等价物是什么?

更新日期:08-11-2018:根据评论中的回复,我更新了添加页面preak或新页面的逻辑,但两者仍然在同一页面上打印

foreach (var element in RenderHtmlAndCss(document, css, html))
{
AddElement(document, null, (IBlockElement)element);
IRenderer pRenderer = element.CreateRendererSubTree().SetParent(document.GetRenderer());
LayoutResult pLayoutResult = pRenderer.Layout(new LayoutContext(new LayoutArea(0, new Rectangle(pdf.GetDefaultPageSize().GetHeight() - 72, pdf.GetDefaultPageSize().GetWidth() - 72))));
// writer.GetCurrentPos();
float y = pLayoutResult.GetOccupiedArea().GetBBox().GetY();

//20 is height of the content.
if(y<20 && !string.IsNullOrEmpty(LastPageStaticContent))
{
AreaBreak newpage = new AreaBreak(AreaBreakType.NEXT_PAGE);
//pdf.AddNewPage();
}

}

// Add Preface
if (Preface != null && Preface.Count > 0)
{

foreach (ReportSection section in Preface)
{
for (int i = 1; i <= pdf.GetNumberOfPages(); i++)
{
if (i == pdf.GetPageNumber(pdf.GetLastPage()))
{
foreach (var element in RenderHtmlAndCss(document, css, LastPageStaticContent))
{

//float x = pLayoutResult.getOccupiedArea().getBBox().getX();
IBlockElement glueToBottom = new Paragraph().Add((IBlockElement)element)
.SetFontSize(12)
.SetWidth(UnitValue.CreatePercentValue(100))
// .SetBackgroundColor(ColorConstants.RED)
.SetTextAlignment(TextAlignment.JUSTIFIED);
glueToBottom.SetProperty(Property.POSITION, iText.Layout.Layout.LayoutPosition.ABSOLUTE);
glueToBottom.SetProperty(Property.BOTTOM, 0);
// glueToBottom.Add(element);
document.Add(glueToBottom);

}
}
}

// document.Close();
}
}
itext pdf-generation itext7
2个回答
1
投票

Jon Reilly在评论中发布的链接here,对于解决这个问题非常有用:

您将需要对您需要的垂直位置的元素的引用并添加它:

Paragraph p = new Paragraph("Hello World");
doc.add(p);

然后,您可以按如下方式获取元素的IRenderer,然后允许您获取LayoutResult,其中包含有关PDFDocument中元素呈现的大量有用信息,包括边界框,具有完整坐标,宽度,高度等等应该比旧的iText5 getVerticalPosition更强大。

IRenderer pRenderer = p.createRendererSubTree().setParent(doc.getRenderer());
LayoutResult pLayoutResult = pRenderer.layout(new LayoutContext(new LayoutArea(0, new Rectangle(595-72, 842-72))));

float y = pLayoutResult.getOccupiedArea().getBBox().getY();
float x = pLayoutResult.getOccupiedArea().getBBox().getX();

1
投票

我认为询问文档渲染器关于其当前布局区域的顶部是获取此信息的更简单方法。

Paragraph p = new Paragraph("Hello World");
doc.add(p);
float position = doc.getRenderer().getCurrentArea().getBBox().getTop();

我对API的了解太少,无法了解此方法的缺点。它看起来像是在工作,对我来说就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.