如何从左下角到左上角更改pdf页面中文本的坐标

我正在使用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 “逐行”请逐行注意而不是句子明智。

所以我想提取位于Rectangle坐标内的文本。 当从itextsharp返回矩形的坐标时,我陷入困境,即llx,lly,urx,矩形的ury在左下角有一个原点,因为从PDFBOX返回的文本坐标在左上角有一个原点。然后我意识到我需要调整y轴,使原点从左下角移动到左上角。 因为我得到了页面的高度和庄稼的高度

 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。顶级 – 呃

在某些PDF上工作的地方。

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

希望这很清楚。如果不是请原谅我并要求同样的

谢谢

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,这是一个有用的转换,但如果要使用坐标,例如在页面上相对于文本的特定位置添加内容,则执行此类操作是不明智的(因为转换后的坐标为no更长的“PDF”坐标)。

备注:

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

  • 请注意,我们最近决定支持Type3字体,虽然我们不相信这是有道理的(请参阅文本提取是空的,未知文本使用PDFBox,iText(困难主题!)的type3字体,以了解为什么不)。
  • 一些人认为“错误提取”通常可能是对提取内容的“错误解释”,如本邮件列表答案所述: http : //thread.gmane.org/gmane.comp.java.lib.itext.general/66829 /聚焦= 66830
  • 在其他情况下,我们遵循规范,导致结果与PdfBox返回的结果不同。 有关详情, 请访问https://www.youtube.com/watch?v=wxGEEv7ibHE 。
  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; } 

这些都是最后的调整