Renumerar páginas de um PDF

25

Quero editar os metadados de um PDF digitalizado para atribuir números de páginas personalizados a diferentes páginas. Por exemplo, quais são as páginas 1-3 agora que eu posso chamar de i, ii e iii e quais são as páginas 4-10 que desejo chamar de 1-7. Eu não quero mudar a ordem real das páginas.

Existe A) Uma maneira de fazer isso usando ferramentas gratuitas; e B) Uma maneira de fazer isso "em lote" (sem precisar renumerar cada página manualmente).

MarkovCh1
fonte
1
Você ficaria feliz com uma solução baseada no LaTeX? Seria possível incluir o PDF em um documento vazio e criar os números de página do PDF como desejar.
Martin Scharrer
Eu realmente ficaria feliz com uma solução LaTeX. Você pode postar alguns detalhes abaixo?
precisa saber é o seguinte

Respostas:

22

Aqui está uma solução baseada no LaTeX. Ele usa o pdfpagespacote para incluir o PDF digitalizado (aqui chamado scan.pdf). Os rótulos da página PDF que você deseja podem ser definidos usando o hyperrefpacote com a pdfpagelabelsopção ativada. Ele usa a \thepagemacro normal como um rótulo que pode ser definido para números romanos em minúsculas. O contador de páginas é redefinido e alterado novamente para números normais.

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

Coloque o código acima em um arquivo (por exemplo scan_mod.tex) e compile-o com pdflatex:

# pdflatex scan_mod

Isso irá produzir scan_mod.pdf. No entanto, qualquer anotação especial incl. hiperlinks desaparecerão. Isso não deve causar nenhum problema nos PDFs digitalizados.

Se você precisar disso com mais frequência, poderá escrever um script que aceite o número de páginas numeradas romanas e o (s) nome (s) do arquivo como argumentos e criar um arquivo temporário com o código acima, onde o nome e os números são variáveis, que são compilados.

Martin Scharrer
fonte
Obrigado por uma resposta tão completa! Esta é uma otima soluçao. As únicas soluções que eu conhecia incluíam o .NET ou algo igualmente horrível ou vasculharam diálogos no Adobe Acrobat (que eu não posso pagar de qualquer maneira). Isso é até scriptável!
precisa saber é o seguinte
Ótima solução! Eu estava pensando sobre a mesma questão de geração em lote de marcadores / contornos no painel esquerdo com hiperlinks para o início de cada seção / capítulo. É possível usar o LaTex também? Aqui está a minha pergunta askubuntu.com/questions/27312/bookmark-pdf-and-djvu-files . Obrigado!
Tim
2
@ Tim: Você pode criar marcadores em PDF com LaTeX ao combinar PDFs. Veja minha resposta para Como uso o LaTeX para criar um índice (títulos de capítulos, subseções etc.) para um conjunto de arquivos pdf que estou mesclando em um único pdf grande? no TeX.SX.
Martin Scharrer
Esta é uma resposta fantástica, usei-a e funciona perfeitamente.
Andrea Lazzarotto 27/10
1
@ TiG: Sim, é porque as páginas do PDF original são adicionadas a um novo PDF e, nesse processo, os links e coisas semelhantes são descartados (por segurança, como eu me lembro). Como o OP era sobre PDF digitalizado, isso não era um problema.
Martin Scharrer
10

Você pode fazer isso com um editor de texto.

Como a resposta diz, abra um arquivo PDF com um editor de texto, pesquise /Catalogentrada e, em seguida, acrescente uma entrada com o seguinte nome /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
]
>>

Observe que os índices da página (números físicos da página) começam com 0.

É claro que você pode fazer isso automaticamente usando linguagens de script.

Padrões em PDF - Etiquetas da página possuem especificações detalhadas.

Akihiro HARAI
fonte
+1 Esta resposta é muito mais simples e melhor que a aceita e o link para as especificações é uma grande ajuda.
JJA
6

O jPDF Tweak é um utilitário gráfico de código aberto que oferece numeração de páginas (o termo correto é "rotulagem de página") e muitos outros recursos avançados de edição de PDF, do iniciante aos avançados. É executado no Ubuntu e outros sistemas operacionais.

A página Documentação fornece instruções passo a passo.

CherryBerry
fonte
Obrigado, isso o que realmente me ajudou, preservando formas e tudo. O jPDF Tweak é uma coisa realmente poderosa, embora com uma interface não muito conveniente.
TiGR
Se a pergunta original não mencionasse trabalhos em lotes, eu diria que essa resposta realmente merece ser a aceita.
Brian Z
4

Existe uma ferramenta chamada PDF Mod, que é uma ferramenta gratuita para reorganizar as páginas de um PDF.

Ele pode ser instalado a partir do Ubuntu Software Center no Ubuntu 10.10 e superior.

Para instalar no Ubuntu 9.10 ou 10.04:

Para instalar Adicione o ppa ppa:pdfmod-team/ppaàs suas fontes de software ( veja como fazer isso ) e instale o pdfmod a partir do centro de software

Adaptado de: http://www.webupd8.org/2011/03/edit-pdf-documents-in-linux-with-pdf.html

Boa sorte: D

Wilsonzaizai
fonte
4
Ah, mas minha pergunta não estava perguntando sobre como reorganizar as páginas. Era para mudar os metadados das páginas: re-rotular os números das páginas (inserir algarismos romanos nas primeiras páginas, talvez pular alguns; os PDFs suportam os primeiros).
MarkovCh1
3

Acabei de encontrar um ponteiro que poderia ser possível usar ghostscriptpara isso, aqui: pdftk - Adicione e edite indicadores para pdf - Unix e Linux - Stack Exchange # 18600 ; refere-se a links:

No entanto, o acima mencionado lida com marcadores - não com paginação lógica. Acontece que em pdfmarkReference.pdf , o "comando" necessário é ' /Label' (ou ' /PAGELABEL') - e se refere ainda ao capítulo PDFReference.pdf 8.3.1 "Etiquetas da página". Infelizmente, esse capítulo não explica necessariamente como os marcadores de pdf podem ser usados ​​com rótulos de página - mas esta postagem explica:

O / PAGELABEL pdfmark não possui nenhuma tecla / Page; portanto, é possível definir o rótulo apenas para a página 'atual' (e, como conseqüência, apenas para uma página por vez). Como você o chama desde o início, é esperado que você defina um rótulo para a 1ª página e somente para ela.

Múltiplos / PAGELABELs para a mesma página: a referência em pdfmark diz que a última entra em vigor, portanto o resultado da sua primeira linha de comando está OK. Observe que a tecla / Page é ignorada.

Como definir rótulos de página no PostScript? Eu posso pensar em 2 métodos:

(A) A maneira 100% documentada:

Emita a / PAGELABEL como parte de cada página.

(B) A maneira menos documentada: ...

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

... e ainda mais nesse segmento:

Quanto a fazer esse trabalho; como o arquivo original é um arquivo PDF, você pode executar cada página do arquivo individualmente. Assim, você pode definir a marca de pdf PAGELABEL para a página 1, executar a página 1 a partir do arquivo original, definir o PAGELABEL para a página 2, executar a página 2 a partir do arquivo original e assim por diante.

Como o rótulo é (como SaGS), disse aplicado à página atual, isso deve definir corretamente os rótulos para cada página no arquivo PDF de saída. (ressalva: eu realmente não tentei isso)

EDIT: apenas para mostrar isso - se você o salvou como pdfmarksarquivo:

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

... e você chama:

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

... então você terá três páginas vazias anexadas no final de infile.pdf, rotuladas -1, 0 e 1 :)

 

Bem, talvez isso ajude em algum momento a obter um gsscript mais simples para renumerar as páginas :)
Felicidades!

 

EDIT2: Entendi, eu acho - use o mesmo gscomando acima - e abaixo estão o conteúdo do pdfmarksscript, que renumerará o infile.pdf, então começa com -1, 0, 1 ... É basicamente um exemplo modificado de a referência em PDF (ver comentários para mais):

% 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
sdaau
fonte
Ótimo! Graças, você não brincar :)
MarkovCh1
2

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

No seu caso, ligue para:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 4 --type arabic file.pdf
DG »
fonte
1
Esta é uma otima soluçao!
mikemtnbikes 31/10
1

O Openoffice / Libreoffice pode fazer o truque com a extensão de importação de pdf e uma Macro de paginação.

Não é uma solução perfeita, mas funciona para mim (além de usar o PDF Mod - o que eu sugeriria fortemente).

RolandiXor
fonte
A extensão pdf-import parece interrompida para o OpenOffice.org 3.2. A importação (no Draw e Writer) gera um "erro de E / S".
precisa saber é o seguinte
0

Experimente pyPdf , uma biblioteca python para manipular documentos PDF. Alguma, mas não muita, programação seria necessária.

Você também pode dar uma olhada no PDFtk , embora eu não tenha verificado se ele suporta a alteração do número da página associada a páginas individuais. Ambos estão disponíveis como pacotes no Ubuntu.

Loevborg
fonte
1
Hm, o PDFtk parece não conseguir. O pyPdf possui muitos métodos para extrair metadados, mas não parece capaz de escrevê-los novamente no documento.
precisa saber é o seguinte
0

Existe outro aplicativo chamado PDFEdit - que é hospedado no forge de origem. Página do projeto Source Forge - no entanto, isso não ajuda, pois não possui a funcionalidade necessária

Edição de texto em PDFEdit

lazyPower
fonte
1
Na verdade, não acho que o PDF Edit possa alterar os números de página. Eu tentei e não consegui, em qualquer caso.
precisa saber é o seguinte
2
@ Syzygy - na verdade, apenas verificado: pdfeditpode mostrar o Catalog/PageLabelsDict se um documento o possuir, mas se for selecionado, ele diz: " Este dicionário não possui propriedades editáveis ​​diretamente " ... Saúde!
Sdaau # 14/11