Java 检索iText中段落的坐标

Java 检索iText中段落的坐标,java,itext,itext7,Java,Itext,Itext7,我试图从iText中创建的段落中检索x,y坐标。我遵循了批准的答案,但没有得到预期的结果 PdfDocument pdfDoc = new PdfDocument(new PdfWriter("output/ITextSandbox/Coordinates.pdf")); pdfDoc.setDefaultPageSize(PageSize.LETTER); // 8.5 x 11 Document document = new Document(pdfDoc); PdfFont font

我试图从iText中创建的
段落
中检索x,y坐标。我遵循了批准的答案,但没有得到预期的结果


PdfDocument pdfDoc = new PdfDocument(new PdfWriter("output/ITextSandbox/Coordinates.pdf"));
pdfDoc.setDefaultPageSize(PageSize.LETTER); // 8.5 x 11
Document document = new Document(pdfDoc);

PdfFont font = PdfFontFactory.createFont(StandardFonts.COURIER, PdfEncodings.UTF8);
document.setFont(font);
document.setFontSize(10);

Paragraph paragraph = null;

// Print 5 lines to ensure the y coord is sufficiently moved away from the top of the page.
for (int i = 1; i <= 5; i++)
{
    paragraph = new Paragraph();
    paragraph.add(new Text("Line " + i));
    document.add(paragraph);
}

// Print a new paragraph from which to obtain the x, y coordinates.
paragraph = new Paragraph();
paragraph.add(new Text("Line 6"));
document.add(paragraph);

// Follow the steps from the approved answer in
// https://stackoverflow.com/questions/51953723/how-to-get-vertical-cursor-position-when-writing-document-in-itext-7
IRenderer renderer = paragraph.createRendererSubTree().setParent(document.getRenderer());
float width = document.getPageEffectiveArea(PageSize.LETTER).getWidth();
float height = document.getPageEffectiveArea(PageSize.LETTER).getHeight();
LayoutResult layoutResult = renderer.layout(new LayoutContext(new LayoutArea(1, new Rectangle(width, height))));
float y = layoutResult.getOccupiedArea().getBBox().getY();
float x = layoutResult.getOccupiedArea().getBBox().getX();

System.out.println("x = " + x + ", y = " + y); // y should be approximately 630, not 710.

PdfDocument pdfDoc=新的PdfDocument(新的PdfWriter(“output/ITextSandbox/Coordinates.pdf”);
pdfDoc.setDefaultPageSize(PageSize.LETTER);//8.5 x 11
文件=新文件(pdfDoc);
PdfFont font=PdfFontFactory.createFont(StandardFonts.COURIER,PdfEncodings.UTF8);
document.setFont(字体);
文件。设置字体大小(10);
段落=空;
//打印5行,以确保y坐标充分远离页面顶部。

对于(int i=1;i问题中的代码示例模拟特定布局区域上的渲染。如果在完全相同的布局区域上模拟完全相同的元素,则该方法可用于确定页面上的坐标

在这个问题中,只有第6段是模拟的,因此需要更大的y坐标(在页面上更高)。要获得正确的y坐标,还必须模拟前面的5段

此外,布局区域与页面不同。此代码未正确考虑页面边距:

float width=document.getPageEffectiveArea(PageSize.LETTER).getWidth();
浮动高度=document.getPageEffectiveArea(PageSize.LETTER).getHeight();
LayoutResult LayoutResult=
布局(新布局上下文(新布局区域(1,新矩形(宽度、高度)));
默认页边距为
36
,正确的布局区域为:

float width=document.getPageEffectiveArea(PageSize.LETTER).getWidth();
浮动高度=document.getPageEffectiveArea(PageSize.LETTER).getHeight();
LayoutResult LayoutResult=
布局(新布局上下文(新布局区域(1,新矩形(36,36,宽度,高度)));
渲染某些元素后,获取当前坐标的更简单方法是:

/**/
段落=新段落();
增加(新案文(“第6行”);
文件.添加(第段);
剩余矩形=document.getRenderer().getCurrentArea().getBBox();
float y=剩余的.getTop();
System.out.println(“y=“+y”);
结果:
y=631.6011

为了说明剩余的布局区域,让我们在页面上绘制它:

PdfCanvas canvas=newpdfcanvas(pdfDoc.getPage(1));
setStrokeColor(ColorConstants.RED).rectangle(剩余).stroke();

使用一些不同的页边距:

document.setMargins(5,25,15,5);