2009-10-21 10 views
27

Se hai un documento di grandi dimensioni (500 pagine +) in Postscript e vuoi aggiungere numeri di pagina, qualcuno sa come farlo?Come aggiungere numeri di pagina a Postscript/PDF

+0

Override del 'operatore showpage' come mostrato in [questa risposta] (http://stackoverflow.com/a/6620599/477035) per una sostanza [domanda duplicato] (http://stackoverflow.com/ q/4766755/477035) – RedGrittyBrick

+0

Vedere [La soluzione molto carina di Alan Munn su TeX SE] (https://tex.stackexchange.com/a/18762/3406). –

risposta

13

questo potrebbe essere un soluzione:

  1. convertire PostScript a PDF utilizzando ps2pdf
  2. creare un file LaTeX e inserire le pagine utilizzando il pacchetto pdfpages (\includepdf)
  3. uso pagecommand={\thispagestyle{plain}} o qualcosa dal pacchetto fancyhdr negli argomenti di \includepdf
  4. se è necessario l'output PostScript, convertire l'output pdflatex in poscritto tramite pdf2ps
+0

Penso che questa sia una grande idea, ma non ho funzionato. I numeri di pagina non inseriscono * sopra * le pagine \ includepdf. –

+0

Hai usato qualcosa come '\ includepdf [pages = -, pagecommand = {\ thispagestyle {plain}}] {document.pdf}'? – rcs

+1

Questo è essenzialmente ciò che Alan Munn fa in [sua soluzione] (https://tex.stackexchange.com/a/18762/3406), meno le cose su PS. –

0

Forse pstops (parte di psutils) può essere utilizzato per questo?

+0

Ho passato un po 'di tempo su questo, e sembra che psutils non lo farà - a meno che mi manchi qualcosa. –

2

Oh, è da molto tempo che ho usato PostScript, ma un rapido tuffo nel libro blu vi dirà :) www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF

D'altra mano, Adobe Acrobat e un po 'di javascript sarebbe anche fare miracoli;)

in alternativa, ho trovato questo: http://www.ghostscript.com/pipermail/gs-devel/2005-May/006956.html, che sembra adattarsi il disegno di legge (non ho provato)

1

Suppongo che tu sia alla ricerca di una soluzione basata su PS. Non esiste un operatore a livello di pagina in PS che ti consenta di farlo. È necessario aggiungere un piè di pagina, una sorta di cosa nella sezione PageSetup per ogni pagina. Qualsiasi linguaggio di scripting dovrebbe essere in grado di aiutarti.

+0

Ho visto una soluzione con Perl in http://www.osti.gov/bridge/product.biblio.jsp?query_id=0&page=0&osti_id=666084 –

21

Sulla base di RCS soluzione proposta, ho fatto quanto segue:

convertito il documento example.pdf e corse pdflatex addpages, dove addpages.tex legge:

\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, in alternativa, per le pagine fronte-retro (cioè con il numero di pagina costantemente all'esterno):

\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} 

Un modo semplice per modificare i margini dell'intestazione:

% set margins for headers, won't shrink included pdfs 
% you can remove the topmargin/oddsidemargin/evensidemargin lines 
\usepackage[margin=1in,includehead,includefoot]{geometry} 
12

Ho usato per aggiungere numeri di pagina al mio pdf utilizzando il lattice come nella risposta accettata.

Ora ho trovato un modo più semplice: Usa enscript per creare pagine vuote con un colpo di testa che contiene il numero di pagina, e quindi utilizzare pdftk con l'opzione multistamp di mettere l'intestazione sul file.

Questo script bash si aspetta che il file pdf in quanto è unico parametro:

#!/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 
+1

avviso per altri utenti: solo dal momento che la build 1.43 pdftk ha * funzionalità multistamp * - riguardo al codice posso suggerire output = "$ {1% 03d.pdf} -header.pdf" per avere l'equalizzazione zero – Dingo

+0

Multistamp è fantastico. Enscript tuttavia non è molto flessibile per questo caso d'uso - Ho cercato di ottenere i numeri di linea centrati nel footer, con il font che voglio ecc ... Quello che ho finito è creare 1000 pagine con il mio word processor, con numeri di linea auto nel footer. Quindi ho solo multi-memoria sui miei file. –

+0

Non funziona per me. Bucle non itera, ho provato hardcoding $ pagenum value, ma niente. – xsubira

12

si può semplicemente utilizzare

pspdftool

in in questo modo:

pspdftool 'number(x=-1pt,y=-1pt,start=1,size=10)' input.pdf output.pdf 

vedi questi due esempi (non numerate e numerati pdf con pspdftool)

pdf numerato

http://ge.tt/7ctUFfj2

pdf numerato

http://ge.tt/7ctUFfj2

con questo come primo argomento della riga di comando:

number(start=1, size=40, x=297.5 pt, y=10 pt) 
+0

Funziona alla grande ma si rompe internamente e collegamenti esterni – jdewit

+1

Parlando di link non funzionanti, questi collegamenti ipertestuali in formato .pdf sono danneggiati. – foobarbecue

+0

scusate, mi impegnerò a sostituire il prima possibile – Dingo

5

seguito alla soluzione di captaincomic, ho esteso per sostenere l'avvio di numerazione delle pagine in qualsiasi pagina.

Richiede enscript, PDFTK 1.43 o superiore e pdfjam (per pdfjoin utility)

#!/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 [email protected] --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 

Per esempio .. Posto questo /usr/local/bin/pagestamp.sh ed eseguire come:

pagestamp.sh doc.pdf 3 

Ciò avvierà il numero di pagina in pagina 3 .. utile quando si dispone di copertine, frontespizi e tabella dei contenuti, ecc

la cosa spiacevole è un'opzione --footer quella enscript è rotto, quindi non è possibile ottenere la numerazione delle pagine in basso usando questo metodo.

1

Ho provato pspdftool (http://sourceforge.net/projects/pspdftool).

alla fine ho preso a lavorare, ma in un primo momento ho ottenuto questo errore:

pspdftool: xreftable read error 

Il file sorgente è stato creato con pdfjoin da pdfjam, e conteneva una serie di scansioni dal mio Workforce Epson così come generata tag pagine. Non riuscivo a capire un modo per sistemare la tabella xref, quindi mi sono convertito in ps con pdf2ps e di nuovo in pdf con pdf2ps. Poi ho potuto usare questo per ottenere i numeri di pagina belle nell'angolo in basso a destra:

pspdftool 'number(start=1, size=20, x=550 pt, y=10 pt)' input.pdf output.pdf 

Purtroppo, ciò significa che tutte le pagine di testo ricercabile non sono ricercabili in quanto il testo è stato rasterizzato nella conversione ps. Fortunatamente, nel mio caso non importa.

C'è un modo per correggere o svuotare la tabella xrif di un file pdf senza perdere quali pagine sono ricercabili?

1

ho preso la soluzione di captaincomic e aggiunto il supporto per i nomi di file contenenti spazi, oltre a dare alcune informazioni sullo stato di avanzamento

#!/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. 
1

ho scritto il seguente shell script per risolvere questo per LaTeXbeamer diapositive stile realizzati con inkscape (I pdftk cat le diapositive insieme nella presentazione finale PDF & quindi aggiungere numeri di diapositiva utilizzando lo script di seguito):

#!/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 

Lo script legge STDIN & scrive STDOUT diagnostica di stampa pdflatex output su STDERR.

Quindi, basta copiare e incollare il codice sopra in un file di testo, dire enumerate_slides.sh, renderlo eseguibile (chmod +x enumerate_slides.sh) & chiamare in questo modo:

./enumerate_slides.sh <input.pdf> output.pdf [2>/dev/null] 

Dovrebbe essere facile da regolare questo a qualsiasi altro tipo del documento regolando il modello LaTeX per utilizzare le opzioni di stile documentclass, formato carta &.

modifica: sostituii echo da $(which echo) poiché in ubuntu simbolici /bin/sh a dash che sostituisce il comando echo da un guscio di sequenze interpretazione esodo interne di default & non fornendo la possibilità -E per ignorare questo comportamento. Nota che in alternativa puoi sfuggire a tutti \ nel modello LaTeX come \\.

edit: ho sostituito $(which echo) da printf '%s' poiché in zsh, which echo rendimenti echo: shell built-in command invece di /bin/echo. Vedere this question per dettagli sul motivo per cui ho deciso di utilizzare printf alla fine.

2

mi piaceva l'idea di usare pspdftool (man page), ma ciò che cercavo era pagina x di formato y e lo stile del carattere per abbinare il resto della pagina.

Per conoscere i nomi dei caratteri utilizzati nel documento:

$ strings input.pdf | grep Font 

Per ottenere il numero di pagine:

$ pdfinfo input.pdf | grep "Pages:" | tr -s ' ' | cut -d" " -f2 

colla insieme con alcuni pspdftool comandi:

$ 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; 

Ecco il risultato:

enter image description here

Problemi correlati