Làm cách nào để thay đổi số trang nội bộ trong dữ liệu meta của PDF?


37

Tôi có một tài liệu pdf tôi đã tạo thông qua các phương tiện không phải Acrobat (in thành pdf, sau đó hợp nhất một loạt các tệp pdf), nhưng tôi muốn thay đổi số trang theo cách thủ công (ví dụ: một số trang đầu tiên chỉ là các trang tiêu đề, trang mà được dán nhãn "trang 1" thực sự là tờ thứ 7 của pdf). Cách đơn giản nhất (và lý tưởng nhất, miễn phí) để làm điều này là gì?

Để rõ ràng, tôi không cố gắng tự thay đổi số trên các trang, nhưng số trang trong "siêu dữ liệu" mà các cửa hàng pdf (bản thân các trang đã được đánh số chính xác; tôi chỉ muốn "đi đến trang 1" để đi đến trang có nhãn 1, có thể là trang 7).

Đối với những gì nó có giá trị, tôi đang ở trên Windows, mặc dù tôi cũng có quyền truy cập vào máy Mac.


Tôi không chắc chắn nếu tôi hiểu đầy đủ mô tả + yêu cầu của bạn. Bạn có thể cung cấp một liên kết đến một bản PDF mẫu mà bạn muốn sửa đổi không?
Kurt Pfeifle

Có một công cụ dòng lệnh để làm điều đó, ví dụ như trên một tệp pdf lớn mà không thực sự mở tệp txt?
jj_p

ví dụ như pdftk?
jj_p

Câu trả lời:


39

Những gì bạn muốn thực sự được gọi là nhãn trang và có thể dễ dàng được thêm trực tiếp vào mã nguồn của PDF. Đổi tên phần mở rộng tệp từ pdfsang txtvà mở tệp trong trình soạn thảo văn bản (việc này có thể chậm, tùy thuộc vào kích thước tệp, hãy kiên nhẫn). Thông tin về nhãn trang được lưu trữ trong một nút gọi là danh mục tài liệu trông giống như thế này:

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

Nó có thể chứa nhiều thứ khó hiểu hơn, nhưng đây là cấu trúc cơ bản. Chỉ có một danh mục, vì vậy trong một tệp lớn, bạn có thể tìm kiếm nút chứa /Catalog. Bây giờ bạn có thể thực hiện các thay đổi mong muốn của mình bằng cách chèn /PageLabelsmục nhập:

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

Có 3 dòng bắt đầu bằng số, được gọi là chỉ mục trang . Trang 1 có chỉ mục 0, trang 2 chỉ mục 1và vv. Chúng luôn mô tả các phạm vi, do đó, dòng 1 <<...>>áp dụng cho tất cả các trang từ chỉ mục 1 đến 5 và dòng 6 <<...>>áp dụng cho tất cả các trang từ 6 đến trang cuối cùng. Một nhãn cho 0 <<...>>phải luôn luôn được xác định.

Bạn có thể tìm thêm thông tin về nhãn trang và mã nguồn PDF trong tiêu chuẩn PDF hoặc trong wiki về tiêu chuẩn PDF.


4
Thật kỳ diệu! Đây là nơi duy nhất trên web tôi đã tìm thấy thông tin trực tiếp và hữu ích như vậy. Chúng tôi không chủ có Acrobat Reader, sau khi tất cả.
Noldorin

3
Với ví dụ /St 8hoặc /St 2, bạn đặt điểm bắt đầu cho nhãn được hiển thị; nhưng chọn bất kỳ số nào ở vị trí 8 (hoặc 2), phải là> = 1. Ví dụ: 1 << /S /r /St 12 >>sẽ đánh số trang từ (thực tế) 2-6 dưới dạng (hiển thị) xii-xvii - vì '12' tương ứng 'xii'.
n611x007

1
cảm ơn vì câu trả lời, nhưng theo kinh nghiệm của tôi, phương pháp này đôi khi hoạt động và đôi khi không; Ngoài ra, tôi tình cờ tìm thấy nhiều hơn một Danh mục: làm thế nào để bạn giải thích điều đó?
jj_p

1
Thông tin tuyệt vời. Đây là một liên kết đến một nguồn hữu ích khác: Chỉ định đánh số trang nhất quán cho các tài liệu PDF từ W3C.
Adam Mackler

2
Bạn có chắc chắn nó hoạt động như thế này? Từ việc xem xét nội dung thô của một số tệp PDF, có vẻ như một số số chỉ mục trỏ đến các vị trí trong tệp sau khi danh mục sẽ phải được cập nhật nếu độ dài của nội dung trước đó thay đổi ..
HOẶC Mapper

6

Nếu tôi hiểu bạn chính xác, đây là cách nó nên hoạt động:

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

Tuy nhiên, tôi dường như nhớ rằng, điều này không đáng tin cậy hoặc hoàn toàn hoạt động lần trước khi tôi thử điều này (khoảng 2 năm trước).

CẬP NHẬT: Trí nhớ của tôi đã không làm tôi thất vọng. Bây giờ tôi đã thử lại và nộp báo cáo lỗi cho Ghostscript ( lỗi 691889 ) liên quan đến việc này. Theo liên kết đến báo cáo lỗi để xem chi tiết.


5

CHÚ THÍCH 1: Câu trả lời được chấp nhận vẫn chủ yếu là đúng, nhưng có một số khoảng trống. Điều còn thiếu là nhiều tệp PDF không thể chỉnh sửa trực tiếp dưới dạng văn bản. Ngay cả khi có, việc chỉnh sửa như vậy đôi khi có thể làm hỏng tệp PDF khiến nó không thể đọc được. Một giải pháp, sẽ hoạt động cho cả Unix và Microsoft Windows là qpdf có thể dịch các tệp PDF thành "QĐF", một dạng có thể chỉnh sửa văn bản vẫn là một tệp PDF hợp lệ. Các qpdfgói đi kèm với fix-qdfđó sẽ tính toán lại offsets sau một tập tin QDF đã được chỉnh sửa để sửa bất kỳ thiệt hại.

CHÚ THÍCH 2: Không thoải mái với trình soạn thảo văn bản? Trước tiên hãy thử sử dụng trình soạn thảo GUI như jpdftweak . Đôi khi các trình soạn thảo GUI pdf hoạt động, trong trường hợp đó, yay, bạn đã hoàn tất. Tuy nhiên, khi họ thất bại, như thường thấy đối với tôi, bạn có thể thử phương án thay thế mạnh mẽ hơn này. Dù bằng cách nào, xin đừng bỏ phiếu cho câu trả lời của tôi là kém thanh lịch.


CÁCH Chỉnh sửa số trang PDF bằng Qpdf

Tóm lược:

  1. qpdf -qdf foo.pdf foo.qdf
  2. chỉnh sửa foo.qdf

     0 << >>           % No label on first pages
     6 << /S /D >>     % Start numbering from 7th page.
    
  3. fix-qdf foo.qdf >bar.qdf
  4. thanh kiểm tra.qdf
  5. qpdf bar.qdf bar.pdf

Các bước chi tiết

Bước 1.

Chuyển đổi tài liệu sang định dạng QĐF dễ chỉnh sửa. Chạy qpdf từ dòng lệnh như vậy:

qpdf -qdf foo.pdf foo.qdf

Lưu ý: Nếu bạn chưa cài đặt qpdf, các tệp thực thi của Microsoft Windows có thể được tải xuống từ https://github.com/qpdf/qpdf/release các hệ thống Unix, như Ubuntu và Debian GNU / Linux có thể cài đặt nó bằng cách gõapt install qpdf .

Bước 2.

Chỉnh sửa tài liệu QĐF bằng trình soạn thảo văn bản như notepad ++, emacs hoặc gedit. Tìm kiếm từ /Catalogvà lưu ý << ngoặc vuông >> nó ở bên trong. Gần đó, bạn sẽ tìm thấy hiện tại /PageLabels( nếu có ).

Chúng tôi sẽ thêm từng phần nên được đánh số khác nhau cho /PageLabels. Định dạng là start-page<< style>>. Lưu ý rằng khoảng trắng không quan trọng và trang đầu tiên của tài liệu là 0. Trừ khi có quy định khác, một phần mới luôn bắt đầu đánh số trang từ 1.

Ví dụ

Dưới đây là một ví dụ đầy đủ về những gì PageLabels có thể trông như thế nào, với các bình luận được thêm vào:

/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)
      >>
  ]
>>

Nếu tệp không có PageLabels, hãy thêm chúng sau /Type /Catalog. Ví dụ, một người có thể thay đổi,

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

vào

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

TÙY CHỌN: BẮT ĐẦU TỪ MỘT SỐ KHÁC NHAU VỚI /St

Mỗi phần khởi động lại đánh số ở mức 1 trừ khi bạn nói với nó bằng cách khác sử dụng /St. Lưu ý cách trong ví dụ trên, trang thứ tư bắt đầu từ 15.

TÙY CHỌN: SỬ DỤNG PHONG CÁCH KHÁC BIỆT VỚI /S

Các /Snhà điều hành có một đối số cho phép bạn chọn kiểu đánh số,

  • / D chữ số (1, 2, 3 ...)
  • / R chữ hoa La Mã (I, II, III ...)
  • / r chữ thường La Mã (i, ii, iii ...)
  • / Một chữ cái viết hoa (A, B, C, ...., X, Y, Z, AA, AB, AC, ...)
  • / a chữ thường (a, b, c, ...., x, y, z, aa, ab, ac, ...)

Nếu một người bỏ qua /Stoán tử, thì phần đó của trang sẽ không có đánh số. Ví dụ:

0 << >>         % No label for cover

TÙY CHỌN: THÊM MỘT PREFIX ĐỂ MỌI TRANG /P

Bạn có thể hiển thị bất kỳ chuỗi văn bản nào trước số trang bằng cách chỉ định một từ trong ngoặc đơn sau /P:

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

Chỉ định tiền tố không có kiểu ( /S), sẽ cung cấp cho bạn các trang chỉ có từ mà không có số nào. Điều này có thể hữu ích, ví dụ, nếu bạn muốn một trang bìa chỉ đơn giản là có nhãn "Bìa".

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

Bước 3.

Chạy fix-qdfđể chỉnh sửa PDF hợp lệ của bạn và đặt đầu ra vào bar.qdf.

fix-qdf foo.qdf > bar.qdf

Bước 4.

Mở bar.qdf trong chương trình xem PDF của bạn và kiểm tra xem nó có được đánh số chính xác không.

Bước 5.

Chuyển đổi tệp QĐF trở lại thành tệp PDF bình thường, như vậy:

qpdf bar.qdf bar.pdf

Ta da. Bạn đã hoàn tất. Bây giờ bạn có một tài liệu với số trang được dán nhãn chính xác trong bar.pdf.


4

Có một kịch bản python nhỏ, có thể thực hiện công việc: https://github.com/lovasoa/pagelabels-py

Trong trường hợp của bạn, hãy gọi một cái gì đó như:

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

Điều này đã làm công việc chính xác như tôi cần. Cảm ơn!
telotortium

3

jPdf Tweak là một tiện ích đồ họa Nguồn mở cho phép bạn chỉnh sửa nhãn trang trong các tệp PDF. Các tài liệu hướng dẫn trang cung cấp từng bước hướng dẫn.


Tôi đã sử dụng điều này để thêm nhãn trang tùy chỉnh của mình ở định dạng "trống" với văn bản làm tiền tố. Làm việc tốt!
Matt Sephton

Đây là một cách trả lời tốt hơn so với chỉnh sửa văn bản mọi thứ bằng tay
endolith

Vui lòng thêm các hướng dẫn từng bước ở đây thay vì dựa vào một liên kết bên ngoài. Cảm ơn!
hackerb9

1

Để loại bỏ những cái cũ, có lẽ cách dễ nhất là đa nền tảng chỉ là cắt bỏ những cái cũ. Bạn có thể làm điều này, ví dụ, với BRISS.

Thêm những cái mới bằng cách sử dụng các công cụ miễn phí sẽ khó khăn hơn. Cá nhân tôi có thể làm điều đó với pdflatex, như trong câu trả lời StackExchange này , mặc dù đó có thể là một giải pháp khá liên quan trừ khi bạn có những cách sử dụng khác cho pdflatex.

Tôi nghĩ rằng nó có thể được thực hiện, tuy nhiên với jPdfTweak thay thế.


1

Phương pháp do Dane H. đưa ra không hoạt động với Acrobat Reader (hay chính xác hơn là phiên bản Adobe Reader hiện tại ). Một điểm nhỏ cần lưu ý: trường ở trên cùng sẽ chỉ chấp nhận 8 ký tự để bạn không thể nhập một cái gì đó như 'chỉ mục chủ đề' vào nó nếu nhãn đó đã được sử dụng. Nhưng thay vào đó, bạn có thể sử dụng mục menu Xem> Điều hướng trang> Chuyển đến ... hoặc phím tương đương.

Một mẹo khác: đặc tả pdf luôn gán các số trang liên tiếp, do đó, trong trường hợp tài liệu được tạo bằng cách quét các cặp trang, hai bộ số sẽ rời khỏi bước (trừ khi bạn đánh số từng trang một cách khó khăn). Nhưng bạn có thể với một chút nỗ lực thiết lập tài liệu của mình để quy ước 'đi đến trang n sẽ đưa bạn đến trang 2n và 2n + 1'.


1

Danes trả lời là tốt nhất, các định dạng thay đổi một chút bây giờ, điều này có thể hữu ích:

%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

Tôi thấy việc chỉnh sửa trực tiếp tệp (không được nén bởi pdftk) không hoạt động nếu đã có '/ title' được đặt trong khu vực '/ phác thảo'. Kỹ thuật chỉnh sửa trực tiếp được mô tả trong bài đăng ở trên được thể hiện trên Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Nhưng tính năng 'cập nhật' của pdftk có thể trực quan hơn (và đáng tin cậy hơn khi '/ title' đã tồn tại trong vùng '/ phác thảo' của tệp PDF) thông qua chỉnh sửa tệp 'doc_data.txt' được sử dụng tại đây: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmark/


1
Xin chào @Bob, câu trả lời chỉ liên kết có chất lượng thấp. Chúng sẽ vô dụng nếu trang đích di chuyển hoặc biến mất. Vui lòng chỉnh sửa câu trả lời của bạn và trích dẫn phần có liên quan của giải pháp ở đây.
C0deDaedalus

0

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

Bạn có thể thêm / xóa / thay đổi lược đồ số trang nội bộ trong tab "trang" của công cụ phần mềm miễn phí này.

Và hãy cẩn thận, trình xem PDF xchange không hiển thị sơ đồ số trang và foxitreader có kết quả đúng. Tôi chưa kiểm tra trình đọc Acrobat.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.