Почему я получаю разные позиции для извлеченного текста между iText5 и iText7? - PullRequest
1 голос
/ 27 апреля 2020

У меня есть проект java, в котором я читаю PDF и получаю координаты всех букв на каждой странице этого PDF. Сейчас я пытаюсь обновить iText5 до iText7, и координаты не совпадают, даже когда я читаю тот же PDF.

Вот мой код, используемый в iText5:

  private class PageTextRenderListener implements RenderListener {

        public void renderText(TextRenderInfo renderInfo) {
            for (TextRenderInfo tri : renderInfo.getCharacterRenderInfos()) {
                String text = tri.getText().replaceAll(WHITE_SPACE, "");
                if (!text.equals("")) {
                    LineSegment base = tri.getBaseline();
                    LineSegment asc = tri.getAscentLine();
                    LineSegment desc = tri.getDescentLine();

                    final Rectangle2D r0 = base.getBoundingRectange();
                    final Rectangle2D r1 = asc.getBoundingRectange();
                    final Rectangle2D r2 = desc.getBoundingRectange();
                    final Rectangle2D r = r1.createUnion(r2).createUnion(r0);

Код для iText7 выглядит почти так же:

 private class PageTextRenderListener implements IEventListener {

@Override
public void eventOccurred(IEventData iEventData, EventType eventType) {
           List<TextRenderInfo> characterRenderInfos = ((TextRenderInfo) iEventData).getCharacterRenderInfos();
            for (TextRenderInfo tri : characterRenderInfos) {
                String text = tri.getText().replaceAll(WHITE_SPACE, "");
                if (!text.equals("")) {
                    final LineSegment base = tri.getBaseline();
                    LineSegment baseLine = tri.getBaseline();
                    LineSegment ascLine = tri.getAscentLine();
                    LineSegment descLine = tri.getDescentLine();

                    Rectangle r0 = baseLine.getBoundingRectangle();
                    Rectangle r1 = ascLine.getBoundingRectangle();
                    Rectangle r2 = descLine.getBoundingRectangle();


                    final Rectangle r = Rectangle.getCommonRectangle(r0,r1,r2);

У меня проблема в том, что результаты не ' выходит то же самое. Я выследил проблему, чтобы быть в Vector s, которые составляют LineSegment. Если я go и прочитал значения там, координата Y отличается на линии подъема буквы. Как это может быть?

Я также обнаружил, что эта проблема связана со встроенным шрифтом. Если я создаю pdf с использованием iText и встраиваю шрифт, а затем создаю несколько Paragraph с текстом, используя шрифт ebmedded, а некоторые - только базовый шрифт, то текстовые координаты, созданные с помощью встроенного шрифта, различаются. Координаты из текста, который использует базовый шрифт, получили одинаковые значения между iText5 и 7. Я не проверял это со всеми видами шрифтов и подмножеств, поэтому это не всегда может быть правдой.

...