java - 如何使用 iText 读取 PDF 文件作为模板
问题描述
我正在尝试阅读单页 PDF 文件并动态替换其中的一些内容(即日期、页码)。
这是我的示例 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();
}
我想要实现的是获得边界(如果可能的话),这样我就可以定义数据区域。
提前致谢。
解决方案
我找到了一个为我提供线条的解决方案。
我的解决方案是覆盖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
我可以从路径中获取所有行并计算数据区域边界。
推荐阅读
- mysql - WP_查询 | 数组序列化形式的 meta_query 参数元值
- ios - Xcode 12. 将 swift 标准库复制到...错误
- grapesjs - 我如何在grapesjs中设置表单样式?
- java - 运行时在eclipse中找不到主类
- c# - MicrosoftConfigurationBuilders 连接字符串提供程序名称错误(C#、Oracle)
- c# - 而循环实时获取屏幕上的颜色
- python - 在递归def python中打印行素数
- java - 有没有办法通过Java中的子类禁用继承函数的一部分?
- html - 如何将背景颜色填充到父元素的高度?
- c++ - Libcurl multi with libevent:如何支持单 curl_easy 超时机制?