java - 为什么在 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 之间得到了相同的值。我没有用各种字体和子集对此进行测试,所以它可能并不总是真的很难。
解决方案
推荐阅读
- oracle - 在异常处理程序中处理异常
- swift - 如何在不保存的情况下捕获视频?
- java - 如何使用密码在 JReJSON 中创建特定主机/将客户端发布到特定主机/发布?
- java - LWJGL 3 : StackGet() 用法
- javascript - javascript 对象字段输入值 [object Object] 而不是字符串 Reactjs
- c# - 通过 Telegram API 客户端发送位置
- ios - 绑定和状态不会同时更新
- sql - Oracle SQL:从一组订单中仅选择包含某些类型的订单
- lua - Lua - “字符串到十六进制”和“十六进制到字符串”公式
- angular - Angular:从其他组件中的 HasChangesGuard 获取响应