PDF ´s automatisch umbennen

  • Hallo ich bin gänzlich unerfahren was programmieren etc angeht :), auf der Suche nach einer Lösung für mein Problem bin ich auf diese Software gestoßen und wollte nun fragen ob man mir helfen kann bzw ob das so amchbar ist.

    Folgendes Problem:
    Ich erstelle an einer Maschine automatisch eine PDF Datei welche in einen Ordner automatisch gespeichert wird, nun heißen aber alles PDF´s gleich :( . Was natürlich absolut unsinnig ist.
    Ich bräuchte das ganze so das die PDF anhand des Inhalts in der PDF automatisch Umbenannt bzw gespeichert wird. Und zwar steht in der PDF --> Artikel: 106546blabla
    So soll dann die PDF heißen und falls mehrere des selben Namens in dem Ordner bereits leigen soll eine laufende Nummer noch hinten dran stehen.

    So sieht die PDF aus:

    • Offizieller Beitrag

    Wie erstellst du die PDF?
    Falls du den PDFCreator verwendest, kannst du dort etliche Parameter für die Erstellung festlegen, auch Namensabhängigkeiten.


    Edit:
    Mir fällt gerade ein, dass wir vor Jaaaahren dasselbe Thema hatten: https://autoit.de/index.php/Thre…8171#post258171

    Noch was aus dem EN-Forum mit der zlib.dll: https://www.autoitscript.com/forum/topic/160718-code-to-extract-plain-text-from-a-pdf-file/?do=findComment&comment=1166528

  • Hallo @Sascha123456,
    Kannst du die entsprechenden Informationen "Artikel: 106546blabla" nicht vor der PDF-Erstellung ermitteln und dann PDFCreator einfach die Datei mit richtigem Namen erstellen lassen? Schreib doch mal genau, was aktuell in welcher Reihenfolge passiert - mir ist das noch nicht ganz klar.

    Grüße autoiter

  • Sowas hatte ich auch schon mal, im Zusammenhang mit einem Warenwirtschaftssystem. Ich habe das damals mit GhostScript gelöst:

    [autoit]


    $sContent = _GhostScript_PDFReadToString("PDFCreator.pdf")
    MsgBox(0, "", $sContent)

    [/autoit][autoit][/autoit][autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GhostScript_PDFReadToString
    ; Description ...:
    ; Syntax ........: _GhostScript_PDFReadToString($sPDF[, $sGSCPath = -1])
    ; Parameters ....: $sPDF - Path to pdf file.
    ; $sGSCPath - [optional] Path to the gswin32c executable file.
    ; If omitted, the function tries to auto-discover the path.
    ; Return values .: On success: string representation of pdf file; On error: false
    ; Author ........: chesstiger (autoit.de)
    ; Modified ......:
    ; Remarks .......: This function requires the gswin32c.exe file, which is NOT distributed with this UDF.
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; ===============================================================================================================================
    Func _GhostScript_PDFReadToString($sPDF, $sGSCPath = -1)
    If $sGSCPath = -1 Then ;try to auto-find path
    $sBinName = "gswin32c.exe"
    If FileExists($sBinName) Then
    $sGSCPath = $sBinName
    Else
    $sGSCPath = @ProgramFilesDir & "\gs\"
    $hSearch = FileFindFirstFile($sGSCPath & "gs*")
    If $hSearch = -1 Then Return SetError(1, 0, False)
    $sFolder = FileFindNextFile($hSearch)
    $sGSCPath &= $sFolder & "\bin\" & $sBinName
    If Not FileExists($sGSCPath) Then Return SetError(1, 0, False)
    EndIf
    EndIf
    $sCommand = StringFormat('"%s" -sDEVICE=txtwrite -q -o - "%s"', $sGSCPath, $sPDF)
    $iPID = Run($sCommand, @WorkingDir, @SW_HIDE, 0x8)
    ConsoleWrite($sCommand & @LF)
    $sData = ""
    Do
    $sData &= StdoutRead($iPID)
    Until @error
    Return BinaryToString(StringToBinary($sData), 4) ;for utf8 encoding
    EndFunc

    [/autoit]


    Dazu brauchst du nur die 32-Bit-Version von GhostScript (https://ghostscript.com/download/gsdnld.html). Mit deiner Beispiel-Datei funktioniert das auch recht gut, den Rest kann man mit ein paar String-Befehlen oder RegExp deichseln.

    Edit:

    [autoit]


    $sContent = _GhostScript_PDFReadToString("PDFCreator.pdf")
    $aMatches = StringRegExp($sContent, "ARTIKEL\h+:\h+([0-9.]+)_", 3)
    If Not @error Then MsgBox(0, "", "Artikel: " & $aMatches[0])

    [/autoit]


    So kommt man recht gut an die Artikel-Nummer.

  • Meine Frage nach dem Ablauf, ging in eine ähnliche Richtung. Ich wollte eben wissen, ob man wirklich mit der erstellten PDF-Datei arbeiten muss.
    Wenn es tatsächlich so ist, finde ich pdftotext total super. Ich habe hier eine Textsuche gepostet, indem ich xpdf benutze. Damit geht es genauso einfach, wie mit der Ghostscript-Variante von @chesstiger.
    Die Infos findest du hier: https://www.autoitscript.com/forum/topic/160718-code-to-extract-plain-text-from-a-pdf-file/?do=findComment&comment=1166469

    Grüße autoiter

  • Erstmal guten morgen :)

    So ich werde sofort eure Ideen ausprobieren!

    Zum Ablauf:
    Messmaschine misst das Teil
    Bei Programmende gebe ich ein Signal an den PDFCreator
    Dieser erstellt mir nun automatisch das Messprotokoll als PDF (was auch PDF sein muss wegen Schreibschutz etc)
    Außerdem legt er die PDF in einen vorgesehenen Ordner
    Nun heißt die PDF "PDFCreator.pdf"
    Der PDF creator hat die funktion "Skript ausführen nach dem speichern" ,dies soll er tun und damit dann die PDF anhand der Artikelnummer umbenennen
    Diese Artikelnummer muss eindeutig sein, wenn sie doppelt fällt muss eine laufende Nummer mit angefügt werden

  • Hallo @Sascha123456

    Bei Programmende gebe ich ein Signal an den PDFCreator
    Dieser erstellt mir nun automatisch das Messprotokoll als PDF (was auch PDF sein muss wegen Schreibschutz etc)

    Aus was erstellt der PDFCreator denn die Messergebnisse PDF? Erstellt deine Messmaschine eine Textdatei?
    Kann man denn da nicht einfach vor der Erstellung des PDF die Artikelnummer auslesen?
    Du kannst dann auch einfach warten bis PDFCreator fertig ist und dann die PDF-Datei umbenennen..

    Grüße autoiter

  • Die Maschine kann nur eine pdf erstellen und die erstellt sie anhand eines vorgegebenen Kopfes. Sie trägt die Daten selbst in den Kopf ein kann aber diese nicht ausgeben an eine andere Software. Da hab ich schon mit dem Hersteller gesprochen, dies ist mit der Software einfach nicht möglich.

    Das Umbenennen muss anschließend vollautomatisch gehen das ist wichtig, ist das so mit der genannten Lösung oben nicht möglich?

    Es gäbe noch die Möglichkeit statt einer PDF eine txt zu erstellen mit dem Creator, aber das Problem ist das es anschließend wieder in eine PDF gewandelt werden muss und dann kommen noch weitere Probleme hinzu wie zb die Seitenausrichtung, da mir die Maschine beim erstellen einer txt etliche tabstops mit rein haut.

    Ich weiß das ganze ist nicht ganz einfach^^ bin selbst am verrückt werden.


    Ich ahbe jetzt gerade autoit und ghostscript runter geladen..aber finde das Programm nur unter C abgelegt^^.
    Kann ich das nicht öffnen? Desktop Icon wurde nicht erstellt.

  • Meinst du jetzt GhostScript oder AutoIt?

    AutoIt direkt starten bringt dir nichts, du musst die IDE (SciTE) starten. Und GhostScript wird komplett automatisiert von der Funktion oben aufgerufen. Wenn die automatische Suche fehlschlägt, musst du allerhöchstens den Dateipfad zur GhostScript-Executable angeben.

  • Hey @Sascha123456,
    ich habe dir mal die Variante mit pdftotext erstellt.

    Spoiler anzeigen

    Im Anhang noch das Verzeichnis mit der exe, wie ich es getestet habe.
    Wenn du es mehrfach ausprobieren möchtest, ersetze einfach FileMove durch FileCopy.

    EDIT: Mir ist gerade aufgefallen, dass man bei den Fehlermeldungen eigentlich auch das Programm verlassen sollte ;)

  • @chesstiger Ok nochmal langsam, ich muss was und warum aus Autoit starten? Und Ghostscript wird automatisch abgerufen wenn ich dein skript als .cmd abspeichere oder wie ?

    @autoiter danke ich werde das sofort mal ausprobieren , hoffe ich ahbe das richtig verstanden.

    Ich finde beide Lösungen interessant aber da ich abslout keine ahnung habe vom skript schreiben etc kann ich noch nicht wissen was für meinben zweck genau das macht was ich brauch^^

  • Muss es wirklich ein Skript sein, dass du mit PDFCreator startest? Sonst kannst du die chsstigers oder mein Skript doch einfach zu einer exe kompilieren und starten.

    Grüße autoiter

  • Also...

    Erstens: Beide Lösungen sind - bis auf ein paar Details - äquivalent. Ob nun das genannte pdftotext oder GhostScript, ist eigentlich egal. Ich habe lediglich GhostScript gewählt, weil ich unter Linux regelmäßig damit rumhantiere.
    autoiters Beispiel ist darüber hinaus weiter entwickelt. Ich hab's beim reinen Anzeigen der Artikelnummer belassen, weil ich das Extrahieren der Text-Information für den schwierigsten bzw. problematischen Teil hielt.

    Für beide Skripte ist das grundsätzliche Vorgehen aber gleich. Neues AutoIt-Skript (*.au3-Datei) erstellen (im Explorer, mit dem Neu-Menü), möglichst im selben Ordner wie deine Test-PDF. Dann Rechtsklick -> Edit Script, dann eins von beiden oben einfügen. Dann [F5] zum Ausführen. Dann solltest du zumindest erste Ergebnisse sehen.

  • Ok vielen danke euch beiden :)

    Kurze Rückmeldung:
    @autoiter es funzt wow vielen vielen dank. Habe es beim mir am Schriebtisch getestet.
    Ich werd das ganze jetzt noch auf der Messmaschine einbinden und dort versuchen (da ist noch win xp drauf ^^).

    Werde noch bericht erstatten

  • Ich habe gerade keine Windows-Umgebung zum Testen hier, aber normalerweise sollte eine Modifizierung des Pattern in Zeile 14 (autoiters Skript) genügen:
    Von ARTIKEL\h+:\h+([0-9.]+)_ zu (?i)ARTIKEL\h+:\h+([0-9.]+)_.

    Das Problem liegt - auf den ersten Blick zumindest - bei der unterschiedlichen Schreibweise von "Artikel" ("ARTIKEL" und "Artikel"). Das Flag (?i) bewirkt, dass nicht auf Groß-/Kleinschreibung geachtet wird.

  • Hey @Sascha123456

    Der Absturz ist auch passiert, weil du das Script nicht angepasst hast. Das Skript sollte besser nicht weiterlaufen, wenn ein Schritt nicht klappt. Das führt zu Folgefehlern ;)

    Spoiler anzeigen

    Jetzt sollte das Skript sich bei einem Problem melden und Beenden.
    Hier hatte sich eigentlich nur die Schreibweise von ARTIKEL geändert. Mit einer case insensitive Suche ist dieses Problem behoben. Falls es aber noch andere Unterschiede bei weiteren Maschinen gibt, muss man die Fälle im Skript abprüfen. Du solltest es mal an allen Maschinen testen.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (29. März 2017 um 13:40)