Jak mogę szybko podzielić plik PDF na pojedyncze strony (tj. Z wiersza poleceń terminalu)?

23

Mam plik PDF o długości 6 stron, który chcę podzielić na 1.pdf, 2.pdf, 3.pdf itp.

Zaskakująco nie działa podgląd (chyba że czegoś mi brakuje).

Chciałbym móc wykonać to proste zadanie z wiersza poleceń, ale w tym momencie wezmę wszystko, co pozwoli wykonać zadanie (bez pobierania szkicowego oprogramowania)

FYI http://users.skynet.be/tools/ nie działa zgodnie z reklamą.

użytkownik391339
źródło
2
Dobre rozwiązanie wiersza polecenia pochodzi z tej odpowiedzi SE . Możesz zainstalować ghostscript za pomocą Homebrew .
fideli

Odpowiedzi:

21

Otwórz pdf w podglądzie, a następnie w menu widoku wybierz miniatury. Ctrl wybierz strony, które chcesz teraz, przeciągnij i upuść je na pulpicie.

eleethesontai
źródło
1
To działało dobrze. Zajęło mi to około 30 sekund po tym, jak wymachiwałem około 30 minut. Niektórzy używają tej techniki w połączeniu z Automatorem, ale jeszcze jej nie wypróbowałem.
user391339,
35

Można to osiągnąć za pomocą pdfseparate. Możesz zainstalować poppler z homebrew, wg brew install poppler. To również się zainstaluje pdfseparate. Aby podzielić PDF document.pdfdo do pojedynczych stron 1.pdf, 2.pdfitp zastosowanie:

pdfseparate document.pdf %d.pdf
ttq
źródło
1
Właśnie zainstalowałem popplerdzień temu, aby móc konwertować dokumenty PDF na SVG za pomocą pdf2svg. Nie zauważyłem, że popplerpochodzi z pdfseparatepolecenia. Ponieważ powyższa zaakceptowana odpowiedź (przeciąganie i upuszczanie wszystkich stron PDF z podglądem na pulpit) wymaga ode mnie „kliknięcia”, a ponieważ lubię rozwiązania w terminalu, które działają automatycznie za pomocą pojedynczej linii poleceń, pdfseparateto jest dokładnie to, czego potrzebuję. Wielkie dzięki za podpowiedź!
Arvid,
Co ciekawe, pdfseparate produkuje pliki pdf, których całkowity rozmiar jest znacznie większy niż rozmiar oryginalnego pliku pdf. Miałem 400-stronicowy dokument z 1,9 MB. Po podzieleniu mam około 60 MB.
Konstantin,
5

Jeśli chcesz to zrobić z wiersza poleceń, możesz zajrzeć do skryptu Pythona splitPDF Benjamina Hana, aby wykonać zadanie. Na przykład:

splitPDF.py in.pdf 3 5

podzieli plik in.pdfna 3 pliki, dzieląc na stronach 3 i 5.

Jean-Philippe Pellet
źródło
Jest to dobre i nieco bardziej elastyczne w tym, co możesz wydrukować, niż pdf oddzielne powyżej. Chociaż służy głównie do dzielenia pliku pdf na fragmenty stron, jeśli chcesz podzielić każdą stronę, możesz łatwo użyć seqdo wygenerowania zakresu liczb w swoim poleceniu. Dzięki!
dgig 22.04.16
1
coś python splitPDF.py MyPDF.pdf $(seq -s ' ' 1 10 411)dla mnie
zadziałało
1
Słowa świetne. Potwierdzam, działa bezpośrednio na MacOS 10.13.3
MichaelCodes
1

Aby uzyskać inną alternatywę, zobacz tę odpowiedź . To używa narzędzi wiersza poleceń ImageMagick .

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

Musisz jednak uważać na jakość.

pheon
źródło
1

Jeśli chcesz wyodrębnić zakres stron, możesz użyć następującego skryptu, który wywołujesz w ten sposób (zakładając, że zapiszesz go w pliku pdfextract.py gdzieś na ŚCIEŻCE systemu, np. / Usr / local / bin, i przypisz wykonanie uprawnienie z chmod 744 pdfextract.py):

pdfextract.py - file-in / path / to / large / pdf - file-out / path / to / new / 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()
Konstantin
źródło