pagina - Cómo agregar números de página a Postscript/PDF
numero pagina pdf (12)
¿Quizás los pstops (parte de psutils ) se pueden usar para esto?
Si tiene un documento grande (500 páginas +) en Postscript y desea agregar números de página, ¿alguien sabe cómo hacerlo?
Además de la solución de captaincomic, la extendí para apoyar el inicio de la numeración de páginas en cualquier página.
Requiere enscript, pdftk 1.43 o mayor y pdfjam (para la utilidad pdfjoin)
#!/bin/bash
input="$1"
count=$2
blank=$((count - 1))
output="${1%.pdf}-header.pdf"
pagenum=$(pdftk "$input" dump_data | grep "NumberOfPages" | cut -d":" -f2)
(for i in $(seq "$blank"); do echo; done) | enscript -L1 -B --output - | ps2pdf - > /tmp/pa$$.pdf
(for i in $(seq "$pagenum"); do echo; done) | enscript -a ${count}- -L1 -F Helvetica@10 --header=''||Page $% of $='' --output - | ps2pdf - > /tmp/pb$$.pdf
pdfjoin --paper letter --outfile /tmp/join$$.pdf /tmp/pa$$.pdf /tmp/pb$$.pdf &>/dev/null
cat /tmp/join$$.pdf | pdftk "$input" multistamp - output "$output"
rm /tmp/pa$$.pdf
rm /tmp/pb$$.pdf
rm /tmp/join$$.pdf
Por ejemplo, coloque esto en /usr/local/bin/pagestamp.sh y ejecute como:
pagestamp.sh doc.pdf 3
Esto iniciará el número de página en la página 3 .. útil cuando tenga hojas de portadas, páginas de título y tabla de contenido, etc.
Lo desafortunado es que la opción de enscript --footer está rota, por lo que no puede obtener la numeración de la página en la parte inferior utilizando este método.
Basado en la solución propuesta de rcs, hice lo siguiente:
Convirtió el documento en example.pdf
y ejecutó pdflatex addpages
, donde addpages.tex
dice:
/documentclass[8pt]{article}
/usepackage[final]{pdfpages}
/usepackage{fancyhdr}
/topmargin 70pt
/oddsidemargin 70pt
/pagestyle{fancy}
/rfoot{/Large/thepage}
/cfoot{}
/renewcommand {/headrulewidth}{0pt}
/renewcommand {/footrulewidth}{0pt}
/begin{document}
/includepdfset{pagecommand=/thispagestyle{fancy}}
/includepdf[fitpaper=true,scale=0.98,pages=-]{example.pdf}
% fitpaper & scale aren''t always necessary - depends on the paper being submitted.
/end{document}
o alternativamente, para páginas a dos caras (es decir, con el número de página consistentemente en el exterior):
/documentclass[8pt]{book}
/usepackage[final]{pdfpages}
/usepackage{fancyhdr}
/topmargin 70pt
/oddsidemargin 150pt
/evensidemargin -40pt
/pagestyle{fancy}
/fancyhead{}
/fancyfoot{}
/fancyfoot[LE,RO]{/Large/thepage}
/renewcommand{/headrulewidth}{0pt}
/renewcommand{/footrulewidth}{0pt}
/begin{document}
/includepdfset{pages=-,pagecommand=/thispagestyle{fancy}}
/includepdf{target.pdf}
/end{document}
Una forma sencilla de cambiar los márgenes del encabezado:
% set margins for headers, won''t shrink included pdfs
% you can remove the topmargin/oddsidemargin/evensidemargin lines
/usepackage[margin=1in,includehead,includefoot]{geometry}
Escribí el siguiente script de shell
para resolver esto para las diapositivas de estilo de beamer
LaTeX
producidas con inkscape
( pdftk cat
las diapositivas juntas en la presentación final en PDF
y luego pdftk cat
los números de diapositivas usando la secuencia de comandos a continuación):
#!/bin/sh
# create working directory
tmpdir=$(mktemp --directory)
# read un-numbered beamer slides PDF from STDIN & create temporary copy
cat > $tmpdir/input.pdf
# get total number of pages
pagenum=$(pdftk $tmpdir/input.pdf dump_data | awk ''/NumberOfPages/{print $NF}'')
# generate latex beamer document with the desired number of empty but numbered slides
printf ''%s'' ''
/documentclass{beamer}
/usenavigationsymbolstemplate{}
/setbeamertemplate{footline}[frame number]
/usepackage{forloop}
/begin{document}
/newcounter{thepage}
/forloop{thepage}{0}{/value{thepage} < ''$pagenum''}{
/begin{frame}
/end{frame}
}
/end{document}
'' > $tmpdir/numbers.tex
# compile latex file into PDF (2nd run needed for total number of pages) & redirect output to STDERR
pdflatex -output-directory=$tmpdir numbers.tex >&2 && pdflatex -output-directory=$tmpdir numbers.tex >&2
# add empty numbered PDF slides as background to (transparent background) input slides (page by
# page) & write results to STDOUT
pdftk $tmpdir/input.pdf multibackground $tmpdir/numbers.pdf output -
# remove temporary working directory with all intermediate files
rm -r $tmpdir >&2
El script lee STDIN
y escribe STDOUT
STDERR
diagnostic pdflatex
output en STDERR
.
Así que solo copia y pega el código anterior en un archivo de texto, digamos enumerate_slides.sh
, hazlo ejecutable ( chmod +x enumerate_slides.sh
) y llámalo así:
./enumerate_slides.sh < input.pdf > output.pdf [2>/dev/null]
Debería ser fácil ajustar esto a cualquier otro tipo de documento ajustando la plantilla LaTeX
para usar las clases de documentclass
, el tamaño del papel y las opciones de estilo adecuadas.
edit: Reemplacé echo
por $(which echo)
ya que en ubuntu
symlinks /bin/sh
to dash
que anula el comando echo
por un intérprete interno, interpreta las secuencias de escape de forma predeterminada y no proporciona la opción -E
para anular este comportamiento. Tenga en cuenta que alternativamente puede escapar de todo /
en la plantilla LaTeX como //
.
editar: Reemplacé $(which echo)
por printf ''%s''
ya que en zsh
, which echo
devuelve echo: shell built-in command
lugar de /bin/echo
. Vea esta pregunta para más detalles sobre por qué decidí usar printf
al final.
Esta podría ser una solución:
- convertir postscript a pdf usando
ps2pdf
- cree un archivo LaTeX e inserte las páginas usando el paquete pdfpages (
/includepdf
) - use
pagecommand={/thispagestyle{plain}}
o algo del paquete fancyhdr en los argumentos de/includepdf
- si se requiere una salida postscript, convierta la salida de
pdf2ps
a postscript viapdf2ps
Intenté con pspdftool ( http://sourceforge.net/projects/pspdftool ).
Finalmente conseguí que funcionara, pero al principio obtuve este error:
pspdftool: xreftable read error
El archivo de origen se creó con pdfjoin de pdfjam, y contenía un conjunto de escaneos de mi Epson Workforce, así como páginas de etiquetas generadas. No pude encontrar una manera de arreglar la tabla de referencias externas, así que convertí a ps con pdf2ps y de vuelta a PDF con pdf2ps. Entonces podría usar esto para obtener buenos números de página en la esquina inferior derecha:
pspdftool ''number(start=1, size=20, x=550 pt, y=10 pt)'' input.pdf output.pdf
Desafortunadamente, significa que las páginas con búsqueda de texto ya no se pueden buscar porque el texto se rasterizó en la conversión ps. Afortunadamente, en mi caso no importa.
¿Hay alguna forma de corregir o vaciar la tabla de referencias externas de un archivo pdf sin perder las páginas en las que se puede buscar?
Me gustó la idea de usar pspdftool ( página man ) pero lo que pspdftool era la página x fuera del formato y el estilo de fuente para que coincida con el resto de la página.
Para conocer los nombres de las fuentes utilizadas en el documento:
$ strings input.pdf | grep Font
Para obtener el número de páginas:
$ pdfinfo input.pdf | grep "Pages:" | tr -s '' '' | cut -d" " -f2
pspdftool
junto con algunos comandos de pspdftool
:
$ in=input.pdf; /
out=output.pdf; /
indent=30; /
pageNumberIndent=49; /
pageCountIndent=56; /
font=LiberationSerif-Italic; /
fontSize=9; /
bottomMargin=40; /
pageCount=`pdfinfo $in | grep "Pages:" | tr -s '' '' | cut -d" " -f2`; /
pspdftool "number(x=$pageNumberIndent pt, y=$bottomMargin pt, start=1, size=$fontSize, font=/"$font/")" $in tmp.pdf; /
pspdftool "text(x=$indent pt, y=$bottomMargin pt, size=$fontSize, font=/"$font/", text=/"page /")" tmp.pdf tmp.pdf; /
pspdftool "text(x=$pageCountIndent pt, y=$bottomMargin pt, size=$fontSize, font=/"$font/", text=/"out of $pageCount/")" tmp.pdf $out; /
rm tmp.pdf;
Aquí está el resultado:
Oh, es un largo tiempo desde que usé PostScript, pero un rápido vistazo al libro azul te dirá :) www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF
Por otro lado, Adobe Acrobat y un poco de javascript también harían maravillas;)
Alternativamente, encontré esto: http://www.ghostscript.com/pipermail/gs-devel/2005-May/006956.html , que parece ajustarse a la factura (no lo intenté)
Solía agregar números de página a mi pdf usando látex como en la respuesta aceptada.
Ahora encontré una manera más fácil: use enscript
para crear páginas vacías con un encabezado que contenga el número de página, y luego use pdftk
con la opción de multistamp
pdftk
para poner el encabezado en su archivo.
Este script bash espera el archivo pdf como su único parámetro:
#!/bin/bash
input="$1"
output="${1%.pdf}-header.pdf"
pagenum=$(pdftk "$input" dump_data | grep "NumberOfPages" | cut -d":" -f2)
enscript -L1 --header=''||Page $% of $='' --output - < <(for i in $(seq "$pagenum"); do echo; done) | ps2pdf - | pdftk "$input" multistamp - output $output
Supongo que está buscando una solución basada en PS. No hay operador de nivel de página en PS que le permita hacer esto. PageSetup
agregar un pie de página, una especie de cosa en la sección de PageSetup
de página para cada página. Cualquier lenguaje de scripting debería poder ayudarte.
Tomé la solución de captaincomic y agregué soporte para nombres de archivos que contenían espacios, además de dar más información sobre el progreso
#!/bin/bash
clear
echo
echo This skript adds pagenumbers to a given .pdf file.
echo
echo This skript needs the packages pdftk and enscript
echo if not installed the script will fail.
echo use the command sudo apt-get install pdftk enscript
echo to install.
echo
input="$1"
output="${1%.pdf}-header.pdf"
echo input file is $input
echo output file will be $output
echo
pagenum=$(pdftk "$input" dump_data | grep "NumberOfPages" | cut -d":" -f2)
enscript -L1 --header=''||Page $% of $='' --output - < <(for i in $(seq "$pagenum"); do echo; done) | ps2pdf - | pdftk "$input" multistamp - output "$output"
echo done.
puedes simplemente usar
pspdftool
De este modo:
pspdftool ''number(x=-1pt,y=-1pt,start=1,size=10)'' input.pdf output.pdf
vea estos dos ejemplos (pdf sin numerar y numerado con pspdftool)
pdf sin numerar
pdf numerado
con esto como el primer argumento de línea de comando:
number(start=1, size=40, x=297.5 pt, y=10 pt)