ingo101
Goto Top

2 String aus PDF auslesen und diesen zum Umbenamsen benutzen

Hallo zusammen,

ich habe folgendes Problem. Mir werden PDF Dateien geliefert, die einen nicht aussagefähigen Namen haben. Diese möchte ich gerne umbennen.

Der neue Name steht in den PDF Dateien an zwei Stellen, immer an denselben Positionen. Mit Hilfe des Forums hier habe ich mir schon einiges zusammengesucht (aus verschiedenen Threads):


@echo off & setlocal
set "Ordner=d:\1"  
set "Maske=*.txt"  

set ZNr=5
set Sp1=0
set L1=20
set ZNr2=3
set Sp2=0
set L2=20


For /f "Delims=" %%A in ('Dir /B /A-D ".\*.pdf"') Do Call :ProcPDF "%%A" "%%~nA.txt"  
Goto :Eof

:ProcPDF
pdftotext.exe -raw %1


pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Maske%"') do call :ProcessFile "%%i"  
popd
goto :eof


:ProcessFile
set "Zeile="  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %1^|findstr /b "%ZNr%:"') do set "Zeile=%%j"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %1^|findstr /b "%ZNr2%:"') do set "Zeile2=%%j"  
if not defined Zeile echo %~1: Nummer nicht gefunden! & goto :eof

call set "NameNeu=%%Zeile:~%Sp1%,%L1%%%%%Zeile2:~%Sp2%,%L2%%%"  
ren %1 "%NameNeu%%~x1"  
goto :eof


Als Folge, wandelt das Batch meine PDF-Dateien in *.txt und benennt dann diese Textdatei um. Das funktioniert: das Programm findet also den/die richtigen Namen.

Ich weiß aber nicht, wie ich das "Grundgerüst" anpassen muss, damit auch die *.pdf umbenannt wird... zu sagen ich hätte Grundkenntnisse wäre übertrieben, aber ich bin gut im Probieren, nur hier komme ich leider nicht weiter.

Bin über jede Hilfe dankbar.

Danke fürs Lesen.
Gruß

Ingo

Content-Key: 305449

Url: https://administrator.de/contentid/305449

Printed on: April 25, 2024 at 16:04 o'clock

Member: Biber
Biber May 26, 2016 updated at 12:00:19 (UTC)
Goto Top
Moin ingo101,

willkommen im Forum.
[OT] Die Schreibweise "Umbennen" wie in deiner Überschrift sorgt immer für alberne Moderatorenkommentare und führt außerdem zum Inkrementieren des internen running gag counters rgc.
Ändere das bitte.
[/OT]

Wenn dein Batch soweit funktioniert bis auf das Umbenamsen der PDF-Datei, dann ergänze das in :Processfile.

@echo off & setlocal
set "Ordner=d:\1"  
set "Maske=*.txt"  

set ZNr=5
set Sp1=0
set L1=20
set ZNr2=3
set Sp2=0
set L2=20

REM Anmerkung: woher weisst du hier, dass du dich im richtigen Start-Verzeichnis befindest???
For /f "Delims=" %%A in ('Dir /B /A-D ".\*.pdf"') Do Call :ProcPDF "%%A" "%%~nA.txt"  
Goto :Eof

:ProcPDF
pdftotext.exe -raw %1


pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Maske%"') do call :ProcessFile "%%i"  
popd
goto :eof


:ProcessFile
set "Zeile="  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %1^|findstr /b "%ZNr%:"') do set "Zeile=%%j"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %1^|findstr /b "%ZNr2%:"') do set "Zeile2=%%j"  
if not defined Zeile echo %~1: Nummer nicht gefunden! & goto :eof

call set "NameNeu=%%Zeile:~%Sp1%,%L1%%%%%Zeile2:~%Sp2%,%L2%%%"  
REM hier auch die Original-PDF umbenennen:
ren %~n1.pdf  "%NameNeu%.pdf"  
ren %1 "%NameNeu%%~x1"  
goto :eof

Sonstige Anmerkungen:
- Das call :ProcPDF bekommt zwei Parameter übergeben, aber verwertet nur einen?
- Ich durchschaue nicht ganz, ob sich alles in einem Ordner abspielt oder in zweien.
Wenn nur ein Ordner involviert ist, dann sollte das pushd/popd auch nur einmal und nicht in jedem call :ProcXXX-Block stattfinden.

Grüße
Biber
Member: ingo101
ingo101 May 26, 2016 at 11:53:16 (UTC)
Goto Top
Hallo Biber,

danke für Deine Antwort. Überschrift ist geändert.

Zu Deinen Anmerkung: Ich habe mir die Zeilen aus verschiedenen Beiträgen zusammengeschustert, daher ist bestimmt einiges "seltsam" oder doppelt oder umständlich. Das ganze soll nur in einem Ordner passieren.

Bei Deinem Code bekomme ich "Syntaxfehler"... die Textdateien werden erstellen und umbenannt, aber die PDF-Dateien werden nicht geändert.

Gruß
Ingo
Member: Biber
Biber May 26, 2016 updated at 12:00:49 (UTC)
Goto Top
Moin ingo101,

upps, sorry, ein Tippselfehler.
Zeile 35 sollte natürlich nicht heissen ren %~n1,pdf "%NameNeu%.pdf"... das Komma sollte schon ein Punkt werden.
Ich ändere das eben/oben im Kommentar.

Grüße
Biber
Member: ingo101
ingo101 May 26, 2016 at 13:00:06 (UTC)
Goto Top
Aloha Biber,

danke für Deine Hilfe. Es erscheint zwar immer noch die Fehlermeldung "Syntax", aber die Dateien werden trotzdem umbenannt.

Eine Zusatzfrage, die gerade aufgetaucht. Gibt es eine Möglichkeit, das, wenn eine Datei mit gleichen Namen bereits existiert, die nächste als *_1.pdf etc. oer ähnliches benannt wird?

Vielen Dank nochmal.

Gruß
Ingo
Member: Biber
Biber May 26, 2016 at 13:41:17 (UTC)
Goto Top
Moin ingo101,


Zitat von @ingo101:

Eine Zusatzfrage, die gerade aufgetaucht. Gibt es eine Möglichkeit, das, wenn eine Datei mit gleichen Namen bereits existiert, die nächste als *_1.pdf etc. oer ähnliches benannt wird?
Ja, aber einen Schritt nach dem anderen.

Es erscheint zwar immer noch die Fehlermeldung "Syntax", aber die Dateien werden trotzdem umbenannt.
Das wollen wir doch nicht so lassen, oder?

Ändere bitte mal zum Testen das "echo off" oben in ein "echo on" und bau ein paar "pause" und Info-Zeilen (echo Bin jetzt in :ProcPDF, Parameter sind [%*] ) in den Code.
Ich seh es doch mit bloßem Auge nicht von hier aus, wo der Syntaxfehler sich versteckt.

Zum zweiten nochmal die Frage: spielt sich denn nun alles in deinem Ordner "D:\1\" ab oder liegen die Roh-PDFs woanders?

Danach können wir diese Mehrere-Versionen-sammeln-Klamotte angehen.

Wobei du da erstmal zu Ende überlegen solltest, wie denn der Plan aussieht.
Bevor du da die %NameNeu%.PDFs/Txts mit einem Suffix _01, _02 hochzählst, solltest du ein Umbenennen in einem Namen mit einem Prafix/Suffix bestehend aus dem Datum erwägen - was sinnvoller wäre zum Wiederfinden.
Also %NameNeu%_2015-05.25.* oder 2015-05-15_%NameNeu%.*
Aber wie geschrieben, erstmal eins zu Ende (s.o)

Grüße
Biber
Member: ingo101
ingo101 May 27, 2016 at 07:55:25 (UTC)
Goto Top
Guten Morgen Bibi,

also, PDF-Dateien und die *.bat liegen im selben Ordner. Nach Deinem Hinweise habe ich "pushd/popd " entfernt. Die Ordnerangabe oben stammt aus dem Vorlagen-Thread, von welchem ich mit den Bereich "geliegen" habe.

Der Syntaxfehler taucht bei der Umbennung der PDF-Datei auf. Bis dorthin und danach (TXT-Datei) ist alles in Ordnung.

Die Anzeige der Parameter mit deinem echo-Befehl zeigt tatsächlich den späteren Dateinamen. Umlaute oder Sonderzeichen habe ich mit chcp 1252 aktiviert, was auch funktioniert.

Hier ist die Kopie aus der Eingabeaufforderung:

Bin jetzt in :ProcessFile, Parameter sind ["01968 SenftenbergMax Muster1.txt"]  
Bin jetzt in PDF-umbennen, Parameter sind ["01968 SenftenbergMax Muster1.txt"]  
Syntaxfehler.
Bin jetzt in Textdatei-umbennen, Parameter sind ["01968 SenftenbergMax Muster1.tx  
t"]  
Bin jetzt in :ProcessFile, Parameter sind ["03172 KolkwitzMax Muster2.txt"]  
Bin jetzt in PDF-umbennen, Parameter sind ["03172 KolkwitzMax Muster2.txt"]  
Syntaxfehler.
Bin jetzt in Textdatei-umbennen, Parameter sind ["03172 KolkwitzMax Muster2.tx  
t"]  
Bin jetzt in :ProcessFile, Parameter sind ["48153 MünsterMax Muster3.txt"]  
Bin jetzt in PDF-umbennen, Parameter sind ["48153 MünsterMax Muster3.txt"]  
Syntaxfehler.
Bin jetzt in Textdatei-umbennen, Parameter sind ["48153 MünsterMax Muster3.txt"]  

bei dem aktuellen Code:
@echo off & setlocal
set "Ordner=c:\1"  
set "Maske=*.txt"  
chcp 1252

set ZNr=4
set Sp1=4
set L1=20
set ZNr2=2
set Sp2=0
set L2=20

REM Anmerkung: woher weisst du hier, dass du dich im richtigen Start-Verzeichnis befindest???
For /f "Delims=" %%A in ('Dir /B /A-D ".\*.pdf"') Do Call :ProcPDF "%%A" "%%~nA.txt"  
Goto :Eof

:ProcPDF
REM echo Bin jetzt in :ProcPDF, Parameter sind [%*] 
pdftotext.exe -raw %1
for /f "delims=" %%i in ('dir /b /a-d "%Maske%"') do call :ProcessFile "%%i"  
goto :eof


:ProcessFile
echo Bin jetzt in :ProcessFile, Parameter sind [%*] 
set "Zeile="  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %1^|findstr /b "%ZNr%:"') do set "Zeile=%%j"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %1^|findstr /b "%ZNr2%:"') do set "Zeile2=%%j"  
if not defined Zeile echo %~1: Nummer nicht gefunden! & goto :eof

call set "NameNeu=%%Zeile:~%Sp1%,%L1%%%%%Zeile2:~%Sp2%,%L2%%%"  
REM hier auch die Original-PDF umbenennen:

echo Bin jetzt in PDF-umbennen, Parameter sind [%*] 
ren %~n1.pdf  "%NameNeu%.pdf"  

echo Bin jetzt in Textdatei-umbennen, Parameter sind [%*] 
ren %1 "%NameNeu%%~x1"  
goto :eof

Die Sortierung später sollte später wirklich _1, _2 usw. sein, damit ich hinterher für jeden PLZ/Name die PDFs hintereinander habe.

Gruß
Ingo
Member: Biber
Biber May 27, 2016 at 11:45:04 (UTC)
Goto Top
Moin ingo101,

okay, der Fehler lässt sich lokalisieren.

Da die Original-Dateinamen auch Leerzeichen im Bateinamen enthlaten, muss dieser Name als Paramter verwendet öglichst immer in Anführungszeichen angegeben werden.

Beispiel: wenn der Name bzw der Parameter 1 so aussieht:
Bin jetzt in :ProcessFile, Parameter sind ["03172 KolkwitzMax Muster2.txt"]
...dann muss die momentane Zeile 35 in deinem letzten Kommentar so aussehen:
ren "%~n1.pdf" "%NameNeu%.pdf"

Mein Fehler bzw mein Geschlamper.

Zu dem Vorhande Versionen nicht überschreiben, sondern als mit Versionsnummern umbenennen" mach bitte eine neue Frage auf.

Hier liest keiner außer uns beiden mit, und ich bin jetzt gleich auf der Autobahn und dann im Wochenende

Grüße
Biber
Member: ingo101
ingo101 May 27, 2016 at 12:59:27 (UTC)
Goto Top
Danke für Deine Hilfe, Biber! Es macht, was es soll.

Gute Fahrt und WE.

Gruß
Ingo