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?

27
demandé sur Cimbali 2009-10-22 00:10:54

12 réponses

Ce pourrait être une solution:

  1. convertissez postscript en pdf en utilisant ps2pdf
  2. créer un fichier LaTeX et insérer les pages en utilisant le pdfpages package ( \includepdf )
  3. utiliser pagecommand={\thispagestyle{plain}} ou quelque chose de la fancyhdr paquet dans les arguments de \includepdf
  4. si une sortie postscript est requise, convertissez la sortie pdflatex retour à postscript via pdf2ps
13
répondu rcs 2009-10-21 20:43:43

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}
21
répondu Brian M. Hunt 2013-12-10 21:35:33

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é

http://ge.tt/7ctUFfj2

numérotées pdf

http://ge.tt/7ctUFfj2

avec ceci comme premier argument de ligne de commande:

number(start=1, size=40, x=297.5 pt, y=10 pt)
14
répondu Dingo 2017-04-12 18:30:53

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
13
répondu Dario Seidl 2013-11-05 20:34:46

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.

5
répondu Bob 2012-04-25 21:10:44

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é)

2
répondu brinxmat 2009-10-21 21:09:50

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:

enter image description here

2
répondu Johnny Baloney 2016-01-26 16:05:37

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.

1
répondu dirkgently 2009-10-21 20:47:59

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?

1
répondu Mark Hedges 2013-06-03 19:29:29

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.
1
répondu corpsman 2015-05-08 07:03:25

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.

1
répondu mschilli 2017-04-13 12:36:24

Peut-être pstops (partie de psutils ) peut être utilisé pour cela?

0
répondu Filip Korling 2009-10-21 20:23:04