首页 > 解决方案 > 如何使用 iText 读取 PDF 文件作为模板

问题描述

我正在尝试阅读单页 PDF 文件并动态替换其中的一些内容(即日期、页码)。

是我的示例 PDF 文件。(该文件是用 . 创建的MS Word。所有元素都是表格)

我知道我可以做到这一点,Acro FormWord用户创建模板要简单得多。

在此示例中,我想替换{CREATE_DATE}为当前日期,{DATA_AREA}将是内容区域和{PAGE_NUMBER}当前页码。

到目前为止,我所做的是将其覆盖ITextExtractionStrategy并传递delegateGlyphTextEventListener. 通过这样做,我可以读取每个字符,获取它的位置并计算它所需的总宽度,然后,我将结果传递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();

        }

我想要实现的是获得边界(如果可能的话),这样我就可以定义数据区域。

提前致谢。

标签: javaitext7

解决方案


我找到了一个为我提供线条的解决方案。

我的解决方案是覆盖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我可以从路径中获取所有行并计算数据区域边界。


推荐阅读