Как читать PDF файл как шаблон, используя iText - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь прочитать одностраничный файл 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();

        }

Я пытаюсь получить границы (если возможно, линии), чтобы я мог определить область данных.

Заранее спасибо.

1 Ответ

0 голосов
/ 24 июня 2019

Я нашел решение, предоставляющее мне строки.

Мое решение - переопределить 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 Я могу получить все строки из пути и рассчитать границы области данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...