Wie mehrere djvu Dateien in das Format PDF konvertieren?

Niel$

New Member
Hallo,

ich möchte am Mac mehrere Dateien (*.djvu) in das Dateiformat *.pdf konvertieren.

Hierfür möchte ich das Programm Hazel (Noodlesoft) in Verbindung mit djvu2pdf unter Homebrew verwenden.

Im Internet habe ich folgenden Codeschnipsel gefunden:

Code:
i="$1"
o="`basename $i .djvu`"
o="$o".pdf
cmd="ddjvu -format=pdf -quality=85 -verbose $i $o"
$cmd

Die Regel unter Hazel sieht wie folgt aus:
If all of the following conditions are met:
Extension is djvu
Kind is not Folder

Do the following to the matched file or folder:
Run shell script embedded script
Display notification with pattern: Eine djvu-Datei wurde in das PDF-Format konvertiert!

Die oben genannte Hazel-Regel wird auf ein Verzeichnis angewendet in dem sich mehrere djvu Dateien befinden.
Das Shell-Script konvertiert, zu meinem bedauern, nur eine Datei.

Meine Frage:

Wie muss ich das Shell-Script verändern? Hazel soll alle djvu Dateien automatisch in das Dateiformat PDF konvertieren.

Danke für euere Hilfe.

Niel$
 
Last edited:
Ja mit find geht das. Alternativ mit Python (ich mag shell scripts nicht)
Python:
#!/usr/bin/env python3

import shlex
import subprocess
from pathlib import Path
from argparse import ArgumentParser


def djvu2pdf(file, verbose=False):
    cmd = shlex.split("ddjvu -format=pdf -quality=85")
    if verbose:
        cmd.append("-verbose")
    cmd.extend([str(file), str(file.with_suffix(".pdf"))])
    subprocess.run(cmd)


def main(root, verbose):
    for file in root.glob("*.djvu"):
        djvu2pdf(file, verbose)


if __name__ == "__main__":
    parser = ArgumentParser()
    parser.add_argument("root", type=Path, help="Basisverzeichnis um djvu-Dateien in PDF zu konvertieren")
    parser.add_argument("-v", action="store_true", help="Verbose")
    args = parser.parse_args()
    main(args.root, args.v)
 
Ich vermute jetzt schon als nächste Frage: Wie kann ich das rekursiv machen, die Struktur beibehalten, aber in einem neuen Unterverzeichnis, in dem sich keine djvu-dateien befinden.
 
Hallo DeaD_EyE, danke für dein Python-Script.

Leider kenne ich mich nicht mit python aus, so dass ich wie folgt experimentiert habe:

1. Python3 über Homebrew installiert.
2. Eine Datei djvu2pdfscript.py im Verzeichnis "/Users/Micky/python/" erstellt und deinen Code darin gespeichert.
3. Terminal-Befehl: chmod +x /Users/Micky/python/djvu2pdfscript.py
4. Hazel -> Run shell script -> embedded script

Im Feld "embedded script" habe ich folgende Zeile eingetragen:

/Users/Micky/python/djvu2pdfscript.py "$1"

Frage: Was mache ich Falsch?
 
Du führst das Script nicht innerhalb von hazel aus, sondern direkt in einer Kommandozeile deines Macs.
 
Du führst das Script nicht innerhalb von hazel aus, sondern direkt in einer Kommandozeile deines Macs.



@danton
Da bekomme ich nachstehende Meldung:

/Users/Micky/python/djvu2pdfscript.py
usage: djvu2pdfscript.py [-h] [-v] root
djvu2pdfscript.py: error: the following arguments are required: root
Micky@MacBook-Pro ~ %
 
Mein Ziel ist es, das ein bestimmter Ordner ständig überwacht wird. Gelangen neue djvu Dateien in diesen überwachten Ordner bzw. dessen Unterordner, so sollen diese automatisch in das Dateiformat pdf konvertiert werden.

Das wollte ich eigentlich mit Hazel realisieren.
Hazel kann aber nur: shellscript, Applescript, Javascript und Automator Workflow
 
Du musst als Parameter hinter dem Scriptnamen noch das Verzeichnis angeben, in dem deine djvu-Dateien liegen.
Bezüglich der wiederholten Ausführung müsste MacOS eigentlich auch einen Cron-Daemon haben, mit dem du dann auch Python-Scripte ausführen kannst.
 
Das funktioniert leider auch nicht:

Micky@MacBook-Pro / % Users/Micky/python/djvu2pdfscript.py Users/Micky/Downloads/djvu
ddjvu: [1-11711] Fehler beim Öffnen von 'Pomorze_003_12_010_0001.djbz': No such file or directory.
ddjvu: [1-11711] Fehler beim Öffnen von 'Pomorze_003_12_010_0001.djbz': No such file or directory.
ddjvu: Cannot decode page 1.
Micky@MacBook-Pro / %

Den Verzeichnispfad habe ich per Drag and Drop in dien Finder kopiert.
 
@danton
Da bekomme ich nachstehende Meldung:

/Users/Micky/python/djvu2pdfscript.py
usage: djvu2pdfscript.py [-h] [-v] root
djvu2pdfscript.py: error: the following arguments are required: root
Micky@MacBook-Pro ~ %

Funktioniert doch.
Die Hilfe ruft man wie bei jedem vernünftigen Kommandozeilentool mit -h oder --help auf.
/Users/Micky/python/djvu2pdfscript.py -h

PS C:\Users\Admin\Desktop> py -3 .\djvu2pdf.py -h
usage: djvu2pdf.py [-h] [-v] root

positional arguments:
root Basisverzeichnis um djvu-Dateien in PDF zu konvertieren

optional arguments:
-h, --help show this help message and exit
-v Verbose

Wenn ich jetzt also Dateien Konvertieren will, die auf dem Desktop (Windows) sind:
Code:
py -3 .\djvu2pdf.py C:\Users\Admin\Desktop\


Mein Ziel ist es, das ein bestimmter Ordner ständig überwacht wird. Gelangen neue djvu Dateien in diesen überwachten Ordner bzw. dessen Unterordner, so sollen diese automatisch in das Dateiformat pdf konvertiert werden.

Also so, dass quasi neben den djvu-Dateien die pdf-Dateien liegen und die Verzeichnis-Struktur beibehalten wird.
Ja, das geht ziemlich einfach sogar.

Python:
#!/usr/bin/env python3

import shlex
import subprocess
from pathlib import Path
from argparse import ArgumentParser


def djvu2pdf(source, verbose=False):
    target = source.with_suffix(".pdf")
    if target.exists():
        return
    cmd = shlex.split("ddjvu -format=pdf -quality=85")
    if verbose:
        cmd.append("-verbose")
    cmd.extend([str(source), str(target)])
    subprocess.run(cmd)


def main(root, verbose, recursive):
    if recursive:
        files = root.rglob("*.djvu")
    else:
        files = root.glob("*.djvu")
    for file in files:
        djvu2pdf(file, verbose)


if __name__ == "__main__":
    parser = ArgumentParser()
    parser.add_argument("root", type=Path, help="Basisverzeichnis um djvu-Dateien in PDF zu konvertieren")
    parser.add_argument("-v", action="store_true", help="Verbose")
    parser.add_argument("-r", action="store_true", help="Rekursive Suche")
    args = parser.parse_args()
    main(args.root, args.v, args.r)

Unter Windows rufe ich das script dann so auf:
Code:
py -3 .\djvu2pdf.py -r C:\Users\Admin\Desktop\
Das -r bedeutet rekursive. PDF-Dateien werden nur erstellt, wenn sie nicht vorhanden sind.

In deinem Fall halt:
Code:
/Users/Micky/python/djvu2pdfscript.py -r Users/Micky/Downloads/djvu

Du hattest noch von diesem Fehler berichtet
ddjvu: [1-11711] Fehler beim Öffnen von 'Pomorze_003_12_010_0001.djbz': No such file or directory.

Ich kenne mich mit dem Format nicht aus, was ich aber sehe, dass hier eine andere Dateiendung angezeigt wird.
Kann es sein, dass djvu-Dateien ihre Ressourcen möglicherweise in zusätzlichen Dateien auslagern (.djvz)?
ddjvu fordert diese Datei an. Vielleicht ist die djvu-Datei einfach kaputt.


Hier nochmal als GUI:
Python:
#!/usr/bin/env python3

import shlex
import subprocess
from pathlib import Path
from tkinter import Tk, Checkbutton, Button, BooleanVar
from tkinter.filedialog import askdirectory


class Gui(Tk):
    def __init__(self):
        super().__init__()
        self.root_directory = None
        self.recursive = BooleanVar(self, True)
        Button(self, text="Verzeichnis", command=self.get_dir).pack()
        Button(self, text="Umwandeln", command=self.convert).pack()
        Checkbutton(self, text="Rekursiv", variable=self.recursive).pack()
        Button(self, text="Verlassen", command=self.destroy).pack()

    def convert(self):
        if self.root_directory is None:
            self.get_dir()
        convert_directory(self.root_directory, False, self.recursive.get())

    def get_dir(self):
        self.root_directory = Path(
            askdirectory(title="Bitte das Verzeichnis auswählen.")
        )


def djvu2pdf(source, verbose=False):
    target = source.with_suffix(".pdf")
    if target.exists():
        return
    cmd = shlex.split("ddjvu -format=pdf -quality=85")
    if verbose:
        cmd.append("-verbose")
    cmd.extend([str(source), str(target)])
    subprocess.run(cmd)


def convert_directory(root, verbose, recursive):
    if recursive:
        files = root.rglob("*.djvu")
    else:
        files = root.glob("*.djvu")
    for file in files:
        djvu2pdf(file, verbose)


if __name__ == "__main__":
    gui = Gui()
    gui.mainloop()
 
Last edited by a moderator:
Back
Top