Convert PDF Version

  • Hallo zusammen,

    hat sich von euch schon mal jemand mit dem Modul PyPDF2 beschäftigt?

    https://pypi.python.org/pypi/PyPDF2/1.26.0

    Ich muss die PDF Version von 1.6 (Acrobat 7.x) zu 1.4 (Acrobat 5.x) konvertieren.


    Ich denke, so einfach geht es nicht, da die Information nur in den Metadaten steht und es nicht wirklich konvertiert wurde. Kann mir bitte jemand helfen und ggf. mal über die Dokumentation des Moduls fliegen. Was habe ich evtl. übersehen?

    Es kann auch gerne ein ganz anderes Modul sein.

    Ach ja, nicht über den merkwürdigen import wundern. Ich habe hier keine Admin Rechte und kann Module nur so importieren. Der Admin gibt den PIP Installer nicht frei.

    Lieben Dank

    Gruß
    Dirk

    Einmal editiert, zuletzt von Köcky (13. März 2017 um 16:21)

  • Hallo,

    so einfach ist das nicht - nur durch ändern der Metadaten änderst du ja nicht die Version des PDFs...

    Ich würde dafür Ghostscript nehmen, dass kann auch zwischen Versionen der PDF-Spez konvertieren, siehe z.B.: https://superuser.com/questions/1842…n-older-version

    Zitat

    Der Admin gibt den PIP Installer nicht frei.


    Hast du Python 3.4 oder neuer? Das hat pip an Bord und für die lokale Installation (=nur für dich) braucht man auch keine Root-Rechte.


    Gruß, noisefloor

  • Vielen Dank für die gute Idee.

    Ghostscript funktioniert bei mir leider nicht:
    "Dieses Programm wurde druch eine Gruppenrichtlinie blockiert. Weitere Informationen erhalten Sie vom Systemadministrator." :(

    Ja, ab Python 3.4 ist PIP an Bord. Ich arbeite aber noch mit 2.7, da die Software ArcGIS (Modul arcpy) Python 3.4 nicht versteht.


    Natürlich kann ich auch mit Acrobat Pro DC das PDF in der Version 1.4 (Acrobat 5.x) abspeichern. Hier fehlt mir aber leider eine Stapelverarbeitung (Batch) und es dauert sehr lange.

    Hat jemand eine Lösung mehrere PDF zu verabeiten?
    Automatisch zusammengefügt:
    Sooo,

    mein IT Mensch hat mir doch tatsächlich Ghostscript installiert. Wie erstelle ich denn dort eine Batch Verarbeitung?

    Einmal editiert, zuletzt von Köcky (14. März 2017 um 09:41)

  • Es muß ALLES in eine Zeile - inklusive dem "gs".

    Zur Erklärung: gs ist ein Postscript- (und PDF-)interpreter. Wenn Du den Befehl gs eingibst, landest Du in dessen interaktivem Modus. Da müsstest Du dann Postscript eingeben, damit gs etwas damit anfangen kann. Die ganzen Optionen wie "-h" oder "-sDEVICE=pdfwrite" sind Kommandozeilenoptionen, die das Verhalten von gs beim Aufruf ändern. Mit "-h" wird bspw. die Hilfe ausgegeben, anstatt im interaktiven Modus zu landen. Du musst also auf der Kommandozeile

    Code
    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -o output.pdf input.pdf

    eingeben. Dabei musst Du natürlich statt "input.pdf" den Namen der PDF-Datei angeben, die Du konvertieren willst.

  • Das habe ich auch getestet. Funktioniert ebenfalls nicht.

    Schon klar, dass statt Input.pdf dort der Name der Datei stehen muss oder man nennt die Datei Input.pdf, aber wo muss sie liegen (Pfad)?

    Wie erstelle ich eine Stapelverarbeitung (Batch) für alle Dateien in einem Ordner? Das konvertieren für eine Datei geht auch direkt in Acrobat.

    Vielen lieben Dank.
    Automatisch zusammengefügt:
    Muss das PDF in dem Installationsordner "C:\Program Files\gs\gs9.18\bin" liegen?

    Einmal editiert, zuletzt von Köcky (14. März 2017 um 13:33)

  • Hat das eigentlich einen bestimmten Grund, daß Du mit einem Windows-Problem hier im Raspberry Pi-Forum nachfragst?

    Die Screenshots, die Du oben gepostet hast, sind der von mir erwähnte interaktive Modus von gs - ich nehme an, unter Windows wird der gestartet, wenn Du das Programm doppelklickst. Du musst aber beim Programmaufruf die entsprechenden Optionen mitgeben. Wie das unter Windows geht, weiß ich nicht. Früher bekam man ein Prompt, wenn man "cmd.exe" (oder war's "command.com"? Irgendwas in der Richtung auf jeden Fall) gestartet hat. Da müsstest Du dann vermutlich sowas wie

    Code
    \pfad\zu\gs.exe -sDEVICE...

    eingeben. Ich hab hier kein Windows, mit dem ich's ausprobieren könnte.

  • Hallo Manul,

    ich komme da kein Stück weiter. Habe es in der cmd (Eingabeaufforderung) eingegeben. Ebenfalls ohne Funktion.

    Die Frage hat sich ergeben, da noisefloor mir zu Ghostscript geraten hat. Meine ursprüngliche Frage bezog sich auf Python.

  • Hallo,

    Zitat

    "Dieses Programm wurde druch eine Gruppenrichtlinie blockiert. Weitere Informationen erhalten Sie vom Systemadministrator."


    Vielleicht solltest du einfach mal die Plattform / den Rechner wechseln. Scheinbar ist deine Umgebung halt nicht dafür geeignet, was du vor hast.

    Zur Python-Frage: mit dem Modul, was du genannt hast, geht das, was fu vor hast, schlicht und ergreifend nicht.

    Wenn du Win benutzt: es gibt eine GUI für GS namens GS View. Da kann man sich alles Window-like zusammenklicken :)

    Gruß, noisefloor

  • Guten Morgen.

    Mit dem Modul

    https://pypi.python.org/pypi/ghostscript

    funktioniert der PS Code.


    Das output.pdf wird berechnet, allerdings lässt es sich nicht mehr öffnen.

    Das ist die Meldung von Acrobat:
    "Beim Öffnen dieses Dokuments ist ein Fehler aufgetreten. Diese Datei ist beschädigt und kann nicht repariert werden."

    Habt ihr noch eine Idee?

  • Ich habe mal in Test_output.pdf reingeschaut, die Datei sieht für mich wie eine gültige aber unvollständige PDF-Datei aus. Das Problem scheinen mit dem ghostscript-Modul auch andere zu haben.

    Durchsuch doch mal Deine ghostscript-Installation, ob Du das executable findest. Dann könntest Du es alternativ mit subprocess versuchen:

    Code
    import subprocess
    
    
    subprocess.call(["\pfad\zu\gs.exe", "-sDEVICE=pdfwrite", "-dCompatibilityLevel=1.4", "-o", "output.pdf", "input.pdf"])
  • :bravo2: :bravo2: :bravo2:
     
    Hallo Manul,

    Es funktioniert!

    Für alle hier der gesamte Code:


    :danke_ATDE:

  • Hallo,

    das das Grundproblem ja gelöst ist können wir ja zum Finetuning übergeben :)

    Schau' dir mal das `os.path` Modul an - mit `os.path.join` setzt man Verzeichnisnamen zusammen (die Verkettung von Strings in Python mit + ist so wie so unschön), mit `os.path.splitext` trennst du die Dateiendung ab (statt mit Index-Zugriff).

    Um über ein Verzeichnis zu iterieren, kannst du das `glob` Modul nutzen.

    `in_files` und `out_files` als Variablenname ist irreführend, weil es ja immer nur ein File (Einzahl) ist. Bei `_files` würde man eher eine List o.ä. erwarten.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!