По-видимому, полномочия на /etc/apache2/sites-available
не 777, и это - то, где Вы пишете свой вывод в. Перенаправление обрабатывается отдельно от sudo
, и у Вас нет полномочий записи там. Теперь, нет ничего о /var/www/drupal
там, это, где Вы пытаетесь записать в? Раз так можно или использовать su -c "sed 's/www/www\/drupal/g' default > /var/www/drupal"
или sed 's/www/www\/drupal/g' default | sudo tee drupal
.
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
который может быть полезным.
См. также pdfseparate
и pdfunite
от poppler-utils
. 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
...
#!/bin/zsh
как первая строка. И установка Z Shell, конечно... Те детали не могли бы быть очевидны для новичков.
– Leonardo Castro
11.04.2017, 22:02
Я нахожу 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()
Traceback (most recent call last): File "./dividePDF.py", line 23, in <module> if (i + 1) % pages_per_file == 0: flush() File "./dividePDF.py", line 18, in flush output_pdf.write(output_file) UnboundLocalError: local variable 'output_pdf' referenced before assignment
– Leonardo Castro
11.04.2017, 15:47
Traceback (most recent call last): File "./dividePDF.py", line 20, in <module> for i in xrange(input_pdf.getNumPages(input_pdf)): TypeError: getNumPages() takes exactly 1 argument (2 given)
Таким образом, я изменился input_pdf.getNumPages(input_pdf)
кому: input_pdf.getNumPages()
и получил другую ошибку.
– Leonardo Castro
11.04.2017, 15:49
Решение, размещенное Рафаэлем, ошибочно: если у вас нечетное количество страниц, то последние просто проигнорированы. Там есть улучшенное решение, которое работает и с неравномерным количеством страниц.
Опять же, предполагается, что у вас есть количество страниц на кусок в $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