【问题标题】:Trying to split a large .pdf into multiple files. (python, pdftk)试图将一个大的 .pdf 拆分为多个文件。 (蟒蛇,pdftk)
【发布时间】:2012-08-31 19:43:56
【问题描述】:

我用 Python 编写了一个脚本,它将按章节/书签拆分 .pdf。这基本上是我的程序的症结所在:

for each chapter:
    system('pdftk A=file.pdf cat A{start}-{end} output file2.pdf')

该工具包工作得很好,但一遍又一遍地调用它显然不是一项省时的任务。解析一个 200mb 的 .pdf 文件需要 15 到 20 秒的时间,而在大约 30 个单独的章节中解析需要很长时间。打开文件所花费的时间比实际写入任何数据所花费的时间更多。

由于似乎没有在工具包中对多个命令进行字符串处理的固有方法,我可以在 Python 或 CMD 中使用任何内存技巧来解决这个问题(即保持 .pdf 打开) ?如果你能推荐一个,我也会看看另一个模块(pyPdf 有它自己的一系列问题)。

【问题讨论】:

  • 你可以把它全部压缩成一个shell文件吗?
  • Windows 和 Python 2.7。

标签: python split bookmarks pdftk


【解决方案1】:

要将 pdf 文件保存在内存中,请将其读入 StringIO 缓冲区并告诉 pdftk 从标准输入读取。具体来说:使用subprocess.call 而不是os.system,将StringIO 缓冲区作为stdin 参数:

mybuffer = StringIO.StringIO(open('file.pdf').read())
subprocess.call('pdftk ...', stdin=mybuffer)

它仍然需要每次重新解析 pdf 文件,但至少您不会过度旋转硬盘驱动器。唯一真正快速的方法是使用可以一次性完成的工具(例如,解决您使用 pypdf 遇到的任何问题)。

【讨论】:

  • 是的,谢谢。标准输入是我正在寻找的。不过,我不能完全让 StringIO 工作,所以我使用 open(PDF) 作为我的缓冲区。这是可怕的礼仪还是什么?
  • `open(PDF)' 是一个打开的文件流,我认为传递它没有任何问题。如果它有效,请享受它!不过,我很惊讶它给了您很大的加速,因为您只能获得 i/o 库提供的有限缓冲。你得到正确的输出了吗?
  • 附言。我包含的 sn-p 为您的整个文件创建了一个 StringIO 缓冲区。你有什么不能去上班的?
  • 是的,似乎工作正常。它不仅在连续操作中更快,而且在单个操作中也更快,这让我认为,除了将文件保存在内存中之外,还有其他东西有助于加快速度(pdftk 不擅长打开文件?不知道)。
  • 这是我在使用 StringIO 时遇到的错误:AttributeError: StringIO instance has no attribute 'fileno'
【解决方案2】:

例如,如果您有一个包含 20000 页的 input.pdf 文件,并且您希望将其拆分为 1..20.pdf 文件,每个文件包含 1000 页。

for (( i=0; i<=20; i++ )); do let n=$i*1000; let m=$[i+1]*1000; pdftk input.pdf cat $n-$m output $i.pdf; done;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2013-11-28
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多