web-dev-qa-db-ja.com

PDFのメタデータの内部ページ番号を変更する方法

アクロバット以外の方法で作成したpdfドキュメントがあります(pdfに印刷してから、一連のpdfをマージします)。ただし、ページ番号を手動で変更したい(つまり、最初の数ページは単にタイトルページで、 is labeled "page 1"は実際にはpdfの7番目のシートです)。これを行う最も簡単な(そして理想的には無料の)方法は何ですか?

明確にするために、私はページ自体の番号を変更しようとはしていませんが、PDFが格納する「メタデータ」内のページ番号(ページ自体はすでに正しく番号付けされています。「ページ1に移動」するだけです。ページへlabeled 1、これはシート7の場合もあります)。

私はWindowsを使用していますが、Macにもアクセスできます。

42
YGA

あなたが欲しいものは確かにページラベルと呼ばれ、PDFのソースコードに直接簡単に追加できます。ファイル拡張子をpdfからtxtに変更し、テキストエディターでファイルを開きます(これは、ファイルサイズによっては時間がかかる場合があります)。ページラベルに関する情報は、次のようなdocument catalogというノードに格納されます。

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
>>
endobj

もっと混乱するかもしれませんが、これが基本的な構造です。カタログは1つしかないため、大きなファイルでは、/Catalogを含むノードを検索できます。これで、/PageLabelsエントリを挿入して、必要な変更を加えることができます。

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
   /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
                        ]
               >>
>>
endobj

ページインデックスと呼ばれる番号で始まる3行があります。ページ1にはインデックス0があり、ページ2にはインデックス1が続きます。それらは常に範囲を表すため、1 <<...>>の行はインデックス1から5までのすべてのページに適用され、6 <<...>>の行は6から最後のページまでのすべてのページに適用されます。 0 <<...>>のラベルは常に定義する必要があります。

ページラベルとPDFソースコード PDF標準 または wiki PDF標準。

45

注1:受け入れられた答えは依然としてほとんど正しいですが、いくつかのギャップがあります。多くのPDFファイルはテキストとして直接編集できません。そのような編集をしても、PDFが壊れて読みにくくなることがあります。解決策は、UnixとMicrosoft Windowsの両方で機能します qpdf これは、PDFファイルを「QDF」に変換できます。これは、まだ有効なテキスト編集可能なフォームです= PDFファイル。qpdfパッケージには、損傷を修正するためにQDFファイルが編集された後にオフセットを再計算するfix-qdfが付属しています。

注2:テキストエディターに不快ですか? jpdftweak などのGUIエディタを最初に使用してみてください。 GUI pdfエディターが機能することもありますが、その場合は完了です。ただし、失敗した場合は、よくあることですが、このより堅牢な代替手段を試すことができます。どちらにせよ、私の答えがエレガントではないことに反対票を投じないでください。


編集方法PDF Qpdfを使用したページ番号

概要:

  1. qpdf -qdf foo.pdf foo.qdf
  2. foo.qdfを編集する

     0 << >>           % No label on first pages
     6 << /S /D >>     % Start numbering from 7th page.
    
  3. fix-qdf foo.qdf >bar.qdf
  4. テストbar.qdf
  5. qpdf bar.qdf bar.pdf

詳細な手順

ステップ1。

ドキュメントを簡単に編集可能なQDF形式に変換します。次のようにコマンドラインからqpdfを実行します。

qpdf -qdf foo.pdf foo.qdf

注:qpdfがまだインストールされていない場合は、Microsoft Windows実行可能ファイルを https://github.com/qpdf/qpdf/releases などのUnixシステムからダウンロードできます。 UbuntuとDebian GNU/Linuxは、apt install qpdfと入力してインストールできます。

ステップ2。

Notepad ++、emacs、geditなどのテキストエディターを使用してQDFドキュメントを編集します。 Word /Catalogを検索し、その中にある<<山かっこ>>に注意してください。近くには、現在の/PageLabelsifif)があります。

/PageLabelsには、番号が異なる必要がある各セクションを追加します。形式はstart-page << style >>です。空白は問題ではなく、ドキュメントの最初のページは0であることに注意してください。特に指定のない限り、新しいセクションは常に1からページ番号が付けられます。

以下は、PageLabelsがどのように見えるかの完全な例であり、コメントが追加されています。

/Type /Catalog
/PageLabels <<
  /Nums [
    0           % From the first page of the document,
      <<
        /S /r   % ...use the lowercase roman numeral style.
      >>
    6           % From seventh page onward,
      <<
        /S /D   % ...use ordinary digits (arabic numerals)
      >>
  ]
>>

ファイルにPageLabelsがない場合は、/Type /Catalogの後に追加します。たとえば、人は変わるかもしれませんが、

1 0 obj
<<
  …
  /Type /Catalog
>>
endobj

に、

1 0 obj
<<
  … 
  /Type /Catalog
  /PageLabels
      << /Nums [
    0 << >>                 % No label for cover
    1 << /S /r >>           % i, ii for index
    3 << /S /D /St 15 >>    % 15, 16, 17, ... for article
    31 << /S /D /P (A-) >>  % A-1, A-2, A-3... for appendix
       ]
  >>
>>
endobj

オプション:/Stを使用して別の番号から開始

各セクションは、/Stを使用して指示しない限り、番号付けを1から再開します。上記の例で、4番目のページが15から始まることに注意してください。

オプション:/Sで異なるスタイルを使用する

/S演算子は、番号付けスタイルを選択できる引数を取ります。

  • / D桁(1、2、3 ...)
  • / Rローマ字大文字(I、II、III ...)
  • / r小文字のローマ字(i、ii、iii ...)
  • / Aアルファベットの大文字(A、B、C、....、X、Y、Z、AA、AB、AC、...)
  • / aアルファベットの小文字(a、b、c、....、x、y、z、aa、ab、ac、...)

/S演算子を省略した場合、ページのそのセクションには番号が付けられません。例えば:

0 << >>         % No label for cover

オプション:/Pを使用して各ページにプレフィックスを追加

/Pの後にかっこで単語を指定すると、ページ番号の前に任意のテキスト文字列を表示できます。

  31
  <<
    /S /D
    /P (A-)     % label appendix pages A-1, A-2, A-3
  >>

スタイルなしのプレフィックス(/S)を指定すると、番号のないWordのみのページが表示されます。これは、たとえば、カバーページに「カバー」というラベルを付けるだけの場合に便利です。

     0 << /P (Cover) >>        % No number, just "Cover"

ステップ3。

fix-qdfを実行して、編集内容を有効にしますPDFおよび出力をbar.qdfに入れます。

fix-qdf foo.qdf > bar.qdf

ステップ4。

PDF表示プログラムでbar.qdfを開き、正しく番号付けされていることを確認します。

ステップ5。

次のように、QDFファイルを通常のPDFに変換します。

qpdf bar.qdf bar.pdf

ただ。完了です。これで、bar.pdfに正しくラベル付けされたページ番号のドキュメントができました。

6
hackerb9

私があなたを正しく理解しているなら、これががどのように機能するかです:

gs \
  -o modified-pagelabels-50pages.pdf \
  -sDEVICE=pdfwrite \
  -c "[ /Page 1 /Label (i)     /PAGELABEL pdfmark" \
  -c "[ /Page 2 /Label (ii)    /PAGELABEL pdfmark" \
  -c "[ /Page 3 /Label (III)   /PAGELABEL pdfmark" \
  -c "[ /Page 4 /Label (four)  /PAGELABEL pdfmark" \
  -c "[ /Page 5 /Label (v)     /PAGELABEL pdfmark" \
  -c "[ /Page 6 /Label (|||||) /PAGELABEL pdfmark" \
  -f 50pages.pdf

ただし、私は覚えておくべきですseem、これは前回試したときに確実にまたは完全に機能しなかったことをこれ(約2年前)。

更新:私の記憶は私を失敗させていませんでした。私は今再試行して、Ghostscript ((bug 691889 のバグレポートを提出しました。バグレポートへのリンクをたどって詳細を確認してください。

6
Kurt Pfeifle

少しpythonスクリプト、それは仕事をすることができます: https://github.com/lovasoa/pagelabels-py

あなたの場合は次のようなものを呼び出します:

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

jPdf Tweak は、PDFファイルのページラベルを編集できるオープンソースのグラフィカルユーティリティです。 documentation ページは、ステップバイステップで提供されます指示。

3
CherryBerry

デーンズの答えが最善です。形式が少し変更されました。これは役に立ちます。

%PDF-1.6

29241 0 obj

<</Metadata 1685 0 R/Outlines 29461 0 R/PageLabels<</Nums[0<</S/D>>3<</S/D/St 6>>4<</S/D/St 10>>5<</S/D/St 12>>15<</S/D/St 70>>16<</S/D/St 72>>17<</S/D/St 80>>18<</S/D/St 82>>19<</S/D/St 90>>23<</S/D/St 96>>25<</S/D/St 99>>29<</S/D/St 110>>31<</S/D/St 130>>32<</S/D/St 133>>35<</S/D/St 137>>36<</S/D/St 140>>37<</S/D/St 145>>39<</S/D/St 150>>40<</S/D/St 152>>42<</S/D/St 155>>43<</S/D/St 160>>46<</S/D/St 165>>47<</S/D/St 167>>48<</S/D/St 170>>49<</S/D/St 180>>50<</S/D/St 190>>52<</S/D/St 300>>53<</S/D/St 305>>54<</S/D/St 319>>56<</S/D/St 380>>57<</S/D/St 390>>58<</S/D/St 500>>67<</S/D/St 515>>68<</S/D/St 525>>70<</S/D/St 550>>71<</S/D/St 553>>72<</S/D/St 560>>73<</S/D/St 600>>76<</S/D/St 620>>78<</S/D/St 650>>82<</S/D/St 670>>85<</S/D/St 700>>95<</S/D/St 714>>117<</S/D/St 900>>162<</S/D/St 1000>>178<</S/D/St 1200>>209<</S/D/St 1500>>263<</S/D/St 1555>>270<</S/D/St 1563>>389<</S/D/St 1681>>522<</S/D/St 1813>>]>> /PageMode/UseOutlines/Pages 29177 0 R/Type/Catalog>>

endobj
1
daniel

「/ outlines」領域にすでに「/ titles」が設定されている場合、ファイルの直接編集(pdftkで非圧縮)が機能しないことがわかりました。上記の投稿で説明されている直接編集技術は、YouTubeでデモされています。 https://www.youtube.com/watch?v=zoH1Z_hSpak

ただし、pdftkの「更新」機能は、「doc_data」を編集することで、より直感的になる可能性があります(「/ titles」がPDFファイルの「/ outlines」領域にすでに存在する場合)。ここで使用されるtxt 'ファイル: https://www.pdflabs.com/blog/export-and-import-pdf-bookmarks/

1
Bob

Dane H.が提供する方法は、Acrobat Reader(正確には、現在のバージョンのAdobeReader)で動作します。注意すべき1つのマイナーなポイント:上部のフィールドは8文字しか受け入れないため、そのようなラベルが使用されている場合、「件名インデックス」などを入力することはできません。ただし、代わりにメニュー項目の[表示]> [ページナビゲーション]> [移動...]または同等のキーを使用できます。

もう1つのヒント:PDF仕様では常にページ番号が連続して割り当てられるため、ページのスキャンペアによって生成されたドキュメントの場合、2組の番号が外れますステップ(手作業で各ページに個別に番号を付けない限り)。しかし、少しの労力でドキュメントを設定できるため、「ページnに移動するとページ2nおよび2n + 1に移動する」という規則が適用されます。

1
user308637

古いものを削除するために、おそらく最も簡単なクロスプラットフォームの方法は、古いものを切り取ることです。これには、たとえば BRISS。 を使用できます。

無料のツールを使用して新しいものを追加するのは、よりトリッキーです。個人的には、おそらく このStackExchangeの回答 のようにpdflatexを使用しますが、pdflatexの他の用途がない限り、かなり複雑な解決策になる可能性があります。

それは可能だと思いますが、代わりに jPdfTweak を使用します。

1
frabjous

BeCyPDFMetaEdit http://www.becyhome.de/becypdfmetaedit/description_eng.htm

このフリーウェアツールの[ページ]タブで、内部ページ番号スキームを追加/削除/変更できます。

また、注意してくださいPDF xchangeビューアはページ番号スキームを表示せず、foxitreaderは正しい結果をもたらします。私はAcrobatリーダーをテストしていません。

0
Sulisu