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

Posted

技术标签:

【中文标题】在 iText 7 中编写文档时如何获取垂直光标位置?【英文标题】:How to get vertical cursor position when writing document in iText 7? 【发布时间】:2019-01-27 22:33:15 【问题描述】:

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

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

更新日期:2018 年 8 月 11 日:根据评论中的回复,我已经更新了添加页面 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();


【问题讨论】:

在此处查看帮助页面:developers.itextpdf.com/content/… 【参考方案1】:

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

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

我对 API 知之甚少,无法意识到这种方法的缺点。它看起来很有效,对我来说已经足够了。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在 iText 7 中编写文档时如何获取垂直光标位置?的主要内容,如果未能解决你的问题,请参考以下文章

Itext 7使用pdf中的材料ui图标

在fabric js中擦除iText时显示光标线代替擦除的字符

iText 7:此 pdf 文档可能无法正确显示 Firefox

Itext 7 - PdfReader 未使用所有者密码错误打开

java 已经获取pdf代码,如何把他pdf文件保存到本机 要求用输出流做

使用键盘时如何在可编辑视图中获取光标的位置?