Разделите PDF на документы с несколькими страницами каждый

По-видимому, полномочия на /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.

7
05.03.2013, 16:25
4 ответа

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 который может быть полезным.

12
27.01.2020, 20:13
  • 1
    Посмотрите здесь для большего количества полноценного внедрения. –  Raphael 11.05.2015, 23:45

См. также 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...

9
27.01.2020, 20:13
  • 1
    Хороший. Это создает много временных файлов, все же. –  Raphael 06.03.2013, 08:46
  • 2
    , Этот сценарий работал отлично со мной после понимания, что я должен добавить #!/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()
3
27.01.2020, 20:13
  • 1
    я получаю эту ошибку: 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
  • 2
    Перед этим я получал эту ошибку: 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
  • 3
    @LeonardoCastro спасибо за отчет об ошибках, я исправил сценарий. –  Gilles 'SO- stop being evil' 13.04.2017, 03:50
  • 4
    я просто использовал этот сценарий с N=4, но первый "блок" всегда имел 3 страницы вместо 4. Следующие блоки были в порядке. Я изменил порядок строк "если (я + 1) % pages_per_file == 0: сброс ()" и "output_pdf.addPage (input_pdf.getPage (i))" и это работало правильно. –  Leonardo Castro 19.06.2017, 23:01
  • 5
    @LeonardoCastro Еще раз спасибо, я зафиксировал это немного отличающимся способом и исправил ошибку, когда последний файл короче, потому что число страниц не является несколькими из размера блока. –  Gilles 'SO- stop being evil' 19.06.2017, 23:18

Решение, размещенное Рафаэлем, ошибочно: если у вас нечетное количество страниц, то последние просто проигнорированы. Там есть улучшенное решение, которое работает и с неравномерным количеством страниц. Опять же, предполагается, что у вас есть количество страниц на кусок в $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
1
27.01.2020, 20:13

Теги

Похожие вопросы