如何使用iText

时间:2019-06-17 05:59:34

标签: java itext7

我正在尝试读取单页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();

        }

我想要实现的是获取边界(如果可能的话,确定线条),以便我可以定义数据区域。

谢谢。

1 个答案:

答案 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中,我可以从路径中获取所有行并计算数据区域边界。