Puis-je modifier / créer la table des matières d'un PDF avec un logiciel gratuit?

0

J'ai un PDF avec un certain nombre de parties. Je voudrais créer une table des matières pour naviguer facilement dans le PDF. Je voudrais faire ceci sur un Mac avec un freeware. (Un programme en ligne de commande serait génial.)

Est-ce possible? Des questions similaires ont déjà été posées , mais pour autant que je sache , la meilleure réponse donnée est PDFOutliner , qui n'est pas un logiciel gratuit.

Alex Roberts
la source

Réponses:

3

J'ai trouvé PDFtk Server et les outils de ligne de commande PDF cohérents ont une large gamme d'utilitaires de ligne de commande PDF.

J'ai utilisé les deux outils de temps en temps, mais je n'ai jamais eu besoin de travailler sur la table des matières. La section Signets de la page Exemples d'utilisation de Coherent ressemble à une approche à expérimenter:

6. Signets

cpdf -list-bookmarks in.pdf

Lister les marque-pages en in.pdf. Cela produirait:

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

Ajoutez des signets sous la même forme à partir d’un fichier préparé bookmarks.txt à in.pdf, en écrivant à out.pdf.

IconDaemon
la source
1
C'est ce que je cherchais. Étant donné qu’il cpdf -add-bookmarksécrase l’ancienne table des matières du fichier PDF, il semble modifier les signets à l’aide cpdfdes moyens suivants: (1) cpdf -list-bookmarks in.pdf > out.txt; (2) modifier out.txt; (3) cpdf -add-bookmarks....
Alex Roberts
0

Voici un script python qui s'exécutera sur MacOS pour produire une table des matières rudimentaire. Vous devrez entrer vos propres valeurs pour le fichier d'entrée et le nom du fichier de sortie, ainsi que le numéro de page et le libellé de chaque entrée.

#!/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
la source