基于问题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 在他的answer中写道:
如果您的
RenderListener
除了检查文本 与getText()
一起也考虑getBaseline()
或 甚至getAscentLine()
和getDescentLine().
您都拥有 您可能需要的坐标。
实际上,TextRenderInfo有一些LineSegment类的实例,它们提供某种坐标。如何使用这些坐标(通过转换或从中提取适当的值)来准备Rectangle对象,以便可以删除找到的文本?矩形对象有四个坐标,用于描述给定文本的位置。
可以在SO(Remove text occurrences contained in a specified area with iText )上找到使用Rectangle对象删除字符串(即编辑)的示例
更新
我通过反复试验设法做到了自己想要的,但是我认为这是一种解决方法,而不是适当的解决方案。
@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。不幸的是,这些都不起作用。
答案 0 :(得分:0)
在所有尝试中,您都尝试从单条线(最初是基准线,后来是下降线)构造矩形。通过这种方法,您显然没有矩形的高度,只能猜测。
相反,您应该同时使用下降线和上升线!
例如假设文字是垂直绘制的简化情况:
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);