¿Cómo cambiar los números de página internos en los metadatos de un PDF?


37

Tengo un documento PDF que creé a través de medios que no son de Acrobat (imprimiendo en PDF, luego combinando un montón de archivos PDF), pero me gustaría cambiar manualmente los números de página (es decir, las primeras páginas son simplemente páginas de título, la página que está etiquetada como "página 1" es realmente la séptima hoja del pdf). ¿Cuál es la forma más simple (e idealmente gratuita) de hacer esto?

Para ser claros, no estoy tratando de cambiar los números en las páginas en sí, sino los números de página en los "metadatos" que almacena el pdf (las páginas en sí ya están numeradas correctamente; solo quiero "ir a la página 1" para ir a la página etiquetada 1, que podría ser la hoja 7).

Por lo que vale, estoy en Windows, aunque también tengo acceso a Mac.


No estoy seguro si entiendo su descripción + requisito completamente. ¿Puede proporcionar un enlace a un PDF de muestra que desea modificar?
Kurt Pfeifle

¿hay una herramienta de línea de comandos para hacer eso, por ejemplo, en un gran archivo pdf sin abrir realmente el archivo txt?
jj_p

como pdftk por ejemplo?
jj_p

Respuestas:


39

Lo que quiere se llama etiquetas de página y se puede agregar fácilmente directamente en el código fuente del PDF. Cambiar el nombre de la extensión del archivo de pdfa txty abra el archivo en un editor de texto (esto puede ser lento, dependiendo del tamaño del archivo, sea paciente). La información sobre las etiquetas de página se almacena en un nodo llamado catálogo de documentos que se parece a esto:

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

Puede contener cosas más confusas, pero esta es la estructura básica. Solo hay un catálogo, por lo que en un archivo grande puede buscar el nodo que contiene /Catalog. Ahora puede hacer los cambios deseados insertando la /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

Hay 3 líneas que comienzan con números, llamados índices de página . La página 1 tiene el índice 0, la página 2 el índice, 1etc. Siempre describen los rangos, por lo que la línea con se 1 <<...>>aplica a todas las páginas desde el índice 1 al 5 y la línea con se 6 <<...>>aplica a todas las páginas desde 6 hasta la última página. 0 <<...>>Siempre se debe definir una etiqueta para .

Puede encontrar más información sobre etiquetas de página y código fuente PDF en el estándar PDF o en una wiki sobre estándares PDF.


44
¡Maravilloso! Este es el único lugar en la web donde he encontrado información tan directa y útil. No todos tenemos Acrobat Reader, después de todo.
Noldorin

3
Con el ejemplo /St 8o /St 2, establece un punto de inicio para la etiqueta mostrada; pero elija cualquier número en lugar de 8 (o 2), que debe ser> = 1. Por ejemplo, 1 << /S /r /St 12 >>numerará las páginas de (en realidad) 2-6 como (se muestra) xii-xvii , porque '12' corresponde a 'xii'.
n611x007

1
gracias por la respuesta, pero en mi experiencia este método a veces funciona y otras no; Además, encontré más de un catálogo: ¿cómo se explica eso?
jj_p

1
Gran informacion. Aquí hay un enlace a otra fuente útil: Especificación de numeración de página coherente para documentos PDF del W3C.
Adam Mackler

2
¿Estás seguro de que funciona así? Al observar el contenido en bruto de algunos archivos PDF, parecían algunos números de índice que apuntan a posiciones en el archivo después de que el catálogo tendría que actualizarse si la longitud del contenido anterior cambia ...
O Mapper

6

Si te entiendo correctamente, así es como debería 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

Sin embargo, me parece recordar, que este hecho no funcione correctamente o completamente última vez que probé este (aproximadamente 2 años).

ACTUALIZACIÓN: Mi memoria no me estaba fallando. Ahora intenté nuevamente y presenté un informe de error para Ghostscript ( error 691889 ) con respecto a esto. Siga el enlace al informe de error para ver los detalles.


5

NOTA 1: La respuesta aceptada sigue siendo mayormente correcta, pero tiene algunas lagunas. Carece de que muchos archivos PDF no sean directamente editables como texto. Incluso cuando lo están, tal edición a veces puede dañar el PDF haciéndolo ilegible. Una solución, que funcionará tanto para Unix como para Microsoft Windows es qpdf, que puede traducir archivos PDF a "QDF", un formulario editable en texto que sigue siendo un archivo PDF válido. El qpdfpaquete viene con el fix-qdfque recalcula las compensaciones después de que un archivo QDF ha sido editado para corregir cualquier daño.

NOTA 2: ¿Se siente incómodo con los editores de texto? Intente usar un editor de GUI como jpdftweak primero. A veces, los editores de PDF de la GUI funcionan, en cuyo caso, sí, ya está. Sin embargo, cuando fallan, como a menudo ha sido el caso para mí, puede probar esta alternativa más sólida. De cualquier manera, por favor no vote mi respuesta por ser menos que elegante.


CÓMO EDITAR Números de página PDF usando Qpdf

Resumen:

  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. prueba bar.qdf
  5. qpdf bar.qdf bar.pdf

Pasos detallados

Paso 1.

Convierta el documento al formato QDF fácilmente editable. Ejecute qpdf desde la línea de comando así:

qpdf -qdf foo.pdf foo.qdf

Nota: Si aún no tiene qpdf instalado, los ejecutables de Microsoft Windows se pueden descargar desde https://github.com/qpdf/qpdf/releases. Los sistemas Unix, como Ubuntu y Debian GNU / Linux, pueden instalarlo escribiendoapt install qpdf .

Paso 2.

Edite el documento QDF usando un editor de texto como notepad ++, emacs o gedit. Busque la palabra /Catalogy observe los << paréntesis angulares >> que está dentro. Cerca, encontrará el actual /PageLabels( si lo hay ).

Agregaremos cada sección que debe estar numerada de manera diferente a /PageLabels. El formato es start-page<< style>>. Tenga en cuenta que el espacio en blanco no importa y que la primera página del documento sí lo es 0. A menos que se especifique lo contrario, una nueva sección siempre comienza numerando páginas desde 1.

Ejemplos

Aquí hay un ejemplo completo del aspecto de PageLabels, con comentarios agregados:

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

Si el archivo no tiene PageLabels, agréguelos después /Type /Catalog. Por ejemplo, uno podría cambiar,

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

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: A PARTIR DE UN NÚMERO DIFERENTE CON /St

Cada sección reinicia la numeración en 1 a menos que se indique lo contrario usando /St. Observe cómo en el ejemplo anterior, la cuarta página comienza en 15.

OPCIONAL: UTILIZAR UN ESTILO DIFERENTE CON /S

El /Soperador toma un argumento que le permite elegir el estilo de numeración,

  • / D dígitos (1, 2, 3 ...)
  • / R romana mayúscula (I, II, III ...)
  • / r romana en minúsculas (i, ii, iii ...)
  • / A alfabético en mayúsculas (A, B, C, ...., X, Y, Z, AA, AB, AC, ...)
  • / a alfabético en minúsculas (a, b, c, ...., x, y, z, aa, ab, ac, ...)

Si se omite el /Soperador, esa sección de páginas no tendrá numeración. Por ejemplo:

0 << >>         % No label for cover

OPCIONAL: AGREGAR UN PREFIJO A CADA PÁGINA CON /P

Puede mostrar cualquier cadena de texto antes del número de página especificando una palabra entre paréntesis después de /P:

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

Si especifica un prefijo sin estilo ( /S), obtendrá páginas que solo tienen la palabra sin ningún número. Esto puede ser útil, por ejemplo, si desea que una portada simplemente tenga la etiqueta "Carátula".

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

Paso 3.

Ejecute fix-qdfpara hacer que sus ediciones sean válidas en PDF y coloque la salida en bar.qdf.

fix-qdf foo.qdf > bar.qdf

Etapa 4.

Abra bar.qdf en su programa de visualización de PDF y verifique que esté numerado correctamente.

Paso 5

Convierta el archivo QDF nuevamente a un PDF normal, así:

qpdf bar.qdf bar.pdf

Ta da. Ya terminaste Ahora tiene un documento con números de página correctamente etiquetados en bar.pdf.


4

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

En su caso, llame a algo como:

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

Esto hizo el trabajo exactamente como lo necesitaba. ¡Gracias!
telotortio

3

jPdf Tweak es una utilidad gráfica de código abierto que te permite editar etiquetas de página en archivos PDF. La página de documentación proporciona instrucciones paso a paso.


Utilicé esto para agregar mis etiquetas de página personalizadas como formato "vacío" con texto como prefijo. ¡Funcionado bien!
Matt Sephton

Esta es una respuesta mucho mejor que la edición de texto a mano
endolito

Agregue las instrucciones paso a paso aquí en lugar de confiar en un enlace externo. ¡Gracias!
hackerb9

1

Para eliminar los viejos, probablemente la forma más fácil de plataforma cruzada es simplemente recortar los viejos. Podría hacerlo, por ejemplo, con BRISS.

Agregar las nuevas usando herramientas gratuitas es más complicado. Personalmente, probablemente lo haría con pdflatex, como en esta respuesta de StackExchange , aunque esa podría ser una solución bastante complicada a menos que tenga otros usos para pdflatex.

Creo que se puede hacer, sin embargo, con jPdfTweak en su lugar.


1

El método proporcionado por Dane H. funciona con Acrobat Reader (o, para ser precisos, la versión actual de Adobe Reader). Un punto menor a tener en cuenta: el campo en la parte superior solo aceptará 8 caracteres, por lo que no puede ingresar algo como 'índice de asunto' si se ha utilizado dicha etiqueta. Pero en su lugar, puede usar el elemento de menú Ver> Navegación de página> Ir a ..., o el equivalente de la tecla.

Otro consejo: la especificación pdf siempre asigna números de página consecutivamente, por lo que en el caso de un documento producido escaneando pares de páginas, los dos conjuntos de números se salen del paso (a menos que numere laboriosamente cada página individualmente). Pero con poco esfuerzo puede configurar su documento para que se aplique la convención 'ir a la página n a las páginas 2n y 2n + 1'.


1

La respuesta de Danes es la mejor, los formatos cambiaron un poco ahora, esto podría 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

Encontré que la edición directa del archivo (como descomprimido por pdftk) no funciona si ya hay '/ títulos' establecidos en la región '/ contornos'. La técnica de edición directa descrita en una publicación anterior se demuestra en Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Pero la función de 'actualización' de pdftk puede ser más intuitiva (y más confiable cuando ya existen '/ títulos' en la región '/ contornos' del archivo PDF) mediante la edición del archivo 'doc_data.txt' utilizado aquí: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/


1
Hola @Bob, las respuestas de solo enlace son de baja calidad. Serán inútiles si el sitio objetivo se mueve o desaparece. Edite su respuesta y cite la parte relevante de la solución aquí.
C0deDaedalus

0

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

Puede agregar / eliminar / cambiar el esquema interno de números de página en la pestaña "páginas" de esta herramienta gratuita.

Y tenga cuidado, el visor de PDF xchange no muestra el esquema del número de página y foxitreader tiene un resultado correcto. No he probado el lector Acrobat.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.