java - 获取 PDF 中的确切字符串位置,以便稍后用于更改它
问题描述
基于问题的答案Get the exact Stringposition in PDF我现在可以获取 PDF 文件中的所有字符串。请看一下代码:
PdfReader reader = new PdfReader("file.pdf");
RenderListener listener = new MyTextRenderListener();
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
parser.processContent(1, listener);
static class MyTextRenderListener implements RenderListener {
@Override
public void renderText(TextRenderInfo renderInfo) {
String text = renderInfo.getText(); // line with text
}
@Override
public void beginTextBlock() { }
@Override
public void endTextBlock() { }
@Override
public void renderImage(ImageRenderInfo renderInfo) { }
}
mkl在他的回答中写道:
如果您
RenderListener
除了检查文本之外getText()
还考虑getBaseline()
或什getAscentLine()
至并且getDescentLine().
您拥有您可能需要的所有坐标。
事实上,TextRenderInfo有一些LineSegment类的实例,它们给出了某种坐标。如何使用这些坐标(通过转换或从中提取适当的值)来准备一个Rectangle对象,以便可以删除找到的文本?一个矩形对象有四个坐标来描述给定文本的位置。
可以在 SO 找到使用 Rectangle 对象删除字符串(即编辑)的示例(使用iText 删除指定区域中包含的文本出现 )
更新
我设法通过反复试验完成了我想做的事情,但我认为这是一种解决方法,而不是一个合适的解决方案。
@Override
public void renderText(TextRenderInfo renderInfo) {
LineSegment baseline = renderInfo.getBaseline();
float x = baseline.getStartPoint().get(Vector.I1);
float y = baseline.getStartPoint().get(Vector.I2);
float xx = baseline.getEndPoint().get(Vector.I1);
float yy = baseline.getEndPoint().get(Vector.I2);
rectangle = new Rectangle(x, yy, xx, y + 5);
}
现在我有一个 Rectangle 对象(请注意,我通过使用坐标将 5 添加到其坐标之一,以便它们覆盖所有字符串),我现在可以编辑文本。当没有图像时,它适用于单一颜色(例如白色)。当文本在图像上或页面颜色与黑色不同时,它将失败。这就是为什么我将我的解决方案描述为一种解决方法。对我来说,最好将文本空白(用空字符串替换它)。如何做到这一点?
对 mkl 评论的回应 不确定,如果我做得对:
LineSegment descentLine = renderInfo.getDescentLine();
float x = descentLine.getStartPoint().get(Vector.I1);
float y = descentLine.getStartPoint().get(Vector.I2);
float xx = descentLine.getEndPoint().get(Vector.I1);
float yy = descentLine.getEndPoint().get(Vector.I2);
rectangle = new Rectangle(xx, yy, x, y);
我也以同样的方式使用了 ascentLIne。不幸的是,这些都没有奏效。
解决方案
在您的所有尝试中,您都尝试从一条线构造矩形,最初是基线,后来是下降线。使用这种方法,您显然没有矩形的高度,只能猜测。
取而代之的是,您应该同时使用下降线和上升线!
例如,假设文字直立的简化情况:
LineSegment ascentLine = renderInfo.getAscentLine();
LineSegment descentLine = renderInfo.getDescentLine();
float llx = descentLine.getStartPoint().get(Vector.I1);
float lly = descentLine.getStartPoint().get(Vector.I2);
float urx = ascentLine.getEndPoint().get(Vector.I1);
float ury = ascentLine.getEndPoint().get(Vector.I2);
rectangle = new Rectangle(llx, lly, urx, ury);
推荐阅读
- javascript - 将表格单元格转换为 dataTables 后无法访问表格单元格
- java - 避免条件的清洁方法
- php - 如何通过 PHP 和 DB 中的 INSERT 为 HTML 表单中的单个名称传递多个值
- javascript - 如何使用 JavaScript 更新选定的选项值
- java - 部署 Angular 5 springboot 多模块项目 -jar
- java - JSP - 实例化 servlet 类时出错
- css - z-index 似乎不起作用
- git - 将 pushurl 添加到 git 子模块
- javascript - 为什么示例中的 d3 bar chard 无法在浏览器中显示?
- c# - 如何在多线程应用程序中持续检查互联网连接?