Kombinieren von PDFs in strukturierten Verzeichnissen zu einem einzigen PDF mit Lesezeichen

721
claws

Ich habe viele gescannte Seiten alter Berichte in der folgenden Verzeichnisstruktur gespeichert:

Report 1/ contents.pdf execsummary.pdf chapter 1/ page 1.pdf page 2.pdf page 3.pdf chapter 2/ page 4.pdf page 5.pdf page 6.pdf 

Ich möchte Report 1.pdfaus diesen mit Lesezeichen erzeugen, die der Verzeichnisstruktur entsprechen. Wie kann ich das machen?

Ich bin unter Windows 10 und habe kein Adobe Acrobat, aber Foxit Phantompdf.

0
Ich habe 20-30 solcher Berichte claws vor 7 Jahren 0
Nur ein kleiner Gedanke: Wenn es mehr als 9 Kapitel gibt, kann die Reihenfolge merkwürdig werden ("Kapitel 2" ist in den meisten Sortierimplementierungen größer als "Kapitel 12"). Vielleicht möchten Sie den Index dann manuell definieren (oder zumindest anpassen). Arjan vor 7 Jahren 0
@Arjan: Kannst du die Frage für eine Weile wieder öffnen? Ich habe eine einfachste Lösung für dieses Problem gefunden. Lass mich das beantworten. claws vor 7 Jahren 0
@claws: (1) Es ist oft nützlich, den Bildschirm zu lesen. (a) Arjan hat die Frage nicht geschlossen. Er kann (zusammen mit etwa 700 anderen Personen) für die Wiedereröffnung stimmen, aber er kann nicht alles alleine machen. Das Pingen einzelner Benutzer mit Wiederholungsanfragen ist nicht wirklich produktiv. (b) Es wäre hilfreich gewesen, wenn Sie Ihre Frage bearbeitet hätten, wie das Feld ** closed ** (und wie Fixer1234) vorschlägt, um sie zum Kandidaten für das erneute Öffnen zu machen. (2) Ihre Frage hat drei ** Leave Closed ** -Stimmen erhalten. Es kann noch * geöffnet * werden, es wurde jedoch aus der Wiederöffnungswarteschlange entfernt. Möglicherweise erhalten Sie Hilfe, wenn Sie in Meta oder im Chat fragen. Scott vor 7 Jahren 1
@Scott hat recht. Aber ich verstehe nicht, warum das geschlossen wurde ... Arjan vor 7 Jahren 0
@Arjan: Nun, in der Originalversion der Frage stand: "Ich wäre dankbar, wenn jemand freie / Open-Source-Tools vorschlagen könnte, um dies zu erreichen." Damit wäre die Produktempfehlungsanfrage ziemlich eindeutig. Scott vor 7 Jahren 0

2 Antworten auf die Frage

1
nx105

Dies ist wahrscheinlich nicht die Lösung, die Sie suchen:

Sie können z. B. LaTeX verwenden, um dies zu erreichen. Sie müssen die TeX-Datei auf andere Weise erzeugen, z. B. in Ihrer bevorzugten Programmiersprache. Dazu müssen Sie wissen, wie Sie programmieren, LaTeX verwenden und natürlich die erforderlichen Tools installieren.

Wenn Sie interessiert sind, kann ich dies näher erläutern und Beispielskripte hinzufügen.

Bearbeiten:

Ich habe ein kleines FreeBASIC-Programm erstellt (etwas schmutzig, aber erledigt die Aufgabe), um die .tex-Datei zu erzeugen. Diese kann dann zur Erstellung der endgültigen PDF-Datei verwendet werden, z. B. mit Miktex und TexnicCenter.

  • Laden Sie den FreeBASIC-Compiler von http://www.freebasic.net/ herunter und extrahieren Sie ihn (ich habe ihn verwendet FreeBASIC-1.05.0-win64.zip).
  • Speichern Sie den folgenden Code als Beispiel code.basund kompilieren Sie ihn mit fbc.exe code.bas.
  • Ziehen Sie die Ordner "Report 1", "Report 2" usw. auf die neue ausführbare Datei code.exe. Dadurch werden die Dateien "Report 1.tex", "Report 2.tex" im jeweiligen Ordner generiert.
  • Laden Sie Miktex von http://www.miktex.org/ (aktivieren Sie die sofortige Installation von Paketen während des Setups) und TexnicCenter von http://www.texniccenter.org/download/ herunter, und installieren Sie die Berichtsdateien in TexnicCenter . Ich bin nicht sicher, ob Sie Änderungen an den Standardeinstellungen vornehmen müssen, aber das Internet ist voll von Ressourcen. Beim Kompilieren LaTeX -> PDFsollten die fehlenden Pakete installiert werden.

Quellcode: Verarbeitet explizit die erwähnte Ordnerstruktur und Dateinamen und nichts weiter.

 ' Drag and drop folders onto the executable in order to generate a .tex-file  ' which can be used to merge the pdfs in each passed folder using LaTeX. '  #include "vbcompat.bi"  sub expandEnviron__isFileOrFolder ( byref strPath as string ) dim iLetter as integer if left(strPath,1)="%" then for iLetter=2 to len(strPath) if mid(strPath,iLetter,1)="%" then  strPath=environ(mid(strPath,2,iLetter-2))+right(strPath,len(strPath)-iLetter) exit for end if next iLetter end if end sub  function isFileOrFolder ( byref strPath as string, byval expPath as string ptr = 0 ) as integer ' return value: ' 0: path doesn't exist ' 1: file ' 2: folder '  dim strDir as string = curdir  dim as string strPathCopy dim as string ptr pPath if expPath then *expPath = strPath expandEnviron__isFileOrFolder(*expPath) pPath = expPath else strPathCopy = strPath expandEnviron__isFileOrFolder(strPathCopy) pPath = @strPathCopy end if  if fileExists(*pPath) then return 1 elseif ( chdir(*pPath) = 0 ) then chdir(strDir) return 2 else return 0 end if end function   color(1,15) cls  if command(1) = "" then print "Drag and drop folders onto the executable." sleep end end if  dim as string basedir dim as string strPath = "" dim as integer i = 1 ' Process all command line arguments i.e process all folders. while command(i) <> "" basedir = command(i) dim as string basedirName  ' Make sure the argument is indeed a folder. if isFileOrFolder(basedir,@strPath) = 2 then if right(strPath,1) = "\" then basedir = left(strPath,len(strPath)-1) basedirName = right(basedir,len(basedir)-instrrev(basedir,"\")) print "" print baseDirName ' ' Print some LaTeX commands. open basedir+"\"+baseDirName+".tex" for output as #1 print #1, $"\documentclass" print #1, $"\usepackage" print #1, $"\usepackage" print #1, $"\usepackage" print #1, $"\hypersetup" print #1, $"\begin" print #1, $"\pagestyle" print #1, $"\pagenumbering" print #1, "%" ' ' Process contents.pdf. dim as string tmp = basedir+"\contents.pdf" if isFileOrFolder(tmp) = 1 then print #1, $"\includepdf[pages=-]" else color(12,15):print chr(9);"missing contents.pdf":color(1,15) end if ' ' Process execsummary.pdf. tmp = basedir+$"\execsummary.pdf" if isFileOrFolder(tmp) = 1 then print #1, $"\includepdf[pages=-]" else color(12,15):print chr(9);"missing execsummary.pdf":color(1,15) end if ' ' Process all subfolders named "chapter 1", "chapter 2" etc. ' If "chapter 4" exists but "chapter 3" does not, then "chapter 4" and  ' all after that will be ignored. dim as integer chapter_link_cnt = 0 dim as integer j = 1 dim as string nextChapterDir = basedir+$"\chapter "+str(j) while isFileOrFolder(nextChapterDir) = 2 print #1, "%" dim as integer k = 1 ' ' Process all files named "page 1", "page 2" etc. dim as string nextPage = nextChapterDir + $"\page "+str(k)+".pdf" while isFileOrFolder(nextPage) = 1 if k = 1 then chapter_link_cnt += 1 print #1, $"\includepdf[link,linkname=l";str(chapter_link_cnt); _ ",pages=-]" print #1, $"\bookmark[dest=l";str(chapter_link_cnt); _ ".1]" else print #1, $"\includepdf[pages=-]" end if k += 1 nextPage = nextChapterDir + $"\page "+str(k)+".pdf" wend j += 1 nextChapterDir = basedir+$"\chapter "+str(j) wend ' print #1, $"\end" close #1 else print "" color(12,15):print "Error (not a folder): ";command(i):color(1,15) end if i += 1 wend  print "" print "" print "Done." sleep 

Falls Sie eine andere Sprache verwenden möchten (vielleicht kann dies mit einem Powershell-Skript gemacht werden), finden Sie hier eine Beispieltextdatei:

\documentclass \usepackage \usepackage \usepackage \hypersetup \begin \pagestyle \pagenumbering % \includepdf[pages=-] \includepdf[pages=-] % \includepdf[link,linkname=l1,pages=-] \bookmark[dest=l1.1] \includepdf[pages=-] % \includepdf[link,linkname=l2,pages=-] \bookmark[dest=l2.1] \includepdf[pages=-] % \includepdf[link,linkname=l3,pages=-] \bookmark[dest=l3.1] \includepdf[pages=-] \includepdf[pages=-] \includepdf[pages=-] \end 
Ja bitte. Könnten Sie bitte Ihre Antwort erweitern? claws vor 7 Jahren 0
1) Möglicherweise müssen Sie den FreeBASIC-Code genau an Ihre Einstellungen anpassen. 2) Ich war mir auch nicht sicher, wie Sie die PDF-Dateien zusammenführen wollten (Kapiteltitel hinzufügen usw.). Möglicherweise müssen Sie dies auch anpassen. nx105 vor 7 Jahren 0
0
Pat
Führt PDF sam die Lesezeichenstruktur aus? Das scheint ein ziemlich kritischer Teil der Frage zu sein Journeyman Geek vor 7 Jahren 1
sie sagen das tun, haben es aber nie selbst versucht; Ich denke, das, was sie wirklich tun, ist die Kombination jedes einzelnen PDF-Lesezeichens in das kompilierte. Probieren Sie es einfach aus. Pat vor 7 Jahren 0
Ich habe pdfsam ausprobiert, aber leider erfüllt es nicht die in dieser Frage genannten Bedürfnisse. Sie können Ihre Antwort geben. claws vor 7 Jahren 0