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