Renumerar páginas de un PDF

25

Quiero editar los metadatos de un PDF escaneado para asignar números de página personalizados a diferentes páginas. Por ejemplo, lo que ahora son las páginas 1-3 me gustaría llamar a i, ii y iii, y lo que son las páginas 4-10, quiero llamar al 1-7. Yo no quiero cambiar el orden real de las páginas.

¿Hay A) una forma de hacer esto usando herramientas gratuitas; y B) Una forma de hacer esto "en lote" (sin tener que renumerar cada página manualmente).

MarkovCh1
fuente
1
¿Estaría contento con una solución basada en LaTeX? Sería posible incluir el PDF en un documento vacío y crear los números de página del PDF que desee.
Martin Scharrer
De hecho, estaría contento con una solución LaTeX. ¿Puedes publicar algunos detalles a continuación?
MarkovCh1

Respuestas:

22

Aquí una solución basada en LaTeX. Utiliza el pdfpagespaquete para incluir el PDF escaneado (aquí llamado scan.pdf). Las etiquetas de página PDF que desea pueden configurarse utilizando el hyperrefpaquete con la pdfpagelabelsopción habilitada. Utiliza la \thepagemacro normal como una etiqueta que se puede definir con números romanos en minúsculas. El contador de páginas se reinicia y vuelve a cambiar a números normales.

\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 el código anterior en un archivo (por ejemplo scan_mod.tex) y compílelo con pdflatex:

# pdflatex scan_mod

Esto producirá scan_mod.pdf. Sin embargo, cualquier anotación especial incl. Los hipervínculos desaparecerán. Esto no debería ser ningún problema con los PDF escaneados.

Si necesita esto con más frecuencia, podría escribir un script que acepte el número de páginas con números romanos y los nombres de archivo como argumentos y cree un archivo temporal con el código anterior donde el nombre y los números son variables, que luego se compila.

Martin Scharrer
fuente
Gracias por una respuesta tan completa! Esta es una gran solución. Las únicas otras soluciones que conocía incluían .NET o algo igualmente horrible, o leer diálogos en Adobe Acrobat (que no puedo permitirme de todos modos). ¡Esto es incluso programable!
MarkovCh1
Buena solución! Me preguntaba sobre la misma cuestión de generación por lotes de marcadores / contornos en el panel izquierdo con hipervínculos al comienzo de cada sección / capítulo. ¿Es posible usar LaTex también? Aquí está mi pregunta askubuntu.com/questions/27312/bookmark-pdf-and-djvu-files . ¡Gracias!
Tim
2
@Tim: puede crear marcadores PDF con LaTeX al combinar archivos PDF. Vea mi respuesta a ¿Cómo uso LaTeX para crear una tabla de contenido (encabezados de capítulos, subsecciones, etc.) para un conjunto de archivos pdf que estoy fusionando en un solo pdf grande? en TeX.SX.
Martin Scharrer
Esta es una respuesta fantástica, la usé y funciona perfectamente.
Andrea Lazzarotto
1
@TiGR: Sí, eso se debe a que las páginas del PDF original se agregan a un nuevo PDF y en este proceso se descartan los hipervínculos y cosas similares (por seguridad, según recuerdo). Debido a que el OP se trataba de PDF escaneado, esto no fue un problema.
Martin Scharrer
10

Puedes hacerlo con un editor de texto.

Como dice la respuesta, abra un archivo PDF con un editor de texto, busque una /Catalogentrada y luego agregue una entrada llamada /PageLabelsasí:

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

Tenga en cuenta que los índices de página (números de página físicos) comienzan con 0.

De cource, puede hacer esto automáticamente usando lenguajes de script.

Normas PDF - Etiquetas de página tiene especificaciones detalladas.

Akihiro HARAI
fuente
+1 Esta respuesta es mucho más simple y mejor que la aceptada, y el enlace a la especificación es de gran ayuda.
jja
6

jPDF Tweak es una utilidad gráfica de código abierto que ofrece numeración de páginas (el término correcto es "etiquetado de páginas") y muchas otras funciones de edición de PDF de principiante a avanzado. Se ejecuta en Ubuntu y otros sistemas operativos.

La página de documentación proporciona instrucciones paso a paso.

Cereza
fuente
Gracias, esto es lo que realmente me ayudó, preservar formas y todo. jPDF Tweak es algo realmente poderoso, aunque con una interfaz no muy conveniente.
TiGR
Si la pregunta original no mencionara los trabajos por lotes, diría que esta respuesta realmente merece ser la aceptada.
Brian Z
4

Hay una herramienta llamada PDF Mod que es una herramienta gratuita para reorganizar las páginas de un PDF.

Se puede instalar desde el Centro de software de Ubuntu en Ubuntu 10.10 y superior.

Para instalar en Ubuntu 9.10 o 10.04:

Para instalar Agregue el ppa ppa:pdfmod-team/ppaa sus fuentes de software ( Aquí se explica cómo hacerlo ) e instale pdfmod desde el centro de software

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

Buena suerte: D

Wilsonzaizai
fuente
44
Ah, pero mi pregunta no era sobre cómo reorganizar las páginas. Fue para cambiar los metadatos de las páginas: volver a etiquetar los números de página (insertar números romanos como las primeras páginas, tal vez omitir algunas; los archivos PDF admiten la primera sin duda).
MarkovCh1
3

Acabo de encontrar un puntero que podría ser posible usar ghostscriptpara esto, aquí: pdftk - Agregar y editar marcadores a pdf - Unix y Linux - Stack Exchange # 18600 ; se refiere a enlaces:

Sin embargo, lo anterior trata con marcadores, no con paginación lógica. Resulta de pdfmarkReference.pdf , el "comando" necesario es ' /Label' (o ' /PAGELABEL'), y se refiere además al capítulo 8.3.1 de PDFReference.pdf "Etiquetas de página". Desafortunadamente, ese capítulo no explica necesariamente cómo se pueden usar las marcas pdf con las etiquetas de página, pero esta publicación sí:

La marca / PAGELABEL pdf no tiene ninguna tecla / Página, por lo que se puede establecer la etiqueta solo para la página 'actual' (y, como consecuencia, solo para una página a la vez). Como lo llama desde el principio, se espera que establezca una etiqueta para la primera página y solo para ella.

Múltiples / PAGELABELs para la misma página: la referencia de pdfmark dice que la última tiene efecto, por lo que el resultado de su primera línea de comando está bien. Tenga en cuenta que la tecla / Página se ignora.

¿Cómo establecer etiquetas de página desde PostScript? Puedo pensar en 2 métodos:

(A) La forma 100% documentada:

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

(B) La forma 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

... y más en ese hilo:

En cuanto a hacer que esto funcione; Como el archivo original es un archivo PDF, puede ejecutar cada página desde el archivo individualmente. Por lo tanto, puede configurar la marca pdf PAGELABEL para la página 1, ejecutar la página 1 desde el archivo original, configurar la PAGELABEL para la página 2, ejecutar la página 2 desde el archivo original y así sucesivamente.

Debido a que la etiqueta se aplica (como SaGS) a la página actual, esto debería establecer correctamente las etiquetas para cada página en el archivo PDF de salida. (advertencia: en realidad no he intentado esto)

EDITAR: solo para mostrar esto, si tiene esto guardado como pdfmarksarchivo:

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

... y llamas:

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

... entonces obtendrá tres páginas vacías al final de infile.pdf, etiquetadas con -1, 0 y 1 :)

 

Bueno, tal vez esto ayude en algún momento a obtener un gsscript más simple para renumerar las páginas :)
¡Salud!

 

EDIT2: Creo que lo tengo, use el mismo gscomando que el anterior, y debajo están los contenidos del pdfmarksscript, que renumerará el archivo infile.pdf, por lo que comienza con -1, 0, 1 ... Es básicamente un ejemplo modificado de la referencia en PDF (ver comentarios para más):

% 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
fuente
¡Excelente! Gracias, no
bromees
3

Hay un pequeño script de Python que puede hacer el trabajo: https://github.com/lovasoa/pagelabels-py

En tu caso llama:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 4 --type arabic file.pdf
DG '
fuente
1
¡Esta es una gran solución!
mikemtnbikes
1
¡Esto funciona como un encanto, un gran ahorro de tiempo también!
Bastian hace
1

Openoffice / Libreoffice puede hacer el truco con la extensión de importación de pdf y una Macro de paginación.

No es una solución perfecta, pero funciona para mí (aparte de usar PDF Mod, lo que sugeriría encarecidamente).

RolandiXor
fuente
La extensión de importación de pdf parece interrumpida para OpenOffice.org 3.2. La importación (en Draw and Writer) genera un "error de E / S".
MarkovCh1
0

Pruebe pyPdf , una biblioteca de python para manipular documentos PDF. Alguna, pero no mucha, programación sería necesaria.

También podría echar un vistazo a PDFtk , aunque no he comprobado si admite cambiar el número de página asociado con páginas individuales. Ambos están disponibles como paquetes en Ubuntu.

loevborg
fuente
1
Hm, PDFtk no parece ser capaz de hacerlo. pyPdf tiene muchos métodos para extraer metadatos, pero no parece poder volver a escribirlos en el documento.
MarkovCh1
0

Existe otra aplicación llamada PDFEdit, alojada en la falsificación de código fuente. Página del proyecto de Source Forge : sin embargo, esto no ayuda porque no tiene la funcionalidad que necesita

Edición de texto en PDFEdit

lazyPower
fuente
1
Realmente no creo que PDF Edit pueda cambiar los números de página. Lo intenté y no he tenido éxito, en cualquier caso.
MarkovCh1
2
@Syzygy: de hecho, recién comprobado: pdfeditpuede mostrar Catalog/PageLabelsDict si un documento lo tiene, pero si está seleccionado, dice: " Este diccionario no tiene ninguna propiedad directamente editable " ... ¡Salud!
sdaau