如何使用pdfbox在java的pdf页面上的特定位置绘制字符串?

byr*_*ddy 1 java pdf pdfbox

我有一个pdf坐标(x,y)作为输入.我需要在给定的输入坐标处绘制一个字符串[例如: - (x,y)=(200,250)].我正在使用pdfbox,当我使用下面的方法moveTextPositionByAmount我没有得到确切的位置.即使我尝试使用moveTo().请帮我如何在准确的位置画出弦?

PDPageContentStream contentStream = new PDPageContentStream(document, page,true,true);
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
contentStream.moveTextPositionByAmount(xindex, yindex);
contentStream.setNonStrokingColor(color);
contentStream.drawString(comment);                      
contentStream.stroke();
contentStream.endText();
Run Code Online (Sandbox Code Playgroud)

谢谢.

mkl*_*mkl 10

从现有页面内容中删除图形状态更改

您使用PDPageContentStream带有两个boolean参数的构造函数:

new PDPageContentStream(document, page,true,true);
Run Code Online (Sandbox Code Playgroud)

此构造函数实现为:

this(document, sourcePage, appendContent, compress, false);
Run Code Online (Sandbox Code Playgroud)

即它使用三个boolean参数调用构造函数false用于最后一个.最后的boolean论证记录为:

* @param resetContext Tell if the graphic context should be reseted.
Run Code Online (Sandbox Code Playgroud)

因此,您可以在不重置图形上下文的情况下附加到页面内容.这意味着对现有页面内容中完成的当前变换矩阵的任何更改仍会转换您的坐标.为了防止这种情况发生,你应该使用PDPageContentStream带有三个boolean参数的构造函数:

new PDPageContentStream(document, page, true, true, true);
Run Code Online (Sandbox Code Playgroud)

使用这个可以轻松定位文本.

绘制矩形并进行测试

OP提到他成功绘制了矩形但没有绘制文本.

以下代码

PDPage firstPage = allPages.get(0);
PDRectangle pageSize = firstPage.findMediaBox();

float x = 121;
float y = 305;
float w = 262;
float h = 104;

PDPageContentStream contentStream = new PDPageContentStream(document, firstPage, true, true, true);

contentStream.setNonStrokingColor(Color.yellow);
contentStream.fillRect(pageSize.getLowerLeftX() + x, pageSize.getLowerLeftY() + y, w, h);

contentStream.beginText();
contentStream.moveTextPositionByAmount(pageSize.getLowerLeftX() + x, pageSize.getLowerLeftY() + y);
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
contentStream.setNonStrokingColor(Color.red);
contentStream.drawString("My Text Here");
contentStream.endText();
contentStream.close();
Run Code Online (Sandbox Code Playgroud)

结果是

结果截图

正如所料.

必须解释输入坐标的含义

OP 在他的评论中还提到了X:-121,Y:-305,W:-262,h:-104作为外部应用程序的坐标.

由于PDF通常在媒体框内部具有正坐标,因此这些X和Y坐标对于PDF通常没有意义.

此外,OP 无法共享该文件.

因此,无法确定这些负坐标是否对他的特殊PDF有意义.

此外,矩形绘制操作接受宽度和高度的负值,但如果用于文本,它们可能意味着Y坐标不表示基线,或者预期文本不是从X开始而是在那里结束,或者文本应该被镜像,或者,或者......

因此,必须首先解释那些负坐标和尺寸的含义.哪个是这些坐标的原点,是上面或下面的正y坐标,是矩形左下角的X,Y,负宽度或高度的含义是什么,其中相对于X,Y应该是字符串是画?