pdf-generation - gsview - https www ghostscript com download gsdnld html
Dividiendo un PDF con Ghostscript (5)
Intento dividir un PDF multipágina con Ghostscript, y encontré la misma solución en más sitios e incluso en ghostscript.com , a saber:
gs -sDEVICE=pdfwrite -dSAFER -o outname.%d.pdf input.pdf
Pero parece que no me funciona, 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, entonces está funcionando bien, pero quiero que funcione sin conocer esos parámetros.
En el archivo gs-devel, encontré una solución para esto: http://ghostscript.com/pipermail/gs-devel/2009-April/008310.html , pero tengo ganas de hacerlo sin pdf_info
.
Cuando uso un dispositivo diferente, por ejemplo pswrite
, pero los mismos parámetros, funciona correctamente, produciendo tantos archivos ps, como contiene mi input.pdf .
¿Es esto normal cuando se usa pdfwrite
? ¿Estoy haciendo algo mal?
Aquí hay un script para el símbolo del sistema de Windows (que también funciona con arrastrar y soltar) asumiendo que tiene instalado Ghostscript:
@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
Asigne un nombre a este script como split PDF.bat
y split PDF.bat
en su escritorio. Arrastre y suelte una (o incluso más) PDF multipágina en ella y creará un archivo PDF independiente para cada página de su PDF, agregando el sufijo -002
, -002
y así sucesivamente al nombre para distinguir las páginas.
Es posible que deba personalizar (con la versión relevante de Ghostscript) o eliminar la línea set path=...
si ya tiene carpetas de Ghostscript en su variable de entorno PATH del sistema.
Funciona para mí en Windows 10 con Ghostscript 9.22.
Disfrutar.
Aquí hay un simple script en python 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))
Encontré este script escrito 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 desde: http://www.cs.virginia.edu/~weimer/pdfsplit/pdfsplit
pdfsplit.sh
como pdfsplit.sh
, mira que sucede la magia.
PDFSAM también podría hacer el trabajo. Disponible en Windows y Mac.
Lo que ve es un comportamiento "normal": la versión actual del dispositivo de salida pdfwrite
de Ghostscript no admite esta función. Esto también está (es cierto, vagamente) documentado en Use.htm :
"Tenga en cuenta, sin embargo, que la característica de una página por archivo puede no ser compatible con todos los dispositivos ..."
Me parece recordar que uno de los desarrolladores de Ghostscript mencionó en IRC que podrían agregar esta característica a pdfwrite en una versión futura, pero parece que es necesario reescribir un código importante, por lo que aún no lo han hecho ...
Actualización: Como ya se indicó en el comentario de Gordon, a partir de la versión 9.06 (lanzada el 31 de julio de 2012), Ghostscript ahora admite 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 ya en 9.05, o compiló su propio ejecutable de las fuentes de prelanzamiento que aún no estaban etiquetadas como 9.06).
#!/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