将 PDF 拆分为每个文档,每个文档包含几页

将 PDF 拆分为每个文档,每个文档包含几页

网络上有多种资源解释了如何将 PDF 拆分为多个文件(每个文件一页)。

但如何将它们分成几块,比如每块五页呢?我已经研究了标准工具,例如pdftk但找不到执行我想要的操作的选项。

答案1

pdftk能够有效地剪切一组固定的页面。通过一些脚本胶水,这可以满足我的要求:

number=$(pdfinfo -- "$file" 2> /dev/null | awk '$1 == "Pages:" {print $2}')
count=$((number / pagesper))
filename=${file%.pdf}

counter=0
while [ "$count" -gt "$counter" ]; do 
  start=$((counter*pagesper + 1));
  end=$((start + pagesper - 1));

  counterstring=$(printf %04d "$counter")
  pdftk "$file" cat "${start}-${end}" output "${filename}_${counterstring}.pdf"

  counter=$((counter + 1))
done

这假设您有每个块的页数$pagesper以及源 PDF 的文件名$file

如果你已经acroread安装了,还可以使用

acroread -size a4 -start "$start" -end "$end" -pairs "$file" "${filename}_${counterstring}.ps"

acroread-toPostScript提供可能有用的选项。

答案2

另请参阅pdfseparatepdfunite来自poppler-utilspdfseparate将文件分成每页一个文件,这使得以后可以相对容易地pdfunite手动或(半)自动地重新组装。

就像 zsh 一样:

autoload zargs

reunite() pdfunite "$@" file-$1-$argv[-1].pdf

pdfseparate file.pdf p%d
zargs -n 5 p<->(n) -- reunite
rm -f p<->

会分裂file.pdffile-p1-p5.pdf, file-p6-p10.pdf...

答案3

我发现Python与PyPdf 库对于那些 pdftk 不方便(或根本不)做的工作来说很方便。

#!/usr/bin/env python
import sys
from pyPdf import PdfFileWriter, PdfFileReader

# Command line parsing
if len(sys.argv) < 2 or sys.argv[1][-4:] != '.pdf':
    sys.stderr.writeln('Usage: ' + sys.argv[0] + ''' FILE.pdf N
Split FILE.pdf into chunks of N pages each.''')
    exit(3)
pages_per_file = int(sys.argv[2])

base_name = sys.argv[1][:-4] + '-'
input_pdf = PdfFileReader(open(sys.argv[1]))
output_pdf = PdfFileWriter()
num_pages = input_pdf.getNumPages()
for i in xrange(num_pages):
    output_pdf.addPage(input_pdf.getPage(i))
    if (i + 1) % pages_per_file == 0 or i + 1 == num_pages:
        output_file = open(base_name + str(i / pages_per_file + 1) + '.pdf', "wb")
        output_pdf.write(output_file)
        output_file.close()
        output_pdf = PdfFileWriter()

答案4

拉斐尔发布的解决方案是有缺陷的:如果页面数量不均匀,则最后一页将被忽略。这是一个改进的解决方案,也适用于奇数页面。再次假设您有每个块的页数$pagesper以及源 PDF 的文件名$file

number=$(pdfinfo -- "$file" 2> /dev/null | awk '$1 == "Pages:" {print $2}')

count=$((($number+$pagesper-1)/$pagesper))
filename=${file%.pdf}

counter=0
while [ "$count" -gt "$counter" ]; do
  start=$((counter*pagesper + 1));
  end=$((start + pagesper - 1));
  if [ $end -gt $number ]; then
    end=$number
  fi

  counterstring=$(printf %04d "$counter")
  pdftk "$file" cat "${start}-${end}" output "${filename}_${counterstring}.pdf"
  counter=$((counter + 1))
done

相关内容