2009-10-21 15 views
27

Jeśli masz duży dokument (500 stron +) w PostScript i chcesz dodać numery stron, czy ktoś wie, jak to zrobić?Jak dodać numery stron do Postscript/PDF

+0

zmieniane niezależnie od 'showpage' operator, jak pokazano na tej odpowiedzi] [(http://stackoverflow.com/a/6620599/477035) w zasadniczo [duplikatu przedmiotowym] (http://stackoverflow.com/ q/4766755/477035) – RedGrittyBrick

+0

Zobacz [Bardzo ładne rozwiązanie Alana Munna na TeX SE] (https://tex.stackexchange.com/a/18762/3406). –

Odpowiedz

13

To może być rozwiązanie:

  1. nawrócony postscriptum do pdf za pomocą ps2pdf
  2. utworzyć plik LaTeX i wstawić do stron przy użyciu pdfpages pakiet (\includepdf)
  3. użytkowania pagecommand={\thispagestyle{plain}} czy coś z pakietu fancyhdr w argumentach \includepdf
  4. jeżeli wyjście postscript jest wymagane, przekonwertuj wyjście pdflatex z powrotem na postscript poprzez pdf2ps
+0

Myślę, że to świetny pomysł, ale nie mam go działa. Numery stron nie wstawiają * nad * stronami \ includepdf. –

+0

Użyłeś czegoś takiego jak '\ includepdf [pages = -, pagecommand = {\ thispagestyle {plain}}] {document.pdf}'? – rcs

+1

To jest zasadniczo to, co Alan Munn robi w [jego rozwiązaniu] (https://tex.stackexchange.com/a/18762/3406), pomijając rzeczy na PS. –

0

Być może pstops (część psutils) może być używany do tego?

+0

Spędziłem na nim sporo czasu i wygląda na to, że psutils tego nie zrobią - chyba że czegoś mi brakuje. –

1

Zakładam, że jesteś poszukuje rozwiązania opartego na PS. W PS nie ma operatora na poziomie strony, który pozwoli ci to zrobić. Musisz dodać stopkę-rodzaj rzeczy w sekcji PageSetup dla każdej strony. Każdy język skryptowy powinien być w stanie Ci pomóc.

+0

Widziałem rozwiązanie z Perl w http://www.osti.gov/bridge/product.biblio.jsp?query_id=0&page=0&osti_id=666084 –

21

podstawie RCS zaproponowanych rozwiązań, ja co następuje:

Stary dokument do example.pdf i pobiegł pdflatex addpages, gdzie addpages.tex brzmi:

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

lub alternatywnie, na stronach dwustronne (tj numer strony konsekwentnie na zewnątrz):

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

Łatwy sposób na zmianę marginesów nagłówka:

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

Kiedyś dodawałem numery stron do mojego pliku pdf, używając lateksu, jak w zaakceptowanej odpowiedzi.

Teraz znalazłem łatwiejszy sposób: Zastosowanie enscript do tworzenia pustych stron z nagłówkiem zawierającym numer strony, a następnie użyj pdftk z opcją multistamp umieścić nagłówek na pliku.

Ten skrypt bash oczekuje plik pdf jak to tylko parametr:

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

ostrzeżenie dla innych użytkowników: tylko od budowania 1.43 pdftk ma * funkcja multistamp * - odnośnie do kodu Mogę zasugerować wyjście = "$ {1% 03d.pdf} -header.pdf" by zerować wyrównanie – Dingo

+0

Multistamp jest świetny. Mimo to Enscript nie jest zbyt elastyczny w tym przypadku - próbowałem uzyskać numery linii wyśrodkowane w stopce, z czcionką, którą chcę itp. ... W efekcie stworzyłem 1000 stron za pomocą mojego edytora tekstu z automatycznymi numerami linii w stopce. Potem rozprowadzam to na moich plikach. –

+0

To nie działa dla mnie. Bucle nie iteruje, próbowałem kodowania wartości $ pagenum, ale nic. – xsubira

12

można po prostu użyć

pspdftool

w w ten sposób:

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

patrz Te dwa przykłady (nienumerowane i numerach PDF z pspdftool)

numerowany PDF

http://ge.tt/7ctUFfj2

numerach PDF

http://ge.tt/7ctUFfj2

z tym jako pierwszy argument wiersza polecenia:

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

Działa to świetnie, ale zrywa wewnętrzne i zewnętrzne linki – jdewit

+1

Mówiąc o uszkodzonych linkach, te przykładowe hiperłącza .pdf są zepsute. – foobarbecue

+0

Przepraszam, dołożę wszelkich starań, aby jak najszybciej wymienić – Dingo

5

nawiązaniu do rozwiązania captaincomic za, mam przedłużony go wesprzeć uruchomienie numeracji stron w dowolnej strony.

Wymaga enscript, pdftk 1,43 um lub więcej i pdfjam (na 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 

np .. to miejsce w /usr/local/bin/pagestamp.sh i wykonanie takich jak:

pagestamp.sh doc.pdf 3 

Ten rozpocznie numer strony, na stronie 3 .. przydatna, gdy masz osłonowymi, tytuł strony i spis treści, itp

niefortunne rzeczą jest opcja --footer tego enscript jest zepsuty, więc nie można uzyskać numerowania stron na dole za pomocą tej metody.

1

Próbowałem pspdftool (http://sourceforge.net/projects/pspdftool).

I w końcu dostałem go do pracy, ale najpierw mam ten błąd:

pspdftool: xreftable read error 

Plik źródłowy został stworzony z pdfjoin od pdfjam i zawierał kilka skanów z mojego Epson Workforce jak również wygenerowany strony tagów. Nie mogłem wymyślić sposobu na naprawienie tabeli odnośników, więc przekonwertowałem na ps z pdf2ps iz powrotem na pdf z pdf2ps. Wtedy mógłbym to wykorzystać, aby uzyskać ładne numery stron w prawym dolnym rogu:

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

Niestety, oznacza to, że wszelkie strony wyszukiwania tekstu nie można przeszukiwać, ponieważ tekst był rasteryzowane w konwersji ps. Na szczęście w moim przypadku nie ma to znaczenia.

Czy istnieje sposób naprawienia lub opróżnienia tabeli odnośników pliku PDF bez utraty stron do przeszukiwania?

1

Wziąłem rozwiązanie captaincomic i dodano wsparcie dla nazwy plików zawierające spacje, plus daje trochę więcej informacji o postępach

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

napisałem następujący shell skrypt rozwiązać ten dla LaTeXbeamer slajdy stylu produkowanych z inkscape (I pdftk cat slajdy razem w końcowej prezentacji PDF & następnie dodać numery slajdów za pomocą skryptu poniżej):

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

Scenariusz odczytuje STDIN zapisuje STDOUT drukowanie diagnostyczne pdflatex wyjście do STDERR.

Więc po prostu skopiować i wkleić powyższy kod w pliku tekstowym, powiedzmy enumerate_slides.sh, sprawiają, że plik wykonywalny (chmod +x enumerate_slides.sh) & nazwać tak:

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

Powinno być łatwo dostosować to do innego rodzaju dokumentu, dostosowując szablon LaTeX, aby użyć odpowiedniego stylu stylu documentclass, rozmiar papieru: &.

edit: Wymieniłem echo przez $(which echo) ponieważ w ubuntu dowiązania /bin/sh do dash który zastępuje komendę echo przez skorupę wewnętrznych ciągów ewakuacyjnych ustne domyślnie & nie zapewniając możliwość -E aby to zmienić. Zauważ, że alternatywnie możesz uciec od wszystkich \ w szablonie LaTeX jako \\.

edit: Wymieniłem $(which echo) przez printf '%s' ponieważ w zsh, which echo powraca echo: shell built-in command zamiast /bin/echo. Zobacz szczegóły: this question, dlaczego zdecydowałem się na końcu używać printf.

2

Podobał mi się pomysł wykorzystania pspdftool (man page), ale co mi po tym był strona x z y formatu i stylu czcionki, aby dopasować resztę strony.

Aby dowiedzieć się więcej na temat nazw czcionek użytych w dokumencie:

$ strings input.pdf | grep Font 

aby uzyskać liczbę stron:

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

przykleić go razem z kilkoma pspdftool poleceń:

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

Oto wynik:

enter image description here

Powiązane problemy