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

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

谢谢。

最佳答案

摆脱现有页面内容的图形状态变化

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

new PDPageContentStream(document, page,true,true);

这个构造函数实现为:

this(document, sourcePage, appendContent, compress, false);

即它用三个 boolean 调用构造函数使用 false 的参数最后一个。这个 final boolean参数记录为:

* @param resetContext Tell if the graphic context should be reseted.

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

new PDPageContentStream(document, page, true, true, true);

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

绘制矩形并测试

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

结果

Screenshot of result

正如预期的那样。

必须解释输入坐标的含义

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

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

此外,OP 无法共享文档

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

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

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

关于java - 如何使用pdfbox在java中的pdf页面的特定位置绘制字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24991474/

相关文章:

java - 如何区分复选框字段和一组单选按钮

java - 在 SWT 中实现自定义折叠/展开行为的编码习惯

java - 为什么我使用 try catch 时会出现错误

iPhone、CGPDF文档 - PDF 链接

r - 将带有火星和金星符号的 R 图另存为 pdf

VBA:Acrobat 运行时错误 429; ActiveX 组件无法创建对象

java - 用java粗略指南填写excel或pdf

java - 在 pdfbox 2.00 中使用 PDFMergerUtility 合并文档

java - 没有内置方法的十进制到二进制程序

java - 在 Java 中,我可以声明一个 HashMap 常量吗?