微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# iText7 文本坐标提取问题

如何解决C# iText7 文本坐标提取问题

我正在使用 iText7 处理 PDF 文本提取器,并注意到某个 PDF 上的奇怪文本坐标。大多数文档似乎在页面的高度和宽度内产生 x 和 y 坐标,但似乎产生负数。我想知道这里是否有处理负坐标的标准方法。这种基本方法是使用 PDF 中的正英寸测量值,并将它们映射到 iText7 提取的文本和坐标,每点英寸的比例值为 1/72。

我是从 LocationTextExtractionStrategy 派生出来的,代码如下:

        private class LocationTextListStrategy : LocationTextExtractionStrategy
        {
            private readonly List<TextRect> _textRects = new List<TextRect>();

            public List<TextRect> TextRects() => _textRects;

            public override void EventOccurred(IEventData data,EventType type)
            {
                if (!type.Equals(EventType.RENDER_TEXT))
                    return;

                var renderInfo = (TextRenderInfo)data;
                var text = renderInfo.GetCharacterRenderInfos();

                foreach (var t in text)
                {
                    if (string.IsNullOrWhiteSpace(t.GetText()))
                        continue;

                    AddTextRect(t);
                }
            }

            private void AddTextRect(TextRenderInfo t)
            {
                var letterStart = t.GetBaseline().GetStartPoint();
                var letterEnd = t.GetAscentLine().GetEndPoint();

                var newTextRect = new TextRect(
                    text: t.GetText(),l: letterStart.Get(0),r: letterEnd.Get(0),t: letterEnd.Get(1),b: letterStart.Get(1));
                
                _textRects.Add(newTextRect);
            }
        }

解决方法

每个 PDF 页面都可以有自己的自定义坐标系。原点在页面左下角很常见,但不是必须的。

类型 价值
MediaBox 矩形 (必需;可继承) 一个矩形(见 7.9.5,“矩形”),以默认用户空间单位表示,用于定义页面所在的物理介质的边界显示或打印(见 14.11.2,“页面边界”)。
裁剪框 矩形 (可选;可继承) 一个矩形,以默认用户空间单位表示,用于定义默认用户空间的可见区域。当页面被显示或打印时,其内容应被剪裁(裁剪)到这个矩形(见 14.11.2,“页面边界”)。默认值:MediaBox的值。

(ISO 32000-2:2017,表 31 — 页面中的条目)

因此,始终根据它们所引用页面的裁剪框来解释坐标。

iText 7 类 PdfPage 具有匹配的 getter。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。