¿Puedo editar / crear una tabla de contenido de PDF con software gratuito?

0

Tengo un PDF con varias partes. Me gustaría crear una tabla de contenido para navegar por el PDF con facilidad. Me gustaría hacer en una Mac esto con freeware. (Un programa de línea de comandos sería genial).

¿Es eso posible? Se han hecho preguntas similares antes , pero por lo que puedo decir, la mejor respuesta dada ha sido PDFOutliner , que no es freeware.

Alex Roberts
fuente

Respuestas:

3

Me encontrado PDFtk Server y coherente PDF Herramientas de línea de comandos tienen una amplia gama de utilidades de línea de comandos PDF.

Utilicé ambas herramientas de forma intermitente, pero nunca tuve que hacer ningún trabajo de TOC. Parece que la sección Marcadores en la Página de ejemplos de uso de Coherent puede ser un enfoque para experimentar con:

6. Marcadores

cpdf -list-bookmarks in.pdf

Lista los marcadores en in.pdf. Esto produciría:

0 "Part 1" 1 open
1 "Part 1A" 2
2 "Part 1B" 3
0 "Part 2" 4
1 "Part 2a" 5

cpdf -add-bookmarks bookmarks.txt in.pdf -o out.pdf

Agregue marcadores en la misma forma desde un archivo preparado bookmarks.txt a in.pdf, escribiendo a out.pdf.

IconDaemon
fuente
1
Eso es justo lo que estaba buscando. Dado que cpdf -add-bookmarkssobrescribe la antigua tabla de contenido del PDF, parece editar los marcadores usando cpdf, el camino a seguir es: (1) cpdf -list-bookmarks in.pdf > out.txt; (2) editar out.txt; (3) cpdf -add-bookmarks....
Alex Roberts
0

Aquí hay un script de Python que se ejecutará en MacOS para producir un TOC rudimentario. Deberá ingresar sus propios valores para el archivo de entrada y el nombre de archivo de salida, y el número de página y la etiqueta para cada entrada.

#!/usr/bin/python
# -*- coding: utf-8 -*-

# CREATE PDF OUTLINES v.1.0 : Add a simple list of Bookmarks to a PDF.

from Foundation import  NSURL, NSString
import Quartz as Quartz
import sys

# You will need to change these filepaths to a local test pdf and an output file.
infile = "/path/to/file.pdf"
outfile = '/path/to/output.pdf'

def getOutline(page, label):
    myPage = myPDF.pageAtIndex_(page)
    pageSize = myPage.boundsForBox_(Quartz.kCGPDFMediaBox)
    x = 0
    y = Quartz.CGRectGetMaxY(pageSize)
    pagePoint = Quartz.CGPointMake(x,y)
    myDestination = Quartz.PDFDestination.alloc().initWithPage_atPoint_(myPage, pagePoint)
    myLabel = NSString.stringWithString_(label)
    myOutline = Quartz.PDFOutline.alloc().init()
    myOutline.setLabel_(myLabel)
    myOutline.setDestination_(myDestination)
    return myOutline

pdfURL = NSURL.fileURLWithPath_(infile)
myPDF = Quartz.PDFDocument.alloc().initWithURL_(pdfURL)
if myPDF:
    # Create Outlines. Add the Page Index (from 0) and label in pairs here:
    myTableOfContents = [
        (0, 'Page 1'), 
        (1, 'Page 2'),
        (2, 'Page 3')
        ]
    allMyOutlines = []
    for index, outline in myTableOfContents:
        allMyOutlines.append(getOutline(index, outline))

    rootOutline = Quartz.PDFOutline.alloc().init()
    for index, value in enumerate(allMyOutlines):
        rootOutline.insertChild_atIndex_(value, index)
    myPDF.setOutlineRoot_(rootOutline)
    myPDF.writeToFile_(outfile)
benwiggy
fuente