所以,我试图解析一个PDF文件(30000x2000点),使用Python,其中有各种数据,表格,线条,文本,注释,图像等.The goal:在PDF上找到某个文本字符串,并返回一个接近文本的注释.我用PyPDF2找到所有的笔记和它们的坐标.为了找到文本字符串和它们的坐标,我使用fitz.

Using fitz, I searched for 'A715_X1'.

import fitz    
doc = fitz.open(path_pdf)
    for page in doc:
        coordinates_of_item_found_on_print = page.search_for('A715_X1')

Result: X coordinate: 9076 points

Then, using PyPDF2, I searched for the 'Some text here' note.

from PyPDF2 import PdfReader

reader = PdfReader(sample.pdf)
for page in reader.pages:
    if "/Annots" in page:
        for annot in page["/Annots"]:
            obj = annot.get_object()
            markup_coordinates = obj['/Rect']
            if obj['/Subtype'] == '/FreeText': # skip Stamp, Popup, Square, PolyLine
                if obj['/Contents'] == 'Some text here':
                    try:
                        markup_loc.append(str(round(markup_coordinates[0])))
                        print('Note: ' + obj['/Contents'] + ' X-coord: ' + str(round(markup_coordinates[0])))
                    except Exception as e:
                        print(e)

Result: Note: Some text here X-coord: 4280

我附上了一个来自PDFXchange的屏幕截图,显示‘A715_X1’就在‘一些文本’注释的正下方,所以X坐标应该大致相同+-几个点.从输出上看,根据尺子的线条,9076似乎是一个"真正的"价值.那为什么我会得到两个不同的坐标?

示例pdf:

example pdf

推荐答案

没有你的最小样本,我不得不模拟一个空白文件,幸运的是,你的图像提供了足够的信息来进行反复试验,以计算位置和方向.

这就是我们的模拟.我们可以看到/Mediabox大小是相同的.这个水平尺寸超出了传统页面允许的大小,因此Acrobat一直在抱怨我之前的try .

我试了十几次才让它离你的最近.显然,如果没有您现有的转换,我的注释将略有不同,但我的观点是正确的.

enter image description here

那么,在try 得到正确的差值时,我知道和学到了什么呢?

  1. 我知道传统上一页不能超过14,400点.因此,为了模拟更大的空间,我们需要向上扩展该大小的介质,因此在本例中,最大的14400(PaperSpace)被分配给UserUnit2.12.

仿真值应接近运算单位.

12 0 obj
<</Annots[14 0 R]/Contents 15 0 R/MediaBox[0 0 14400 1124.15]/Parent 6 0 R/Resources<</ExtGState<</GS0 16 0 R>>>>/Type/Page/UserUnit 2.12>>
endobj

现在我们可以看到,如果我们将注释的实际位置(4281pt不带刻度)乘以该标量,则得到4281x2.12=9,075.72,这是zoom /媒体中左上角在X上的标称偏移量.

实际上,批注(包括表单域)与页面内容的比例或基准没有任何关系.它们可以有自己的坐标标量值,因此zoom /旋转/移动页面内容通常会 destruct 相对位置.幸运的是,在这种情况下,他们使用的是一个已知的历史系统.

Python相关问答推荐

将特定列信息移动到当前行下的新行

C#使用程序从Python中执行Exec文件

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

在np数组上实现无重叠的二维滑动窗口

递归访问嵌套字典中的元素值

当我try 在django中更新模型时,模型表单数据不可见

在Python中调用变量(特别是Tkinter)

通过追加列表以极向聚合

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

如何在Python Pandas中填充外部连接后的列中填充DDL值

如何合并具有相同元素的 torch 矩阵的行?

删除特定列后的所有列

修改.pdb文件中的值并另存为新的

在Pandas 中以十六进制显示/打印列?

如何在表单中添加管理员风格的输入(PDF)

Pandas:使列中的列表大小与另一列中的列表大小相同

为什么这个正则表达式没有捕获最后一次输入?

生产者/消费者-Queue.get by list

保存由PYTHON在EXCEL中所做更改的问题