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

时间:2014-12-31 09:32:09

标签: c# pdf itext coordinates 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 “逐行”请逐行注意而不是句子明智

所以我想提取位于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 .Top - ury

因为某些PDF文件无效。

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

2 个答案:

答案 0 :(得分:1)

PDF中的坐标系在ISO-32000-1中定义。该ISO标准解释了X轴朝向右侧,而Y轴朝向上方。这是默认值。这些是iText返回的坐标(幕后,iText解析所有CTM转换)。

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

示例:假设我们正在处理A4页面,其中底部的Y坐标为0,顶部的Y坐标为842.如果您有Y坐标,例如{ {1}}和y1 = 806,然后就可以执行此操作:

y2 = 36

现在y = 842 - y; y1 = 36。您刚刚使用简单的高中数学来反转Y轴的方向。

根据额外评论进行更新:

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

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

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

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

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

  

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

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

<强>注:

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

答案 1 :(得分:0)

          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;

            }

这些是最后的调整