当前位置: 首页 > 知识库问答 >
问题:

如何将PDF页面中文本的坐标从左下更改为左上

容鸿畴
2023-03-14

我正在使用PDFBOX和itextSharp dll并处理pdf。这样我就可以得到矩形内文本的文本坐标。矩形坐标是使用itextsharp.dll.基本上我从itextsharp.dll获得矩形坐标,其中itextSharp使用坐标系统作为左下。我从PDFBOX获得pdf页面文本,其中PDFBOX使用坐标系统作为左上角。我需要帮助将坐标从左下转换为左上角

更新我的问题

如果你不理解我的问题,如果没有提供完整的信息,请原谅。

好吧,让我试着从一开始就给出更多的细节。

我正在开发一个工具,在这个工具中,我得到了一个PDF文件,其中一个矩形是使用注释部分中的一些绘html" target="_blank">图标记绘制的。现在我用iTextsharp读取矩形坐标

PdfDictionary pageDict = pdReader.GetPageN(page_no);
PdfArray annotArray = pageDict.GetAsArray(PdfName.ANNOTS);

其中pdReader是PdfReader。

使用PDFBOX提取页面文本及其坐标。在这里,我创建了一个类pdfBoxTextExtraction,我处理文本和坐标,以便它返回文本和llx、lly、urx、ury“逐行”请逐行注意,而不是逐句。

所以我想提取矩形坐标内的文本。当从itextsharp返回的矩形坐标(即,矩形的llx、lly、urx、ury)在左下角有一个原点,而从PDFBOX返回的文本坐标在左上角有一个原点时,我被卡住了。然后我意识到我需要调整y轴,以便原点从左下角移动到左上角。最后,我得到了页面的高度和cropbox的高度

iTextSharp.text.Rectangle mediabox = reader.GetPageSize(page_no);
iTextSharp.text.Rectangle cropbox = reader.GetCropBox(page_no);

做了一些基本的调整

lly=mediabox。顶级的

ury=媒体盒。托普里

在某些情况下,调整是有效的,而在某些PDF中,需要对cropbox进行调整

lly=cropbox。顶级的

ury=cropbox。托普里

而在某些PDF上,这是不起作用的。

我所需要的只是帮助调整矩形坐标,以便我得到矩形内的文本。

共有2个答案

东方和煦
2023-03-14
          if ((mediabox.Top - mediabox.Height) != 0)
            {
                topY = mediabox.Top;
                heightY = mediabox.Height;
                diffY = topY - heightY;
                lly_adjust = (topY - ury) + diffY;
                ury_adjust = (topY - lly) + diffY;
            }
            else if ((cropbox.Top - cropbox.Height) != 0)
            {
                topY = mediabox.Top;
                heightY = cropbox.Top;
                diffY = topY - heightY;
                lly_adjust = (topY - ury) - diffY;
                ury_adjust = (topY - lly) - diffY;

            }
            else
            {

                lly_adjust = mediabox.Top - ury;
                ury_adjust = mediabox.Top - lly;

            }

这些都是最后的调整

卫胜
2023-03-14

PDF中的坐标系在ISO-32000-1中定义。本ISO标准说明X轴向右,而Y轴向上。这是默认设置。这些是iText返回的坐标(在幕后,iText解析所有CTM转换)。

如果要转换iText返回的坐标,以便获得Y轴向下的坐标系中的坐标,例如,可以从页面顶部的Y坐标中减去iText返回的Y值。

例如:假设我们正在处理一个A4页面,其中底部的Y坐标为0,顶部的Y坐标为842。如果您有Y坐标,例如y1=806y2=36,则可以执行以下操作:

y = 842 - y;

现在y1=36y2=806。您刚刚使用简单的高中数学颠倒了Y轴的方向。

根据额外评论进行更新:

每个页面都有一个媒体框。这定义了最重要的页面边界。可能存在其他页面边界,但任何一个都不得超过媒体框(如果超过,则您的PDF违反ISO-32000-1)。

裁剪框定义页面的可见区域。默认情况下(例如,如果缺少裁剪框条目),裁剪框与媒体框重合。

在你的评论中,你说你从高度中减去了llx。这是不正确的llx是左下角的x坐标,而高度是在Y轴上测量的属性,除非页面旋转。您是否检查了页面字典是否有/Rotate值?

您还声称iText返回的值与PdfBox返回的值不匹配。请注意,iText返回的值符合ISO标准定义的坐标系。如果PdfBox不遵循此标准,您应该询问PdfBox的人员为什么不遵循该标准,以及他们使用的是什么坐标系。

也许这就是mkl的评论。他写道:

Y'=Ymax-Y.X'=X-Xmin。

也许PdfBox搜索最大Y值Ymax和最小X值Xmin,然后对所有坐标应用上述变换。如果要呈现PDF,这是一个有用的转换,但如果要使用坐标,例如在相对于页面上文本的特定位置添加内容(因为转换后的坐标不再是“PDF”坐标),则执行此类操作是不明智的。

备注:

你说你需要PdfBox来获取页面的文本。你为什么需要这个额外的工具?iText完全能够提取和重新排序页面上的文本(假设您使用了正确的提取策略)。如果没有,请澄清。

  • 请注意,我们最近决定支持Type3字体,尽管我们不认为这是有意义的(请参阅文本提取为空且未知,因为文本使用PDFBox、iText具有Type3字体(困难主题!)理解为什么不)
 类似资料:
  • 根据坐标系,如果只给定矩形的中心坐标以及宽度和高度,您将如何确定矩形的左上角坐标? 例如,矩形的中心坐标是(40,40),矩形的宽度为90,高度为60。

  • 我试图在父div内获得可拖动div的左上角的坐标。我可以在父div中获取鼠标的坐标,这是通过一个标签完成的。我想知道是否有任何类似的标记,例如来获取div的坐标 我使用标签,但它不起作用。

  • 问题内容: 我想使用PDFMiner从PDF文件中提取所有文本框和文本框坐标。 其他许多Stack Overflow帖子都介绍了如何以有序方式提取所有文本,但是我该如何做获取文本和文本位置的中间步骤呢? 给定一个PDF文件,输出应类似于: 问题答案: 换行符在最终输出中转换为下划线。这是我发现的最小工作解决方案。

  • 给定一个包含纵向页面的现有 PDF 文件,我该如何以编程方式(使用 .NET)处理该文件,以便在横向页面上生成具有相同内容的新文件。 新页面应该充分利用可用的横向宽度。页面数量可能会增加,因为现有的纵向页面可能不适合一个横向页面。 背景故事:我们使用Google Sheets REST API来生成pdf文档。如果有很多列,文档可能会很宽。不幸的是,Google Drive REST API总是以

  • 本文向大家介绍如何更改浏览器左上角标题旁的图标?相关面试题,主要包含被问及如何更改浏览器左上角标题旁的图标?时的应答技巧和注意事项,需要的朋友参考一下 意思是修改网站图标 此图标应该为一个 .ico 的图标,常为 16*16 / 24 * 24 通过在 html 头部引入如下标签实现:

  • 假设我想以这样的方式在Java中制作一个按钮,这样当你点击它时,就会出现一个JPopupMenu。它出现的相关代码是,它使JPopupMenu的左上角显示在按钮的中心,如下所示: 不过,我希望它的左下角位于按钮的中心,有点像iTunes的做法(左下角下方有一个按钮,大小与左侧的按钮相同): 我试图通过获取JPopupMenu的高度并将其添加到弹出菜单正在显示的y坐标来实现这一点,但我发现JPopu