首页 > 解决方案 > 为什么在 iText5 和 iText7 之间提取文本的位置不同?

问题描述

我有一个 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组成LineSegment. 如果我去读取那里的值,则 Y 坐标在字母的上升线上会有所不同。这个怎么可能?

我还发现这个问题与嵌入的字体有关。如果我使用 iText 创建 pdf 并嵌入字体,然后Paragraph使用 ebmedded 字体创建一些带有文本的 s,而一些仅使用基本字体,那么使用嵌入字体制作的文本坐标会有所不同。使用 basefont 的文本坐标在 iText5 和 7 之间得到了相同的值。我没有用各种字体和子集对此进行测试,所以它可能并不总是真的很难。

标签: javafontsitextitext7

解决方案


推荐阅读