C# 如何将pdf页面中文本的坐标从左下角更改为左上角

C# 如何将pdf页面中文本的坐标从左下角更改为左上角,c#,pdf,itext,coordinates,pdfbox,C#,Pdf,Itext,Coordinates,Pdfbox,我正在使用PDFBOX和itextsharp dll处理pdf文件。 这样我就得到了矩形内文本的文本坐标。矩形坐标是使用itextsharp.dll提取的。 基本上,我从itextsharp.dll获取矩形坐标,其中itextsharp使用坐标系作为左下角。我从PDFBOX获取pdf页面文本,PDFBOX使用坐标系作为左上角。 我需要帮助将坐标从左下角转换为左上角 更新我的问题 如果您不理解我的问题,如果没有提供完整的信息,请原谅 好吧,让我试着从一开始就提供更多细节 我正在开发一个工具,在这个

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

更新我的问题

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

好吧,让我试着从一开始就提供更多细节

我正在开发一个工具,在这个工具中,我得到了一个PDF,其中一个矩形是使用注释部分中的一些绘图标记绘制的。现在我正在使用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,一个矩形的第一个原点位于左下,因为从PDFBOX返回的文本坐标的原点位于左上。然后我意识到我需要调整y轴,以便原点从左下移动到左上。最后,我得到了页面的高度和cropbox的高度

iTextSharp.text.Rectangle mediabox = reader.GetPageSize(page_no);
iTextSharp.text.Rectangle cropbox = reader.GetCropBox(page_no);
做了一些基本的调整

lly=mediabox.Top-lly

ury=mediabox.Top-ury

在某些情况下,调整起了作用,而在某些PDF中,需要对cropbox进行调整

lly=cropbox.Top-lly

ury=cropbox.Top-ury

在某些PDF上,它不起作用


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

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

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

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

y = 842 - y;
现在
y1=36
y2=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返回的结果不同。关注更多信息

这些都是最后的调整完成的

Y'=Ymax-Y.X'=X-Xmin.Hmm,首先我想说的是,
X'=X-Xmin
在这个上下文中是不相关的,但如果PdfBox“这样想”的话,可能是这样的。我将再次更新我的答案。据我所知,PDFBox用于文本提取
          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;

            }