Como alterar os números de páginas internas nos metadados de um PDF?


37

Eu tenho um documento PDF que criei por meios que não sejam o Acrobat (impressão em pdf e, em seguida, mesclando um monte de pdfs), mas gostaria de alterar manualmente os números das páginas (ou seja, as primeiras várias páginas são simplesmente páginas de título, a página que está rotulado como "página 1" é realmente a sétima folha do pdf). Qual é a maneira mais simples (e idealmente, gratuita) de fazer isso?

Para ser claro, não estou tentando alterar os números nas próprias páginas, mas os números das páginas nos "metadados" que o pdf armazena (as próprias páginas já estão numeradas corretamente; eu só quero que "vá para a página 1" à página etiquetada 1, que pode ser de folha 7).

Pelo que vale, estou no Windows, embora também tenha acesso aos Macs.


Não sei se entendi completamente sua descrição + requisito. Você pode fornecer um link para um exemplo de PDF que deseja modificar?
Kurt Pfeifle

existe uma ferramenta de linha de comando para fazer isso, por exemplo, em um grande arquivo pdf sem realmente abrir o arquivo txt?
jj_p

como por exemplo pdftk?
Jj_p 23/09/2013

Respostas:


39

O que você deseja é realmente chamado de rótulos de página e pode ser facilmente adicionado diretamente no código-fonte do PDF. Renomeie a extensão do arquivo de pdfpara txte abra o arquivo em um editor de texto (isso pode ser lento, dependendo do tamanho do arquivo, seja paciente). As informações sobre os rótulos das páginas são armazenadas em um nó chamado catálogo de documentos, que se parece com isso:

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

Pode conter coisas mais confusas, mas essa é a estrutura básica. Existe apenas um catálogo, portanto, em um arquivo grande, você pode procurar o nó que contém /Catalog. Agora você pode fazer as alterações desejadas inserindo a /PageLabelsentrada:

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

Existem 3 linhas começando com números, chamados índices de página . A página 1 possui o índice 0, a página 2 o índice 1e assim por diante. Eles sempre descrevem intervalos, portanto a linha com 1 <<...>>aplica-se a todas as páginas do índice 1 a 5 e a linha com 6 <<...>>aplica-se a todas as páginas do 6 até a última página. Um rótulo para 0 <<...>>sempre deve ser definido.

Você pode encontrar mais informações sobre rótulos de páginas e código-fonte PDF no padrão PDF ou em um wiki sobre padrões PDF.


4
Maravilhoso! Este é o único lugar na web em que encontrei essas informações diretas e úteis. Afinal, nem todos temos o Acrobat Reader.
Noldorin

3
Com o exemplo /St 8ou /St 2, você define um ponto inicial para o rótulo exibido; mas escolha qualquer número no lugar de 8 (ou 2), que deve ser> = 1. Por exemplo, 1 << /S /r /St 12 >>numerará as páginas de (na verdade) 2-6 como (exibidas) xii-xvii - porque '12' corresponde 'xii'.
n611x007 23/06

1
obrigado pela resposta, mas, na minha experiência, esse método algumas vezes funciona e outras não; Além disso, encontrei mais de um catálogo: como você explica isso?
Jj_p 28/09/2013

1
Ótima informação. Aqui está um link para outra fonte útil: Especificação de numeração de página consistente para documentos PDF no W3C.
precisa

2
Tem certeza de que funciona assim? De olhar para o conteúdo bruto de alguns arquivos PDF parecia que alguns números de índice que apontam para posições no arquivo após o catálogo teria que ser atualizado se o comprimento das anteriores alterações de conteúdo ..
OU Mapper

6

Se bem entendi, aqui está como deve funcionar:

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

Parece -me, no entanto, que isso não funcionou de maneira confiável ou completa da última vez que tentei (cerca de 2 anos atrás).

ATUALIZAÇÃO: Minha memória não estava me falhando. Agora tentei novamente e enviei um relatório de bug para o Ghostscript ( bug 691889 ) sobre isso. Siga o link para o relatório de erros para ver os detalhes.


5

NOTA 1: A resposta aceita ainda está na maior parte correta, mas possui algumas lacunas. Falta que muitos arquivos PDF não sejam diretamente editáveis ​​como texto. Mesmo quando estão, essa edição às vezes pode danificar o PDF, tornando-o ilegível. Uma solução que funcionará para o Unix e o Microsoft Windows é o qpdf, que pode converter arquivos PDF em "QDF", um formulário editável em texto que ainda é um arquivo PDF válido. O qpdfpacote vem com fix-qdfque recalcula as compensações após a edição de um arquivo QDF para corrigir qualquer dano.

NOTA 2: Desconfortável com editores de texto? Tente usar um editor de GUI como o jpdftweak primeiro. Às vezes, os editores de PDF da GUI funcionam; nesse caso, sim, você está pronto. No entanto, quando eles falham, como costuma ser o meu caso, você pode tentar esta alternativa mais robusta. De qualquer forma, por favor, não vote na minha resposta por ser menos que elegante.


COMO editar números de páginas PDF usando o Qpdf

Resumo:

  1. qpdf -qdf foo.pdf foo.qdf
  2. editar foo.qdf

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

Etapas detalhadas

Passo 1.

Converta o documento para o formato QDF facilmente editável. Execute o qpdf na linha de comando da seguinte maneira:

qpdf -qdf foo.pdf foo.qdf

Nota: Se você ainda não possui o qpdf instalado, é possível fazer o download dos executáveis ​​do Microsoft Windows em https://github.com/qpdf/qpdf/releases sistemas Unix, como Ubuntu e Debian GNU / Linux, podem ser instalados digitandoapt install qpdf .

Passo 2.

Edite o documento QDF usando um editor de texto como o notepad ++, emacs ou gedit. Pesquise a palavra /Cataloge observe os << colchetes angulares >> que estão dentro. Nas proximidades, você encontrará o atual /PageLabels( se houver ).

Nós estaremos adicionando cada seção que deve ser numerada diferentemente ao /PageLabels. O formato é start-page<< style>>. Observe que o espaço em branco não importa e que a primeira página do documento é 0. Salvo indicação em contrário, uma nova seção sempre inicia a numeração de páginas de 1.

Exemplos

Aqui está um exemplo completo da aparência de PageLabels, com comentários adicionados:

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

Se o arquivo não tiver rótulos de página, adicione-os depois /Type /Catalog. Por exemplo, pode-se mudar,

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

para dentro,

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

OPCIONAL: INÍCIO DE UM NÚMERO DIFERENTE COM /St

Cada seção reinicia a numeração em 1, a menos que você indique o contrário /St. Observe como no exemplo acima, a quarta página começa às 15.

OPCIONAL: USANDO UM ESTILO DIFERENTE COM /S

O /Soperador usa um argumento que permite escolher o estilo de numeração,

  • / D dígitos (1, 2, 3 ...)
  • / R romano maiúsculo (I, II, III ...)
  • / r romano em minúsculas (i, ii, iii ...)
  • / Uma letra maiúscula em ordem alfabética (A, B, C, ...., X, Y, Z, AA, AB, AC, ...)
  • / a em minúsculas alfabética (a, b, c, ...., x, y, z, aa, ab, ac, ...)

Se alguém omitir o /Soperador, essa seção das páginas não terá numeração. Por exemplo:

0 << >>         % No label for cover

OPCIONAL: ADICIONANDO UM PREFIXO PARA CADA PÁGINA COM /P

Você pode mostrar qualquer sequência de texto antes do número da página, especificando uma palavra entre parênteses após /P:

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

A especificação de um prefixo sem um estilo ( /S) fornecerá páginas que possuem apenas a palavra sem número. Isso pode ser útil, por exemplo, se você deseja que uma página de rosto simplesmente tenha o rótulo "Capa".

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

Etapa 3.

Corra fix-qdfpara tornar suas edições válidas em PDF e coloque a saída em bar.qdf.

fix-qdf foo.qdf > bar.qdf

Passo 4.

Abra o bar.qdf no seu programa de visualização de PDF e verifique se está numerado corretamente.

Etapa 5.

Converta o arquivo QDF novamente em um PDF normal, da seguinte maneira:

qpdf bar.qdf bar.pdf

Ta da. Você está feito. Agora você tem um documento com números de página rotulados corretamente em bar.pdf.


4

Existe um pequeno script python que pode fazer o trabalho: https://github.com/lovasoa/pagelabels-py

No seu caso, chame algo como:

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

Isso fez o trabalho exatamente como eu precisava. Obrigado!
telotortium 15/04

3

O jPdf Tweak é um utilitário gráfico de código aberto que permite editar rótulos de páginas em arquivos PDF. A página de documentação fornece instruções passo a passo.


Usei isso para adicionar meus rótulos de página personalizados como formato "vazio" com texto como prefixo. Funcionou bem!
precisa

Esta é uma resposta muito melhor do que editar manualmente as coisas com texto
endólito

Adicione aqui as instruções passo a passo, em vez de confiar em um link externo. Obrigado!
hackerb9

1

Para remover os antigos, provavelmente a maneira mais fácil de plataforma cruzada é apenas cortar os antigos. Você poderia fazer isso, por exemplo, com o BRISS.

Adicionar os novos usando ferramentas gratuitas é mais complicado. Pessoalmente, eu provavelmente faria isso com o pdflatex, como nesta resposta do StackExchange , embora essa possa ser uma solução bastante complicada, a menos que você tenha outros usos para o pdflatex.

Eu acho que isso pode ser feito, no entanto, com o jPdfTweak .


1

O método fornecido por Dane H. funciona com o Acrobat Reader (ou, para ser mais preciso, a versão atual do Adobe Reader). Um pequeno ponto a ser observado: o campo na parte superior aceita apenas 8 caracteres, assim você não pode inserir algo como 'índice de assunto' se esse rótulo tiver sido usado. Mas você pode usar o item de menu Exibir> Navegação na página> Ir para ... ou o equivalente-chave.

Outra dica: a especificação do pdf sempre atribui números de página consecutivamente; portanto, no caso de um documento produzido pela digitalização de pares de páginas, os dois conjuntos de números ficam fora da etapa (a menos que você trabalhe cada página individualmente). Mas você pode, com pouco esforço, configurar seu documento para que a convenção 'vá para a página n leve você às páginas 2n e 2n + 1' se aplique.


1

A resposta de dinamarqueses é a melhor, os formatos mudaram um pouco agora, isso pode ser útil:

%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

Eu achei que a edição direta do arquivo (como não compactada pelo pdftk) não funcionaria se já houvesse '/ títulos' definidos na região '/ esboços'. A técnica de edição direta descrita em um post acima é demonstrada no Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Mas o recurso 'update' do pdftk pode ser mais intuitivo (e mais confiável quando já existir '/ títulos' na região '/ estrutura de tópicos' do arquivo PDF), editando o arquivo 'doc_data.txt' usado aqui: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/


1
Olá @Bob, As respostas somente de link são de baixa qualidade. Eles serão inúteis se o site de destino se mover ou desaparecer. Edite sua resposta e cite a parte relevante da solução aqui.
C0deDaedalus 27/05

0

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

Você pode adicionar / remover / alterar o esquema interno de números de páginas na guia "páginas" desta ferramenta de freeware.

E tenha cuidado, o visualizador de PDF xchange não mostra o esquema de número da página e o foxitreader tem o resultado certo. Não testei o leitor Acrobat.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.