當前位置: 首頁>>技術教程>>正文


重新編號PDF頁麵

,

問題描述

我想編輯掃描的PDF的元數據,以將自定義頁碼分配給不同的頁麵。例如,現在我可能要呼叫i,ii和iii的第1-3頁,什麽是我要呼叫1-7的第4-10頁。我不想更改頁麵的實際順序。

是否有A)使用免費工具完全做到這一點的方法; B)一種執行此操作的方法”in batch”(因此,不必手動重新編號每個頁麵)。

最佳辦法

這裏是一個基於LaTeX的解決方案。它使用pdfpages包來包含掃描的PDF(此處稱為scan.pdf)。您可以使用啟用了pdfpagelabels選項的hyperref軟件包來設置所需的PDF頁麵標簽。它使用普通的\thepage宏作為標簽,可以將其定義為小寫羅馬數字。然後,頁麵計數器將重置並變回普通數字。

\documentclass[a4paper]{article}% or use 'letterpaper'
\usepackage{pdfpages}
\usepackage[pdfpagelabels]{hyperref}
\begin{document}
% Set lower case roman numbers (\Roman would be upper case):
\renewcommand{\thepage}{\roman{page}}
\includepdf[pages=1-3]{scan.pdf}
% Back to normal (arabic) numbers:
\renewcommand{\thepage}{\arabic{page}}
% Reset page counter to 1:
\setcounter{page}{1}
\includepdf[pages=4-]{scan.pdf}
\end{document}

將上麵的代碼放入文件(例如scan_mod.tex)中,並使用pdflatex進行編譯:

# pdflatex scan_mod

這將產生scan_mod.pdf。但是,包括任何特殊注釋。超鏈接將消失。掃描的PDF應該不會有任何問題。

如果更經常需要此腳本,則可以編寫一個腳本,該腳本接受羅馬編號的頁數和文件名作為參數,並使用上述代碼創建一個臨時文件,其中名稱和數字為變量,然後將其編譯。

次佳辦法

您可以使用文本編輯器執行此操作。

如答案所示,用文本編輯器打開一個PDF文件,搜索/Catalog條目,然後附加一個名為/PageLabels的條目,如下所示:

/PageLabels << /Nums [
0 << /P (cover) >> % labels 1st page with the string "cover"
1 << /S /r >> % numbers pages 2-6 in small roman numerals
6 << /S /D >> % numbers pages 7-x in decimal arabic numerals
]
>>

請注意,頁麵索引(物理頁麵編號)以0開頭。

當然,您可以使用腳本語言自動執行此操作。

PDF Standards – Page Labels具有詳細規格。

第三種辦法

jPDF Tweak是一個開放源代碼圖形實用程序,提供頁碼編號(正確的術語為”page labeling”)以及許多其他初學者到高級PDF編輯功能。它可以在Ubuntu和其他操作係統上運行。

Documentation頁麵提供了step-by-step指令。

第四種辦法

有一個名為PDF Mod的工具,它是一個免費工具,可以重新排列PDF頁麵。

可以從Ubuntu 10.10及更高版本中的Ubuntu軟件中心安裝。

要在Ubuntu 9.10或10.04中安裝:

安裝將ppa ppa:pdfmod-team/ppa添加到您的軟件源(Here’s how to do that)並從軟件中心安裝pdfmod

改編自:http://www.webupd8.org/2011/03/edit-pdf-documents-in-linux-with-pdf.html

祝你好運:D

第五種辦法

剛剛找到一個可以為此使用ghostscript的指針,在這裏:pdftk – Add and edit bookmarks to pdf – Unix and Linux – Stack Exchange #18600;它指的是鏈接:

但是,以上內容處理書簽-而不處理邏輯分頁。從pdfmarkReference.pdf得出,所需的”command”為’/Label‘(或’/PAGELABEL‘)-並進一步參考PDFReference.pdf的第8.3.1 “Page Labels”章。不幸的是,該章不必解釋如何將pdfmarks與頁麵標簽一起使用-但這篇文章確實做到了:

The /PAGELABEL pdfmark does not have any /Page key, so one can set the label for the ‘current’ page only (and, as a consequence, only for one page at a time). Since you call it at the very beginning, it’s expected to set a label for the 1st page and only for it.

Multiple /PAGELABELs for the same page: the pdfmark reference says the last one takes effect, so the result of your 1st commandline is OK. Note the /Page key is ignored.

How to set page labels from PostScript? I can think of 2 methods:

(A) The 100% documented way:

Issue a /PAGELABEL as part of each page.

(B) The less documented way: …

gswin32c -sDEVICE=pdfwrite -sOutputFile=50pages.pdf -dNOPAUSE

GS>[/_objdef {pl} /type /dict /OBJ pdfmark
GS>[{pl} <</Nums [0 <</P (Page ) /S /r /St 10>> 2 <<>>]>> /PUT pdfmark
GS>[{Catalog} <</PageLabels {pl}>> /PUT pdfmark
GS>50 { showpage } repeat
GS>quit

…並進一步在該線程中:

As to making this work; since the original file is a PDF file, you can run each page from the file individually. So you can set the PAGELABEL pdfmark for page 1, run page 1 from the original file, set the PAGELABEL for page 2, run page 2 from the original file and so on.

Because the label is (as SaGS) said applied to the current page, this should correctly set the labels for each page in the output PDF file. (caveat: I haven’t actually tried this)

編輯:僅顯示此內容-如果您將此另存為pdfmarks文件:

[ /Label (-1) /PAGELABEL pdfmark
showpage
[ /Label (0) /PAGELABEL pdfmark
showpage
[ /Label (1) /PAGELABEL pdfmark
showpage

…然後您致電:

gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=outfile.pdf infile.pdf pdfmarks

…然後您將在infile.pdf的末尾附加三個空白頁,分別標記為-1、0和1 🙂

好吧,這也許會在某個時候幫助您獲得一個更簡單的gs腳本來重新編號頁麵:)

EDIT2:知道了,我想-使用與上麵相同的gs命令-下麵是pdfmarks腳本的內容,它將重新編號infile.pdf,所以它以-1、0、1開頭…基本上是修改後的PDF參考中的示例(有關更多信息,請參見注釋):

% Type name (Optional) The type of PDF object that this dictionary describes; if present, must be PageLabel for a page label dictionary.
% S name (Optional) The numbering style to be used for the numeric portion of each page label:
%       D Decimal arabic numerals
%       R Uppercase roman numerals
%       r Lowercase roman numerals
%       A Uppercase letters (A to Z for the first 26 pages, AA to ZZ for the next 26, and so on)
%       a Lowercase letters (a to z for the first 26 pages, aa to zz for the next 26, and so on)
% P text string (Optional) The label prefix for page labels in this range.
% St integer (Optional) The value of the numeric portion for the first page label in the range. Subsequent pages will be numbered sequentially from this value, which must be greater than or equal to 1. Default value: 1.

% renumber first 25 pages - push each by 10, and add prefix:
% [/_objdef {pl} /type /dict /OBJ pdfmark
% [{pl} <</Nums [0 <</P (Page ) /S /D /St 10>> 25 <<>>]>> /PUT pdfmark
% [{Catalog} <</PageLabels {pl}>> /PUT pdfmark

[/_objdef {pl} /type /dict /OBJ pdfmark
[{pl} <</Nums [ 0 << /P (-1) >>         % just label -1 (no style) for pg 0;
                1 << /P (0) >>          % just label  0 (no style) for pg 1;
                2 << /S /D /St 1 >>     % decimal style, start from 1, for pg2 and on.
                ]>> /PUT pdfmark
[{Catalog} <</PageLabels {pl}>> /PUT pdfmark

第六種辦法

有一個小的Python腳本可以完成這項工作:https://github.com/lovasoa/pagelabels-py

在您的情況下,請致電:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 4 --type arabic file.pdf

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/11692.html,未經允許,請勿轉載。