【问题标题】:How does one save a modified PyPDF2 object and write out the new, modified PDF to drive?如何保存修改后的 PyPDF2 对象并写出新的、修改后的 PDF 来驱动?
【发布时间】:2022-06-16 22:12:34
【问题描述】:

我已经构建了一个 pdf 编辑器,它可以以相当强大的方式就地修改 PDF。

只有一个问题:在运行PyPDF2 时,我只能在某些(但不是全部)条件下在DecodedStreamObjectEncodedStreamObject 中调用setData

对于特定的 pdf,我如何确保 pypdf2 公开的 DecodedStreamObject 实例是可设置的?

这可能是:

  • 将 pdf 完全读入内存
  • 创建具有所有权限的临时 pdf
  • ...或介于两者之间的任何东西

基本点是有一些快乐的路径可以设置 pdf 的流对象;但是,我不确定该状态是什么或如何确保每次都存在该状态。


为了让这个问题更具体,这里是我用来修改 pdf 页面的代码模式:

### get the content
pdf_content = page.getContents()

### adjust the contents...
data = pdf_content.get_data()
encoding = chardet.detect(data)['encoding']
decoded_data = data.decode(encoding)
success, fn_output = fn(decoded_data)
if success and decoded_data != fn_output:
     fn_output_encoded = fn_output.encode(encoding)
     if pdf_content.decoded_self is not None:
         pdf_content.decoded_self.set_data(fn_output_encoded)
     else:
         pdf_content.set_data(fn_output_encoded)  # not yet supported
return success, pdf_content

### and updating the page...
success, new_contents = cls.data_processor(page.getContents(), cls.subst_fn(subst_expressions), global_=True)

page[NameObject('/Contents')] = new_contents

writer.addPage(page)

【问题讨论】:

  • @KJ 我不确定这是否有意义。我有一个从硬盘驱动器中提取的 PyPDF2 流式提取,它被读取到 PyPDF2 写入器上。我以纯文本形式修改解码的结构 pdf 数据并将其放入 PyPDF2 解码流对象中。我在解码流对象中检测到(并 PR'd)了一个错误。但是,PyPDF2 对象不会写入文件,因为它已在我测试过的 somenot all pdf 的情况下设置。这里的想法是让它适用于所有人,因此您的评论在某些层面上听起来很深刻和知识渊博,但它没有帮助。
  • @KJ 我很感激,因为我们中没有多少人在 PDF 上花费了足够的时间来问这种问题。但这确实是一个伪装成 PDF 问题的 PyPDF2 问题。
  • @KJ 公平地说,我需要从“高级”状态显着修改问题。但我正在工作并正在解决问题。
  • 我对 PDF 内部知识的了解非常有限——我猜你可能比我知道的更多。这就是为什么我想在开始将更复杂的 PR 合并到 PyPDF2 之前增加测试覆盖率的原因。但是,如果缺少功能:请随意打开 PR :-) github 上的 pubpub-zz 目前正在火中 ????
  • @MartinThoma 哈哈,棒极了——我看看能不能让它再次工作

标签: pdf pypdf2


猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2012-02-07
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
相关资源
最近更新 更多