Pregunta

Si tienes un documento grande (500 páginas +) en Postscript y quieres agregar números de página, ¿alguien sabe cómo hacerlo?

¿Fue útil?

Solución

Esto podría ser una solución:

  1. convertir postscript a pdf usando ps2pdf
  2. cree un archivo LaTeX e inserte las páginas con el paquete pdfpages ( \ includepdf )
  3. use pagecommand = {\ thispagestyle {plain}} o algo del paquete fancyhdr en los argumentos de \includepdf
  4. 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

http://ge.tt/7ctUFfj2

pdf numerado

http://ge.tt/7ctUFfj2

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:

 ingrese la descripción de la imagen aquí

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top