2012-04-19 44 views
20

trato de dividir un PDF de varias páginas con Ghostscript, y me encontré con la misma solución en más sitios e incluso en ghostscript.com, a saber:División de un PDF con Ghostscript

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

Pero no parece estar funcionando para mí, porque produce un archivo, con todas las páginas, y con el nombre outname.1.pdf.

Cuando agrego las páginas de inicio y finalización, funciona bien, pero I quiere que funcione sin conocer esos parámetros.

En el archivo GS-devel, he encontrado una solución para esto: http://ghostscript.com/pipermail/gs-devel/2009-April/008310.html - pero me siento como hacerlo sin pdf_info.

Cuando utilizo un dispositivo diferente, por ejemplo pswrite, pero mismos parámetros, funciona correctamente, produciendo tantos archivos ps, como mi input.pdf contiene.

¿Esto es normal al usar pdfwrite? ¿Estoy haciendo algo mal?

Respuesta

8

Lo que ve es un comportamiento "normal": la versión actual del dispositivo de salida pdfwrite de Ghostscript no es compatible con esta característica. Este es también (aunque, de alguna manera vaga) documentado en Use.htm:

"Tenga en cuenta, sin embargo, que la función de una página por archivo puede no ser compatible con todos los dispositivos ...."

Me parece recordar que uno de los desarrolladores de Ghostscript mencionados en IRC que puede agregar esta característica a pdfwrite en una versión futura, pero parece necesitar una reescritura de código importante, por lo que aún no lo han hecho ...


Actualización: Como comentario de Gordon ya se insinuó, a partir de version 9.06 (publicado el 31 de julio de 2012), Ghostscript ahora es compatible con la línea de comandos como se cita en la pregunta también para pdfwrite. (Gordon debe haber descubierto el soporte no oficial para esto en 9.05, o compiló su propio ejecutable de las fuentes previas a la publicación que aún no estaban etiquetados como 9.06).

+0

Sí, he leído esta línea, pero mi frase "comportamiento normal" quiere significar que "es pdfwrite uno de aquellos que no pueden soportar ¿Esta característica?" Tu recuerdo de este IRC está bien para mí, gracias. – zseder

+3

Para las personas que encuentran esta respuesta en las búsquedas: desde el 9.05, una página por archivo funciona para mí con el comando OP. – Grod

+1

@Gordon: la compatibilidad con la sintaxis '-o out_% d.pdf' (para dividir PDF de varias páginas en archivos individuales por página) se hizo oficial en 9.06. Ya insinué esto en otras respuestas (por ejemplo, * [[Split PDF page multi page en páginas individuales] (http://stackoverflow.com/a/12744923/359307) *). Olvidé actualizar esta respuesta. Gracias por la pista. –

15

me encontré con este script wriiten por el Sr. Weimer super útil:

#!/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 

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

guardarlo como pdfsplit.sh, ver la magia sucede.

PDFSAM también podría hacer el trabajo. Disponible en Windows y Mac.

+0

Increíble. No tengo pdftk y psselect perdería cierta calidad de PDF, pero esto no. – Wok

4
#!/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 
1

Aquí hay un script en Python simple que lo hace:

#!/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)) 
Cuestiones relacionadas