【问题标题】:PyMuPDF rect uncompatible with reportlab rectPyMuPDF 矩形与 reportlab 矩形不兼容
【发布时间】:2023-01-08 04:13:39
【问题描述】:

我正在尝试绘制从 fitz 使用 reportlab 检测到的文本块框

这是我尝试过的:

doc = fitz.open("demo.pdf")

canvas = Canvas("demo_.pdf", bottomup = True)


def draw_auto_fit_text_block(canvas, x_1, y_1, text_block_width, text_block_height, font_name, font_size, text_content):

    text_block_frame = Frame(x_1, y_1, text_block_width, text_block_height, topPadding = 0, leftPadding = 0, rightPadding = 0, bottomPadding = 0, showBoundary = 1)
    text_block_styles = ParagraphStyle(name = "Normal", fontName = font_name, fontSize = font_size)
    text_block_content = text_content.replace('\n','<br />\n')

    text_block_story = [Paragraph(text_block_content, style = text_block_styles)]
    text_block_story_inframe = KeepInFrame(text_block_width, text_block_height, text_block_story)
    text_block_frame.addFromList([text_block_story_inframe], canvas)

for page in doc:

    page_width = page.rect.width
    page_height = page.rect.height

    print("[page width]", page_width)
    print("[page height]", page_height)

    canvas.setPageSize((page_width, page_height))


    blocks = page.get_text("blocks")
    
    for block in blocks:

        block_content = block[4].replace("\n", " ").replace("- ", "-").strip()

        block_x_0 = block[0]
        block_y_0 = block[1]
        block_x_1 = block[2]
        block_y_1 = block[3]

        block_width = block_x_1 - block_x_0
        block_height = block_y_1 - block_y_0
        
        block_y_0 = page_height - block_y_0
        block_y_1 = page_height - block_y_0


        draw_auto_fit_text_block(canvas, block_x_0, block_y_0, block_width, block_height, font_name = "NimbusRomNo9L-Regu", font_size = 9.0, text_content = block_content)

    canvas.showPage()

canvas.save()

使用此代码,我无法使用正确的框坐标绘制文本。 任何人都可以提供帮助。

这就是我得到的:

原始pdf是:

【问题讨论】:

    标签: python coordinates reportlab


    【解决方案1】:

    问题可能不止一个:

    1. PyMuPDF 几何图形在页面左上角有 (0, 0)!
    2. 不确定 reportlab 在这里是如何工作的,但这是一个现有的 PDF 页面并且可能有非孤立的坐标系设置,所以你可能会在意想不到的地方插入一些东西。

      您至少应该使用page.clean_contents() (fitz.Page method)。这会清除任何此类混乱。 还要确认 reportlab 假定点 (0, 0) 的位置:左上角或左下角。

      只是为了确认,问题不在 PyMuPDF 中。以下代码sn-p:

      In [20]: page=doc[0]
      In [21]: for block in page.get_text("blocks"):
          ...:     page.draw_rect(block[:4], color=fitz.pdfcolor["red"])
          ...:
      In [22]: doc.save("x.pdf")
      

      产生这个:

      因此,最好尝试在传递给 reportlab 的每个矩形中将 PyMuPDF 提供的 y0、y1 替换为 page.rect.height - y0 并将 y1 替换为 page.rect.height - y1

    【讨论】:

    • 来源是传统的 pdfTeX 1.40.21 与 hyperref co-ords 字母大小所以使用 /MediaBox[0 0 612 792] co-ords 应该不是问题但是 /Size 238 太多的对象证明一切都是正常的。所以这个问题似乎与 -Y 相关,需要设置为 792 但是有很多空白被裁剪掉所以猜测有一个次要因素所以对于抽象源是 /F66 9.9626 Tf -323.139 -43.392 Td [(ABSTRA)55(CT)] 相对于之前但标题基于 /F66 11.9552 Tf 133.516 686.127 Td [(学习)基于arxiv.org/pdf/2212.03658.pdf
    猜你喜欢
    • 2017-03-18
    • 2017-03-14
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多