Cómo agregar números de página a Postscript / PDF
-
05-07-2019 - |
Pregunta
Si tienes un documento grande (500 páginas +) en Postscript y quieres agregar números de página, ¿alguien sabe cómo hacerlo?
Solución
Esto podría ser una solución:
- convertir postscript a pdf usando
ps2pdf
- cree un archivo LaTeX e inserte las páginas con 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 pdflatex a postscript a través de
pdf2ps
Otros consejos
Basado en la solución propuesta por rcs, hice lo siguiente:
Convirtió el documento a example.pdf
y ejecutó pdflatex addpages
, donde se lee addpages.tex
:
\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 de dos caras (es decir, con el número de página de manera consistente 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}
Manera fácil 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}
simplemente puedes usar
pspdftool
de esta manera:
pspdftool 'number(x=-1pt,y=-1pt,start=1,size=10)' input.pdf output.pdf
vea estos dos ejemplos (no numerados y numerados pdf 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)
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 la página, y luego use pdftk
con la opción multistamp
para colocar el encabezado en su archivo .
Este script de bash espera el archivo pdf como ú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
Además de la solución de Captaincomic, la he ampliado para admitir el inicio de la numeración de páginas en cualquier página.
Requiere enscript, pdftk 1.43 o superior 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 ejecútelo como:
pagestamp.sh doc.pdf 3
Esto iniciará el número de página en la página 3. Es útil cuando tiene portadas, páginas de títulos y tabla de contenido, etc.
Lo desafortunado es que la opción de pie de página de enscript está rota, por lo que no puedes obtener la numeración de la página en la parte inferior con este método.
Hace mucho tiempo que no uso PostScript, pero una rápida introducción en el libro azul te lo 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 encajar en la factura (no lo intenté)
Probé pspdftool ( http://sourceforge.net/projects/pspdftool ).
Eventualmente lo puse a funcionar, pero al principio recibí este error:
pspdftool: xreftable read error
El archivo de origen se creó con pdfjoin desde pdfjam y contenía un montón de escaneos de mi Epson Workforce, así como también 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 volví 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 de 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 referencia de referencia de un archivo pdf sin perder en qué páginas se pueden buscar?
Me gustó la idea de usar pspdftool ( página de manual ) pero lo que buscaba era página x sin formato y y el estilo de fuente para que coincida con el resto de la página.
Para conocer los nombres de fuente utilizados 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
Pégalo con algunos comandos 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:
Supongo que usted está buscando una solución basada en PS. No hay un operador de nivel de página en PS que te permita hacer esto. Debe agregar una especie de pie de página en la sección PageSetup
para cada página. Cualquier lenguaje de scripting debería poder ayudarte.
Tomé la solución de Captaincomic y agregué soporte para los nombres de archivos que contienen espacios, además de brindar 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.
Escribí el siguiente script shell
para resolver esto para diapositivas de estilo LaTeX
beamer
producidas con inkscape
(I pdftk cat
las diapositivas juntas en la presentación final PDF
& amp; luego agregue los números de diapositivas utilizando el siguiente script):
#!/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
& amp; escribe STDOUT
imprimiendo el diagnóstico pdflatex
a STDERR
.
Así que simplemente copie y pegue el código anterior en un archivo de texto, diga enumerate_slides.sh
, hágalo ejecutable ( chmod + x enumerate_slides.sh
) & amp; 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 la documentclass
, tamaño del papel y amp; opciones de estilo.
edit:
Reemplacé echo
por $ (que echo)
ya que en ubuntu
symlinks / bin / sh
a dash
que anula el comando echo
por una shell interna interpretando las secuencias de escape por defecto & amp; no proporciona la opción -E
para anular este comportamiento. Tenga en cuenta que, alternativamente, podría escapar de todos los \
en la plantilla de LaTeX como \\
.
edit:
Reemplacé $ (which echo)
por printf '% s'
desde que en zsh
, , que echo
devuelve echo: comando incorporado de shell
en lugar de / bin / echo
.
Consulte esta pregunta para obtener detalles sobre por qué decidí usar printf
al final.
¿Quizás se pueden usar pstops (parte de psutils ) para esto?