【发布时间】:2022-06-16 22:12:34
【问题描述】:
我已经构建了一个 pdf 编辑器,它可以以相当强大的方式就地修改 PDF。
只有一个问题:在运行PyPDF2 时,我只能在某些(但不是全部)条件下在DecodedStreamObject 或EncodedStreamObject 中调用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 对象不会写入文件,因为它已在我测试过的 some 但 not all pdf 的情况下设置。这里的想法是让它适用于所有人,因此您的评论在某些层面上听起来很深刻和知识渊博,但它没有帮助。
-
@KJ 我很感激,因为我们中没有多少人在 PDF 上花费了足够的时间来问这种问题。但这确实是一个伪装成 PDF 问题的 PyPDF2 问题。
-
@KJ 公平地说,我需要从“高级”状态显着修改问题。但我正在工作并正在解决问题。
-
我对 PDF 内部知识的了解非常有限——我猜你可能比我知道的更多。这就是为什么我想在开始将更复杂的 PR 合并到 PyPDF2 之前增加测试覆盖率的原因。但是,如果缺少功能:请随意打开 PR :-) github 上的 pubpub-zz 目前正在火中 ????
-
@MartinThoma 哈哈,棒极了——我看看能不能让它再次工作