Python 如何使用pymupdf减小修改后的PDF的大小

Python 如何使用pymupdf减小修改后的PDF的大小,python,pymupdf,Python,Pymupdf,我正在编辑一个pdf,通过在pymupdf中编辑某些单词并在编辑区域的顶部添加不同的单词 该代码工作成功,但它制作了一个非常大的单页pdf(9MB)。我想这是因为我画了很多形状和密文,但我似乎无法重构 我知道我不应该多次应用page.apply_redactions(),但如果我不这样做,文本就不能正确显示在被编辑的方块上,或者它会引发ValueError:fill rect必须是有限的,而不是空的 如果您能为较小的pdf输出提供重构方面的帮助,我们将不胜感激 doc=fitz.open(sel

我正在编辑一个pdf,通过在pymupdf中编辑某些单词并在编辑区域的顶部添加不同的单词

该代码工作成功,但它制作了一个非常大的单页pdf(9MB)。我想这是因为我画了很多形状和密文,但我似乎无法重构

我知道我不应该多次应用
page.apply_redactions()
,但如果我不这样做,文本就不能正确显示在被编辑的方块上,或者它会引发
ValueError:fill rect必须是有限的,而不是空的

如果您能为较小的pdf输出提供重构方面的帮助,我们将不胜感激

doc=fitz.open(self.path)
#获取pdf背景颜色
col=fitz.utils.getColor(“py_color”)
#遍历页面
对于文档中的页面:
page.wrap_contents()
#获取包含匹配正则表达式的rect框
sensitive=self.get\u sensitive\u数据(page.getText(“text”)
.split('\n'))
对于敏感数据:
区域=第页。搜索(数据)
对于区域中的区域:
文本页面=页面。获取文本页面(剪辑=区域)
text\u page=text\u page.extractDICT(区域)
#文本页面=区域
max_length=fitz.getTextlength(str(max(column,key=len)),fontsize=fontsize)+14
区域=格式\边框(页面、区域、数据、字体大小、对齐=对齐、最大长度=最大长度)
area.y1=add_yrect_行(列,area.y1,area.y1 area.y0)
col=fitz.utils.getColor(“白色”)
编校=页面。addRedactAnnot(新建区域,填充=列,文本=”)#标志不可用
page.apply_redactions()#page.apply_redactions(images=fitz.PDF_REDACT_IMAGE_NONE)可避免透明图像问题
writer=fitz.TextWriter(page.rect,color=color)
#如果右对齐,则对齐到方框顶部:
writer.fill_文本框(新_区域,变量,fontsize=fontsize,warn=True,align=align,font=font)
编写器。编写文本(第页)
#要显示发生了什么,请绘制矩形等。
shape=page.newShape()
shape.drawRect(新区域)#我们必须呆在其中的区域
shape.finish(笔划_不透明度=0)#以红色显示
shape.commit()
shape=page.newShape()
shape.drawRect(writer.text_rect)#生成的TextWriter矩形
shape.drawCircle(writer.last_点,2)#文本结尾的坐标
shape.finish(笔划_不透明度=0)#以蓝色显示
shape.commit()
writer=fitz.TextWriter(面积,颜色=颜色)

如果不了解您正在处理的PDF页面的更多详细信息,就有点难说了。 但是,插入文本或图形不会增加高数据量。因此,我认为应用修订可能会导致以下问题: 如果页面包含与任何编校矩形重叠的图像,则
应用编校()。。。这将发生在每个图像及其每个重叠处!结果是每个图像的未压缩新PNG版本。
因此,您应该尝试以下方法之一:

  • 不要触摸任何图像:使用
    页面。应用\u修订(images=fitz.PDF\u REDACT\u IMAGE\u NONE)
  • 删除至少有一个重叠的图像(可能是不需要的):
    页面。应用编校(images=fitz.PDF\u REDACT\u image\u remove)
  • 或者,在保存文件以压缩修改后的图像时,至少使用
    garbage=3,deflate=True

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

谢谢您的帮助,不要接触有帮助的图像-我应该更具体地回答我的问题:应用密文然后在顶部呈现文本的过程是“在文本上书写”的最有效方式吗,还是有更好的办法?我尝试了其他几种组合,但大多数渲染的矩形也位于新文本的顶部(包括在末尾应用密文)。@polymath-我还想邀请您参加我的存储库的“讨论”。可以指定直接使用注释替换文本。我还没有看到您使用
text=”“
的原因。