1

我正在通过编辑某些单词并在 pymupdf 的编辑区域顶部添加不同的单词来编辑 pdf。

该代码成功运行,但是它生成了一个非常大的单页 pdf (9MB)。我认为这是因为绘制了许多形状和编辑,但我似乎无法重构。

从这篇文章中知道我不应该page.apply_redactions()多次申请,但如果我不这样做,文本不会正确显示在编辑方块的顶部,或者它会引发ValueError: fill rect must be finite and not empty.

任何帮助重构较小的输出 pdf 将不胜感激。

    doc = fitz.open(self.path) 
    # get pdf background colour
    col = fitz.utils.getColor("py_color")
    # iterating through pages 
    for page in doc: 

        page.wrap_contents()
        # geting the rect boxes which consists the matching regex 
        sensitive = self.get_sensitive_data(page.getText("text") 
                                            .split('\n')) 
        for data in sensitive: 
            areas = page.searchFor(data) 
            for area in areas:
                text_page = page.get_textpage(clip=area)
                text_page = text_page.extractDICT(area)
                # text_page = area
                max_length = fitz.getTextlength(str(max(column, key=len)), fontsize=fontsize)+14
                area = format_border(page, area, data, fontsize, align=align, max_length=max_length)
                area.y1 = add_yrect_line(column, area.y1, area.y1-area.y0)
                col = fitz.utils.getColor("white")
                redaction = page.addRedactAnnot(new_area, fill=col, text=" ") #flags not available
                page.apply_redactions()  # page.apply_redations(images=fitz.PDF_REDACT_IMAGE_NONE) to circumvent transparent image issues
                writer = fitz.TextWriter(page.rect, color=color)
                # align to top of box if align right:
                writer.fill_textbox(new_area, variable, fontsize=fontsize, warn=True, align=align, font=font)
                writer.write_text(page)
                # To show what happened, draw the rectangles, etc.
                shape = page.newShape()
                shape.drawRect(new_area)  # the rect within which we had to stay
                shape.finish(stroke_opacity=0)  # show in red color
                shape.commit()

                shape = page.newShape()
                shape.drawRect(writer.text_rect)  # the generated TextWriter rectangle
                shape.drawCircle(writer.last_point, 2)  # coordinates of end of text
                shape.finish(stroke_opacity=0)  # show with blue color
                shape.commit()
                writer = fitz.TextWriter(area, color=color)
4

1 回答 1

2

如果不了解您正在处理的 PDF 页面的更多详细信息,这有点难以分辨。然而,插入文本或绘图不会增加大量数据。所以我认为应用编辑可能会导致问题:如果您的页面包含与您的任何编辑矩形重叠的图像,apply_redactions()(没有参数!)将修改重叠的图像部分并将它们空白......这将发生在每个图像和它的每一个重叠!结果是每个图像的未压缩的新 PNG 版本。因此,您应该尝试以下方法之一:

  • 不要触摸任何图像:使用page.apply_redactions(images=fitz.PDF_REDACT_IMAGE_NONE)
  • 删除至少有一个重叠的每个图像(可能是不希望的):page.apply_redactions(images=fitz.PDF_REDACT_IMAGE_REMOVE)
  • 或者,至少garbage=3, deflate=True在保存文件以压缩修改后的图像时使用。

实际上,在这些类型的操作之后,您应该始终使用垃圾收集和压缩。

于 2021-02-25T04:35:31.787 回答