Comment ajouter des numéros de page à Postscript / PDF
si vous avez un grand document (500 pages+) en Postscript et que vous voulez ajouter des numéros de page, quelqu'un sait-il comment le faire?
12 réponses
Ce pourrait être une solution:
- convertissez postscript en pdf en utilisant
ps2pdf
- créer un fichier LaTeX et insérer les pages en utilisant le pdfpages package (
\includepdf
) - utiliser
pagecommand={\thispagestyle{plain}}
ou quelque chose de la fancyhdr paquet dans les arguments de\includepdf
- si une sortie postscript est requise, convertissez la sortie pdflatex retour à postscript via
pdf2ps
basé sur la solution proposée par rcs, j'ai fait ce qui suit:
convertit le document en example.pdf
et fit pdflatex addpages
, où addpages.tex
lit:
\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}
ou, à défaut, pour les pages recto verso (c'est-à-dire avec le numéro de la page constamment à l'extérieur):
\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}
manière facile de changer les marges d'en-tête:
% set margins for headers, won't shrink included pdfs
% you can remove the topmargin/oddsidemargin/evensidemargin lines
\usepackage[margin=1in,includehead,includefoot]{geometry}
vous pouvez simplement utiliser
pspdftool
de cette façon:
pspdftool 'number(x=-1pt,y=-1pt,start=1,size=10)' input.pdf output.pdf
voir ces deux exemples (non numérotés et numérotés pdf avec pspdftool)
pdf non numéroté
numérotées pdf
avec ceci comme premier argument de ligne de commande:
number(start=1, size=40, x=297.5 pt, y=10 pt)
j'ai utilisé pour ajouter des numéros de page à mon pdf en utilisant latex comme dans la réponse acceptée.
maintenant j'ai trouvé un moyen plus facile:
Utilisez enscript
pour créer des pages vides avec un en-tête contenant le numéro de page, puis utilisez pdftk
avec l'option multistamp
pour mettre l'en-tête sur votre fichier.
ce script bash attend le fichier pdf comme seul paramètre:
#!/bin/bash
input=""
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
suite à la solution de capitaine Comic, Je l'ai étendu pour supporter le début de la numérotation de page à n'importe quelle page.
nécessite enscript, pdftk 1.43 ou plus et pdfjam (pour pdfjoin utility)
#!/bin/bash
input=""
count=
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
par exemple.. placez ceci dans /usr/local/bin/pagestamp.sh et exécuter comme:
pagestamp.sh doc.pdf 3
le numéro de page commence à la page 3.. utile lorsque vous avez des feuilles de couverture, des pages de titre et une table des matières, etc.
la chose malheureuse est que l'option --footter de enscript est cassée, donc vous ne pouvez pas obtenir la numérotation de page au bas de cette méthode.
Oh, ça fait longtemps que j'ai utilisé postscript, mais un rapide plongeon dans le livre bleu vous dira :) www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF
D'autre part, Adobe Acrobat et un peu de javascript feraient aussi des merveilles;)
alternativement, j'ai trouvé ça: http://www.ghostscript.com/pipermail/gs-devel/2005-May/006956.html , ce qui semble correspondre à la facture (Je ne l'ai pas essayé)
j'ai aimé l'idée d'utiliser pspdftool ( man page ) mais ce que j'ai été après était page x de y format et le style de police pour correspondre au reste de la page.
pour connaître les noms de police utilisés dans le document:
$ strings input.pdf | grep Font
pour obtenir le nombre de pages:
$ pdfinfo input.pdf | grep "Pages:" | tr -s ' ' | cut -d" " -f2
collez-le avec quelques commandes 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;
voici le résultat:
je suppose que vous cherchez une solution basée sur le PS. Il n'y a pas d'opérateur au niveau de la page dans PS qui vous permettra de le faire. Vous devez ajouter un pied de page-sorte de thingy dans la section PageSetup
pour chaque page. N'importe quel langage de script devrait pouvoir vous aider.
j'ai essayé pspdftool ( http://sourceforge.net/projects/pspdftool ).
j'ai fini par le faire fonctionner, mais au début j'ai eu cette erreur:
pspdftool: xreftable read error
le fichier source a été créé avec pdfjoin de pdfjam, et contenait un tas de scans de mon Epson Workforce ainsi que des pages d'étiquettes générées. Je n'ai pas pu trouver un moyen de réparer la table xref, donc j'ai converti en ps avec pdf2ps et de nouveau en pdf avec pdf2ps. Puis J'Ai pourrait utiliser ceci pour obtenir de beaux numéros de page sur le coin inférieur droit:
pspdftool 'number(start=1, size=20, x=550 pt, y=10 pt)' input.pdf output.pdf
malheureusement, cela signifie que n'importe quelles pages de texte-searchable ne sont plus searchable parce que le texte a été rasterized dans la conversion de ps. Heureusement, dans mon cas, il n'a pas d'importance.
y a-t-il un moyen de corriger ou de vider la table xref d'un fichier pdf sans perdre quelles pages sont consultables?
j'ai pris la solution de captaincomic et ajouté un support pour les noms de fichiers contenant des espaces, en plus de donner plus d'informations sur le progrès
#!/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=""
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.
j'ai écrit le script suivant shell
pour résoudre ceci pour LaTeX
beamer
diapositives de style produites avec inkscape
(i pdftk cat
les diapositives ensemble dans la présentation finale PDF
et puis ajouter des numéros de diapositives en utilisant le script ci-dessous):
#!/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
Le script lit STDIN
et écrit STDOUT
impression de diagnostic pdflatex
sortie STDERR
.
donc il suffit de copier-coller le code ci-dessus dans un fichier texte, dire enumerate_slides.sh
, le rendre exécutable ( chmod +x enumerate_slides.sh
) et l'appeler comme ceci:
./enumerate_slides.sh < input.pdf > output.pdf [2>/dev/null]
il devrait être facile de l'ajuster à tout autre type de document en ajustant le modèle LaTeX
pour utiliser le documentclass
approprié , la taille du papier et les options de style.
edit:
J'ai remplacé echo
par $(which echo)
car dans ubuntu
symlinks /bin/sh
à dash
qui supplante la commande echo
par un interpréteur de commandes interne interprétant les séquences d'échappement par défaut et ne fournissant pas l'option -E
pour outrepasser ce comportement. Notez qu'alternativement vous pourriez échapper tous \
dans le modèle de LaTeX comme \
.
edit:
J'ai remplacé $(which echo)
par printf '%s'
car dans zsh
, which echo
retourne echo: shell built-in command
au lieu de /bin/echo
.
Voir cette question pour savoir pourquoi j'ai décidé d'utiliser printf
à la fin.
Peut-être pstops (partie de psutils ) peut être utilisé pour cela?