web-dev-qa-db-fra.com

Fractionner un PDF avec Ghostscript

J'essaie de scinder une page PDF de plusieurs pages avec Ghostscript et j'ai trouvé la même solution sur plusieurs sites et même sur ghostscript.com , à savoir:

gs -sDEVICE=pdfwrite -dSAFER -o outname.%d.pdf input.pdf

Mais cela ne semble pas fonctionner pour moi, car il produit un fichier, avec Toutes les pages, et nommé outname.1.pdf.

Lorsque j'ajoute les pages de début et de fin, cela fonctionne bien, mais je veux que cela fonctionne sans connaître ces paramètres.

Dans l'archive gs-devel, j'ai trouvé une solution à cela: http://ghostscript.com/pipermail/gs-devel/2009-avril/008310.html -- aime le faire sans pdf_info.

Lorsque j'utilise un périphérique différent, par exemple pswrite, mais que les mêmes paramètres Fonctionnent correctement, ils produisent autant de fichiers ps que le contient mon input.pdf.

Est-ce normal lorsque vous utilisez pdfwrite? Est-ce que je fais quelque chose de mal?

25
zseder

Ce que vous voyez est un comportement "normal": la version actuelle du périphérique de sortie pdfwrite de Ghostscript ne prend pas en charge cette fonctionnalité. Ceci est également (certes, vaguement) documenté dans Use.htm :

"Notez cependant que la fonctionnalité d'une page par fichier peut ne pas être prise en charge par tous les périphériques ...."

Je crois me souvenir que l’un des développeurs de Ghostscript a mentionné sur IRC qu’ils pourraient ajouter cette fonctionnalité à pdfwrite dans une version ultérieure, mais qu’il semble nécessiter une réécriture majeure du code, raison pour laquelle ils n'ont pas encore fait ...


Mise à jour: Comme l'indiquait déjà le commentaire de Gordon, à partir de version 9.06 (publié le 31 juillet 2012), Ghostscript prend désormais en charge la ligne de commande citée dans la question, également pour pdfwrite. (Gordon doit avoir découvert le support non officiel de cela déjà dans 9.05, ou il a compilé son propre exécutable à partir des sources de pré-release qui n’avaient pas encore été étiquetées comme 9.06).

10
Kurt Pfeifle

J'ai trouvé ce script écrit par M. Weimer super utile:

#!/bin/sh
#
# pdfsplit [input.pdf] [first_page] [last_page] [output.pdf] 
#
# Example: pdfsplit big_file.pdf 10 20 pages_ten_to_twenty.pdf
#
# written by: Westley Weimer, Wed Mar 19 17:58:09 EDT 2008
#
# The trick: ghostscript (gs) will do PDF splitting for you, it's just not
# obvious and the required defines are not listed in the manual page. 

if [ $# -lt 4 ] 
then
        echo "Usage: pdfsplit input.pdf first_page last_page output.pdf"
        exit 1
fi
yes | gs -dBATCH -sOutputFile="$4" -dFirstPage=$2 -dLastPage=$3 -sDEVICE=pdfwrite "$1" >& /dev/null

Origine de: http://www.cs.virginia.edu/~weimer/pdfsplit/pdfsplit

enregistrez-le sous le nom pdfsplit.sh, voyez que la magie se produit.

PDFSAM pourrait également faire le travail. Disponible sur Windows et Mac.

19
Juanito Fatas
 #!/bin/bash
#where $1 is the input filename

ournum=`gs -q -dNODISPLAY -c "("$1") (r) file runpdfbegin pdfpagecount = quit" 2>/dev/null`
echo "Processing $ournum pages"
counter=1
while [ $counter -le $ournum ] ; do
    newname=`echo $1 | sed -e s/\.pdf//g`
    reallynewname=$newname-$counter.pdf
    counterplus=$((counter+1))
    # make the individual pdf page
    yes | gs -dBATCH -sOutputFile="$reallynewname" -dFirstPage=$counter -dLastPage=$counter -sDEVICE=pdfwrite "$1" >& /dev/null
    counter=$counterplus
done
5
John Ostrowick

Voici un script pour la commande Windows Invite (fonctionnant également avec le glisser-déposer) en supposant que Ghostscript soit installé:

@echo off
chcp 65001
setlocal enabledelayedexpansion

rem Customize or remove this line if you already have Ghostscript folders in your system PATH
set path=C:\Program Files\gs\gs9.22\lib;C:\Program Files\gs\gs9.22\bin;%path%

:start

echo Splitting "%~n1%~x1" into standalone single pages...
cd %~d1%~p1
rem getting number of pages of PDF with GhostScript
for /f "usebackq delims=" %%a in (`gswin64c -q -dNODISPLAY -c "(%~n1%~x1) (r) file runpdfbegin pdfpagecount = quit"`) do set "numpages=%%a"

for /L %%n in (1,1,%numpages%) do (
echo Extracting page %%n of %numpages%...
set "x=00%%n"
set "x=!x:~-3!"
gswin64c.exe -dNumRenderingThreads=2 -dBATCH -dNOPAUSE -dQUIET -dFirstPage=%%n -dLastPage=%%n -sDEVICE=pdfwrite -sOutputFile="%~d1%~p1%~n1-!x!.pdf" "%1"
)

shift
if NOT x%1==x goto start

pause

Nommez ce script quelque chose comme split PDF.bat et mettez-le sur votre bureau. Glissez-déposez un (ou plusieurs) multipage PDF dessus pour créer un fichier autonome PDF pour chaque page de votre PDF, en ajoutant le suffixe -001, -002, etc. au nom à distinguer. les pages.

Vous devrez peut-être personnaliser (avec la version appropriée de Ghostscript) ou supprimer la ligne set path=... si vous avez déjà des dossiers Ghostscript dans la variable d’environnement PATH de votre système.

Cela fonctionne pour moi sous Windows 10 avec Ghostscript 9.22.

Prendre plaisir.

2
mmj

Voici un script python simple qui le fait:

#!/usr/bin/python3

import os

number_of_pages = 68
input_pdf = "abstracts_rev09.pdf"

for i in range(1, number_of_pages +1):
    os.system("gs -q -dBATCH -dNOPAUSE -sOutputFile=page{page:04d}.pdf"
              " -dFirstPage={page} -dLastPage={page}"
              " -sDEVICE=pdfwrite {input_pdf}"
              .format(page=i, input_pdf=input_pdf))
1
Adobe