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ą.


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.


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

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.


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ść.


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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.