Как быстро разбить файл PDF на отдельные страницы (например, из командной строки терминала)?

23

У меня есть файл PDF длиной 6 страниц, который я хочу разделить на 1.pdf, 2.pdf, 3.pdf и т. Д.

Предварительный просмотр не работает для этого на удивление (если я что-то упустил).

Я хотел бы иметь возможность выполнить эту простую задачу из командной строки, но на этом этапе я возьму все, что выполнимо (без загрузки схематичного программного обеспечения)

К вашему сведению http://users.skynet.be/tools/ не работает так, как рекламируется.

user391339
источник
2
Хорошее решение командной строки из этого SE ответа . Вы можете установить ghostscript, используя Homebrew .
Фидели

Ответы:

21

Откройте PDF в предварительном просмотре, а затем в меню просмотра выберите эскизы. Ctrl выберите страницы, которые вы хотите, теперь перетащите их на рабочий стол.

eleethesontai
источник
1
Это сработало хорошо. Это заняло у меня около 30 секунд, после примерно 30 минут. Некоторые люди используют эту технику вместе с Automator, но я еще не пробовал.
user391339
35

Это может быть достигнуто с помощью pdfseparate. Вы можете установить попплер с помощью homebrew, путем brew install poppler. Это также установит pdfseparate. Для того, чтобы разделить PDF document.pdfна на отдельные страницы 1.pdf, 2.pdfи т.д. Использование:

pdfseparate document.pdf %d.pdf
ttq
источник
1
Только что установлен popplerдень назад, чтобы иметь возможность конвертировать PDF документы в SVG с pdf2svg. Не заметил, что popplerидет с pdfseparateкомандой. Поскольку принятый выше ответ (перетаскивание всех страниц PDF с предварительным просмотром на рабочий стол) требует от меня «щелкнуть мышью», и поскольку мне нравятся решения на терминале, которые работают автоматически с помощью одной командной строки, pdfseparateэто как раз то, что мне нужно. Большое спасибо за этот совет!
Арвид
Интересно, что pdfseparate создает PDF-файлы, общий размер которых намного больше размера исходного PDF-файла. У меня был документ на 400 страниц с 1,9 МБ. После разделения я получил что-то около 60 МБ.
Константин
5

Если вы заинтересованы в этом из командной строки, вы можете посмотреть на скрипт Python splitPDF Бенджамина Хана, чтобы сделать эту работу. Например:

splitPDF.py in.pdf 3 5

разделит файл in.pdfна 3 файла, разделив их на страницы 3 и 5.

Жан-Филипп Пелле
источник
Это хорошо, и немного более гибко в том, что вы можете выводить, чем в pdf отдельно. Хотя это в основном для разделения pdf на куски страниц, если вы хотите разделить каждую страницу, вы можете легко использовать seqдля создания диапазона чисел в вашей команде. Благодарность!
dgig
1
что-то вроде python splitPDF.py MyPDF.pdf $(seq -s ' ' 1 10 411)сработало для меня
dgig
1
Слова отличные. Я подтверждаю , что это работает непосредственно на MacOS 10.13.3
MichaelCodes
1

Для другой альтернативы, смотрите этот ответ . Это использует инструменты командной строки ImageMagick .

convert x.pdf -quality 100 -density 300x300 x-%04d.pdf

Тем не менее, вы должны быть осторожны с качеством.

pheon
источник
1

Если вы хотите извлечь диапазон страниц, вы можете использовать следующий скрипт, который вы называете следующим образом (предполагается, что вы сохраняете его в файле pdfextract.py где-нибудь в PATH вашей системы, например / usr / local / bin, и назначаете его выполнение разрешение с помощью chmod 744 pdfextract.py):

pdfextract.py - файл / путь / к / большому / pdf - файл / путь / к / новый / pdf --start --stop

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import argparse
import os
import subprocess as sp


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--file-in', required=True, type=str, dest='file_in')
    parser.add_argument('--file-out', required=True, type=str, dest='file_out')
    parser.add_argument('--start', required=True, type=int, dest='start', default=-1)
    parser.add_argument('--stop', required=True, type=int, dest='stop', default=-1)

    args = parser.parse_args()
    assert os.path.isfile(args.file_in)
    assert not os.path.isfile(args.file_out)

    # remove temporary files
    for el in os.listdir('/tmp'):
        if os.path.isfile(os.path.join('/tmp', el)) and el[:12] == 'pdfseparate-':
            os.remove(os.path.join('/tmp', el))

    sp.check_call('pdfseparate -f {:d} -l {:d} {:s} /tmp/pdfseparate-%d.pdf'.format(args.start, args.stop, args.file_in), shell=True)

    cmd_unite = 'pdfunite '
    for i in range(args.start, args.stop + 1):
        cmd_unite += '/tmp/pdfseparate-{:d}.pdf '.format(i)
    cmd_unite += args.file_out
    sp.check_call(cmd_unite, shell=True)

    # remove temporary files
    for el in os.listdir('/tmp'):
        if os.path.isfile(os.path.join('/tmp', el)) and el[:12] == 'pdfseparate-':
            os.remove(os.path.join('/tmp', el))


if __name__ == "__main__":
    main()
Константин
источник