PDFを複数のファイル(各ページ)に分割する方法を説明するさまざまなリソースがWeb上にあります。
しかし、どのようにそれぞれ5ページの塊に分けることができますか?次の標準ツールを見てみましたが、目的のタスクを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
次のトピックpdfseparate
も参照してください。pdfunite
poppler-utils
。ファイルをページごとに1つのファイルに分割すると、後で手動または(半分)自動的に再組み立てするのがpdfseparate
比較的簡単です。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.pdf
に分割されますfile-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
Raphaelが投稿したソリューションには欠陥があります。ページ数が不均一である場合、最後のページは無視されます。これは奇数ページでも機能する改善されたソリューションです。各ブロックのページ数$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