我正在尝试读取单页PDF文件并动态替换其中某些内容(例如日期,页码)。
Here是我的示例PDF文件。
(该文件是使用MS Word
创建的。所有元素都是表格)
我知道我可以使用Acro Form
来做到这一点,但是在Word
中,用户创建模板要简单得多。
在此示例中,我想用当前日期替换{CREATE_DATE}
,{DATA_AREA}
将是内容区域,{PAGE_NUMBER}
将是当前页码。
到目前为止,我所做的是重写ITextExtractionStrategy
并将其作为delegate
传递给GlyphTextEventListener
。
这样,我可以读取每个字符,获取其位置并计算所需的总宽度,然后将每个新页面的结果传递给IEventHandler
。
private void renderText(TextRenderInfo renderInfo) {
if (renderInfo.getText().trim().length() == 0) {
if (text.isEmpty()) {
return;
} else {
LineSegment ascent = renderInfo.getAscentLine();
endX = ascent.getEndPoint().get(0);
endY = ascent.getEndPoint().get(1);
Rectangle rectangle = new Rectangle(initX, initY, endX - initX, endY - initY);
FontFilter fontFilter = new FontFilter(rectangle);
boolean accept = fontFilter.accept(renderInfo, EventType.RENDER_TEXT);
float fontSize;
if (accept) {
fontSize = fontFilter.getFontSize();
}else {
fontSize = 8;
}
SimpleTextWithRectangle textWithRectangle = new SimpleTextWithRectangle(rectangle, text,
fontSize);
textWithRectangleList.add(textWithRectangle);
text = "";
initX = 0; initY = 0; endX = 0; endY = 0;
return;
}
}
LineSegment descent = renderInfo.getDescentLine();
if (text.isEmpty()) { // start word
initX = descent.getStartPoint().get(0);
initY = descent.getStartPoint().get(1);
}
text = text + renderInfo.getText();
}
我想要实现的是获取边界(如果可能的话,确定线条),以便我可以定义数据区域。
谢谢。
答案 0 :(得分:0)
我找到了可以为我提供帮助的解决方案。
我的解决方案是覆盖RegexBasedLocationExtractionStrategy
,然后实施
eventOccurred
像这样:
public void eventOccurred(IEventData data, EventType type) {
if (data instanceof TextRenderInfo) {
super.eventOccurred(data, type);
} else if (type == EventType.RENDER_PATH) {
readRectangles((PathRenderInfo) data);
} else if (type == EventType.RENDER_IMAGE) {
readImage((ImageRenderInfo) data);
}
}
现在在readRectangles
中,我可以从路径中获取所有行并计算数据区域边界。