linux - examples - ¿Fusionar PDF con PDFTK con marcadores?
pdftk merge pdf (10)
Demasiado agregar o editar marcadores PDF, podrías usar JPdfBookmarks . Es una excelente herramienta de Software Libre multi-OS que he estado usando desde hace un tiempo con excelentes resultados. Sin embargo, trata con marcadores, por lo que necesitaría otra herramienta para combinar o reordenar páginas. Además de pdftk, sugiero probar PDF Split and Merge (buena aplicación, pero UI extraña, estropea los marcadores de mi experiencia), PDF-Shuffler (parece funcionar bien, pero a veces se congela al tratar con algunos archivos), o PdfMod (el lo mejor es potencialmente, ya que se trata de reorganizar, fusionar y tratar con marcadores, aunque no he podido averiguar cómo agregar archivos PDF a una página específica).
Perdón por no proporcionar algunos enlaces, como novato, el sistema solo me permite agregar 2 hipervínculos.
Usar pdftk para fusionar múltiples archivos PDF funciona bien. Sin embargo, ¿alguna forma sencilla de hacer un marcador para cada pdf fusionado?
No veo nada en los documentos de pdftk con respecto a esto, así que no creo que sea posible con pdftk.
Todos nuestros archivos combinados serán de 1 página, por lo que nos preguntamos si hay alguna otra utilidad que pueda agregarse en los marcadores después.
U otra utilidad de pdf basada en Linux que permitirá combinar mientras se especifica un marcador para cada pdf individual.
Hay PdfMod . Tiene una interfaz gráfica y te permite agregar marcadores manualmente. Además, si edita un PDF que ya viene con marcadores, se actualizará automáticamente para que apunte a las páginas correctas.
La buena respuesta de @pipitas no resuelve los problemas de marcadores mejorados, y hay una pregunta relacionada en la discusión de Unix https://unix.stackexchange.com/questions/17065/add-and-edit-bookmarks-to-pdf/31070 , donde sugiero
Si sigues con esos scripts de Unix, entonces
- extraer los datos de marcador arrojados desde
pdftk
- escriba una secuencia de comandos adicional para convertir los datos de marcador volcados en formato pdfmarks, que se acepta el comando ghostscript
gs
. - use la secuencia de comandos
gs
para fusionarlos junto con pdfmarks
El script ya existe, consulte pdf-merge.py
en Merge PDF''s con PDFTK con Marcadores?
Lamentablemente, no hay una manera fácil de hacerlo. Puede usar la biblioteca sobre la que se construye pdftk directamente y escribir un programa Java o .NET que use iText o iTextSharp para combinar sus buscapersonas y crear los marcadores. Si desea ir a la ruta iText, hay muchos ejemplos disponibles en línea o en el libro iText (escrito por el autor iText).
... o hágame saber lo que no funciona y puedo ayudarlo.
Lo siguiente está destinado a ser un comentario a la respuesta por pdfmerger ( https://.com/a/30524828/3915004 ).
Gracias por su script pdfmerger! Sé que la pregunta está marcada con Linux, pero para generalizar tu script para Mac OS X, se necesitan 2 cosas:
- ghostscript
gs
y - el comando
pdfinfo
(que se incluye, por ejemplo, enpoppler
)
Instálalos obteniendo la primera brew
(googleala, está instalada a través de algún comando curl / ruby-magic ^^) y luego simplemente:
brew install ghostscript
brew install poppler
ADD-ON: LEA EL ARCHIVO DE TEXTO CON LOS TÍTULOS DEL CAPÍTULO:
Para expandir tu script. Utilizo este flujo de trabajo principalmente para libros disponibles como descargas de capítulos desde el sitio web de los editores. Un archivo de texto que contiene los nombres de los capítulos se puede generar fácilmente. El siguiente complemento a su código lee adicionalmente un archivo de texto ''capters.txt'' que contiene una línea por pdf para fusionarse. (Nota, no implementé ninguna verificación en el número de líneas correspondientes al número de pdfs).
Simplemente expanda su script reemplazando las siguientes líneas:
p = subprocess.Popen(''ls *pdf'', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
c = subprocess.Popen(''less chapters.txt'', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
pdfdateien = []
kombinationen = []
chapternames = []
for line in c.stdout.readlines():
# c contains all chapter-titles
chapternames.append(line)
for line in p.stdout.readlines():
y
for index, kombination in enumerate(kombinationen):
# dateiname = kombination[0][0:len(kombination[0])-5]
#
# Hier noch dateiname evtl. verwursten
# z. B.
# lesezeichen = dateiname[0:1]+" "+dateiname[6:8]+"/"+dateiname[1:5]
# lesezeichen = dateiname
lesezeichen=chapternames[index][:-1]
anz_seiten = kombination[1][16:len(kombination[1])-1]
Sé que hay otras maneras de hacer esto ya mencionado, pero con pdftk puede tomar el pdf combinado y agregarle marcadores usando la función pdftk dump_data para crear un archivo .info de la información existente en el pdf. Luego puede agregar información de marcador al archivo .info agregando las siguientes cuatro líneas para cada marcador
BookmarkBegin
BookmarkTitle: name
BookmarkLevel: level
BookmarkPageNumber: page number
A continuación, utilice la llamada update_info para actualizar los marcadores pdf combinados con los que escribió en el archivo .info. He escrito algunas funciones simples que hacen esto por mí en autohotkey si alguien está interesado. Consulte http://www.autohotkey.com/board/topic/98985-scripts-to-merge-pdfs-and-add-bookmarks-with-pdftk/
Tal vez lo siguiente es útil. Quería fusionar todos los pdfs (in_nn.pdf) ubicados en un directorio en uno out.pdf que tiene los nombres de entrada pdfs (in_nn) como ToC. Escribí un script de Python que lee los nombres y extrae los números de página y genera un archivo llamado pdfmarks. La fusión de los archivos se hace fácilmente con gs. El comando exacto es emitido por el script y debe ejecutarse por separado (tal vez con algunas modificaciones debido a adaptaciones de tamaño de página o debido al sistema operativo).
Aquí está. Tal vez algunas modificaciones son necesarias para Windows? (perdón por los comentarios no en inglés). Simplemente ejecute la secuencia de comandos python en el directorio donde se encuentran los pdfs que se fusionarán.
#!/usr/bin/env python
import subprocess
# Dieses Skript dient dazu, eine Reihe von pdfs zu einem einzigen pdf zusammenzufassen und bookmarks fuer diese pdf-Datei zu erzeugen.
# Dafuer wird ein Datei pdfmark benoetigt, die mit diesem Skript erzeugt wird.
# Dazu einfach dieses Skript in dem Verzeichnis aufrufen, das genau alle zusammenzufassenden pdfs (*pdf, s.u.) enthaelt.
# Das zusammenfassende pdf wird dann mit diesem Befehl (in der bash) generiert:
# gs -dBATCH -dNOPAUSE -sPAPERSIZE=A4 -sDEVICE=pdfwrite -sOutputFile="all.pdf" $(ls *pdf ) pdfmarks
# Bereits Inhaltsverzeichnisse bleiben erhalten, die neuen kommen ans Ende des Inhaltsverzeichnisses.
#
# pdfmarks sieht dabei prinzipiell so aus:
#
# [/Title (Nr. 1) /Page 1 /OUT pdfmark
# [/Title (Nr. 2) /Page 5 /OUT pdfmark
# [/Title (Nr. 3) /Page 9 /OUT pdfmark
# usw.
p = subprocess.Popen(''ls *pdf'', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
pdfdateien = []
kombinationen = []
for line in p.stdout.readlines():
# p enthaelt alle pdf-Dateinamen
pdfdateien.append(line)
for datei in pdfdateien:
cmd = "pdfinfo %s" %datei
q=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
kombination = [datei]
for line in p.stdout.readlines():
# p enthaelt alle pdf-Dateinamen
pdfdateien.append(line)
for datei in pdfdateien:
cmd = "pdfinfo %s" %datei
q=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
kombination = [datei]
for subline in q.stdout.readlines():
# q enthaelt die Zeilen von pdfinfo
if "Pages" in subline:
kombination.append(subline)
kombinationen.append(kombination)
# Jetzt kombinationen in benoetigtes Format bringen:
kombinationen_bereinigt = []
out_string1 = "[/Title ("
out_string2 = ") /Page "
out_string3 = " /OUT pdfmark/n"
seitenzahl = 1
for kombination in kombinationen:
dateiname = kombination[0][0:len(kombination[0])-5]
#
# Hier noch dateiname evtl. verwursten
# z. B.
# lesezeichen = dateiname[0:1]+" "+dateiname[6:8]+"/"+dateiname[1:5]
lesezeichen = dateiname
anz_seiten = kombination[1][16:len(kombination[1])-1]
seitenzahl_str = str(seitenzahl)
kombination_bereinigt = out_string1+lesezeichen+out_string2+seitenzahl_str+out_string3
kombinationen_bereinigt.append(kombination_bereinigt)
seitenzahl += int(anz_seiten)
# Ausgabe ins file
outfile = open("pdfmarks", "w")
for i in kombinationen_bereinigt:
outfile.write(i)
outfile.close()
# Merge-Befehl absetzen
print "/nFor merging all pdfs execute this (or similar) command (in bash shell):"
print "gs -dBATCH -dNOPAUSE -sPAPERSIZE=A4 -sDEVICE=pdfwrite -sOutputFile=/"all.pdf/" $(ls *pdf ) pdfmarks/n"
También puede combinar varios archivos PDF con Ghostscript. La gran ventaja de esta ruta es que una solución es fácilmente programable y no requiere un esfuerzo de programación real:
gswin32c.exe ^
-dBATCH -dNOPAUSE ^
-sDEVICE=pdfwrite ^
-sOutputFile=merged.pdf ^
[...more Ghostscript options as needed...] ^
input1.pdf input2.pdf input3.pdf [....]
Con Ghostscript podrá pasar declaraciones de pdfmark que pueden agregar una tabla de contenido y marcadores para cada archivo fuente adicional que vaya al PDF resultante. Por ejemplo:
gswin32c.exe ^
-dBATCH -dNOPAUSE ^
-sDEVICE=pdfwrite ^
-sOutputFile=merged.pdf ^
[...more Ghostscript options as needed...] ^
file-with-pdfmarks-to-generate-a-ToC.ps ^
-f input1.pdf input2.pdf input3.pdf [....]
o
gswin32c.exe ^
-dBATCH -dNOPAUSE ^
-sDEVICE=pdfwrite ^
-sOutputFile=merged.pdf ^
[...more Ghostscript options as needed...] ^
file-with-pdfmarks-to-generate-a-ToC.ps ^
-f input1.pdf ^
input2.pdf ^
input3.pdf [....]
Para una introducción al tema de pdfmark, vea también el PDFmark Primer de Thomas Merz.
Editar:
Quería darte un ejemplo para file-with-pdfmarks-to-generate-a-ToC.ps
, pero de alguna manera lo olvidé. Aquí está:
[/Page 1 /View [/XYZ null null null] /Title (File 1) /OUT pdfmark
[/Page 2 /View [/XYZ null null null] /Title (File 2) /OUT pdfmark
[/Page 3 /View [/XYZ null null null] /Title (File 3) /OUT pdfmark
[/Page 4 /View [/XYZ null null null] /Title (File 4) /OUT pdfmark
Esto crearía un ToC para los primeros 4 archivos == primeras 4 páginas (ya que garantiza que sus archivos de ingredientes son de 1 página cada uno para su PDF de salida combinada).
- La parte
[/XYZ null null null]
se asegura de que la vista y el nivel de zoom de su página no cambien con respecto a la actual cuando sigue el enlace. (Podría decir[/XYZ 222 111 2]
para hacer esto, si desea un ejemplo arbitrario). - La cosa
/Title (some string you want)
determina qué texto está en el ToC.
Y, incluso podría agregar estos parámetros a la línea de comandos de Ghostscript directamente:
gswin32c.exe ^
-o merged.pdf ^
[...more Ghostscript options as needed...] ^
-c "[/Page 1 /View [/XYZ null null null] /Title (File 1) /OUT pdfmark" ^
-c "[/Page 2 /View [/XYZ null null null] /Title (File 2) /OUT pdfmark" ^
-c "[/Page 3 /View [/XYZ null null null] /Title (File 3) /OUT pdfmark" ^
-c "[/Page 4 /View [/XYZ null null null] /Title (File 4) /OUT pdfmark" ^
-f input1.pdf ^
input2.pdf ^
input3.pdf ^
input4.pdf [....]
''otro Editar:
Ah, y dicho sea de paso: Ghostscript conserva los marcadores cuando los usa para fusionar dos archivos PDF en uno: pdftk.exe no lo hace. Usemos el generado por el comando de mi primera edición (concatenando efectivamente 2 copias del mismo archivo):
gswin32c ^
-sDEVICE=pdfwrite ^
-o doublemerged.pdf ^
merged.pdf ^
merged.pdf
El archivo doublemerged.pdf
ahora tendrá 2 * 4 = 8 marcadores.
- Lo que se espera: marcadores 1, 2, 3 y 4 vinculan a las páginas 1, 2, 3 y 4.
- El problema es que los marcadores 5, 6, 7 y 8 también se vinculan en las páginas 1, 2, 3 y 4.
La razón es que los marcadores preexistentes abordaron sus objetivos de enlace por números de página absolutos. Para evitar eso (y el trabajo de marcadores en archivos fusionados), uno debería generar marcadores que señalan para vincular destinos por destinos con nombre (y asegúrese de que sean uniq entre los documentos que se fusionan).
(Este enfoque también funciona en Linux, solo use gs en lugar de gswin32c).
Apéndice
La línea de comando anterior usa [...more Ghostscript options as needed...]
como marcador de posición para más opciones.
Si no usa otras opciones, Ghostscript aplicará sus valores predeterminados incorporados para varios parámetros. Sin embargo, esto puede darle resultados que pueden no ser de su agrado. Dado que Ghostscript genera un PDF completamente nuevo basado en la entrada, esto significa que algunos de los objetos originales pueden cambiarse. Esto es cierto para los espacios de color y para los niveles de compresión de imágenes.
La forma de aplicar los parámetros que dejan las imágenes incrustadas originalmente sin cambios se puede ver en SuperUser: "Use Ghostscript, pero dígale que no vuelva a procesar las imágenes" .
Vea esta respuesta en https://.com/a/17781138/547578 . Usé algo llamado Sejda. Funciona. Combina los marcadores a la perfección. Gracias @blablatros.
Sejda PDF (que se sugirió en una de las respuestas ) también está disponible como un servicio en línea: https://www.sejda.com/merge-pdf .
Esto puede ser útil si no desea instalar ningún software adicional y prefiere trabajar en línea desde un navegador.
Pasos para fusionar:
- Arrastre y suelte todos los archivos PDF en la página web
Por defecto, todos los marcadores existentes se conservan y también funcionarán en el documento combinado .
Opcionalmente, la herramienta de combinación puede generar una tabla de contenido basada en los documentos PDF que se combinan
El servicio en línea para combinar archivos PDF es de uso gratuito para un máximo de 30 archivos por hora y archivos de hasta 50 Mb / 200 páginas.
Descargo de responsabilidad: soy un desarrollador de código abierto que trabaja en Sejda.