mimuch
Goto Top

PDF auslesen und per Batch umbenennen

Guten Morgen

Ich habe einige Beiträge gelesen und "Zeile aus Datei auslesen und diese dann umbenennen" war am nächsten zu meiner frage, leider komm ich aber nicht mehr weiter.

ps: meine Batchkentnisse sind sehr verstaubt face-smile

Das Problem ist das ich jeden Tag über 50 neue PDFs habe die nach Datum benannt sind. z.B: 20100209100805.pdf

Das PDF Dokument sieht so aus:
*BILD*
Method name: Std-FAST
Sample ID: GLN00146-011-F1 (# 38)
Pe a k Numb e r # A r e a % Re t . T i me A r e a BC

Ich möchte die SampleID auslesen und damit die PDF-Datei umbenennen. In unserem Beispiel wird 20100209100805.pdf zu GLN00146-011-F1.pdf

Mein Lösungsansatz wäre:

1. PDF wird zu TXT umgewandelt
2. SampleID wird aus TXT ausgelesen
3. PDF Datei wird mit der SampleD umbenannt
4. TXT Datei wird gelöscht

Für eine schnelle Hilfe wäre ich dankbar

hg mimu

Content-Key: 141633

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

Printed on: April 19, 2024 at 14:04 o'clock

Mitglied: 77559
77559 Apr 28, 2010 at 09:04:39 (UTC)
Goto Top
Hallo mimu,

es gibt zwar die pdftools mit einer pdf2txt, aber ob der Text so einfach extrahiert werden kann, hängt stark vom Aufbau und der Herkunft der PDF-Datei ab.
Zum Testen schlage ich vor das du in einem CMD-Window einfach mal eingibst

findstr /I "Sample.ID" 20100209100805.pdf

Und rückmeldest ob da eine verarbeitbare Ausgabe erscheint.

Gruß
LotPings
Member: mimuCH
mimuCH Apr 28, 2010 at 09:33:19 (UTC)
Goto Top
Hoi LotPings

Ich habe mal den pdf zu txt umgewandelt und es sieht nicht schlecht aus:

...einige Zahlen
7.025
Method name: Std-FAST
Analysed: 24.03.2010 18:02
GC method: Std-FAST
Sample ID: GLN00146-011-F1 (# 38)
Pe a k Numb e r # A r e a % Re t . T i me A r e a BC
- - - - - - - - - - - - - - - - - - - - - -
weitere Zahlen

mit dem Befehl:

findstr /I "Sample ID" 20100209100805.pdf

gab folgende Ausgabe:

<< /Type /Pages /Kids [
<?xpacket begin='...' id='W5M0MpCehiHzreSzNTczkc9d'?>
<rdf:Description rdf:about='683bfc6d-39c4-11df-0000-0538daf7fac7' xmlns:xap
ttp://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='683bfc6d-39c4-11df-0000-0
f7fac7'/>
/ID [<631E73F378A39D964118B751905A5BE6><631E73F378A39D964118B751905A5BE6>]

Was nicht wirklich brauchbar ist face-sad
Mitglied: 77559
Solution 77559 Apr 28, 2010, updated at Apr 20, 2015 at 08:44:33 (UTC)
Goto Top
Zitat von @mimuCH:
Ich habe mal den pdf zu txt umgewandelt und es sieht nicht schlecht aus:

...einige Zahlen
7.025
Method name: Std-FAST
Analysed: 24.03.2010 18:02
GC method: Std-FAST
Sample ID: GLN00146-011-F1 (# 38)
Das scheint also zu klappen.

findstr /I "Sample ID" 20100209100805.pdf
Tja, jetzt bin ich pingelig,
in meiner Zeile stand ein Puntk zwischen Sampe und ID und das war Absicht.
Mit Leerzeichen behandelt findstr die zwei Begriffe unabhängig bei der Suche , sprich er schmeisst alle Zeilen raus die entweder Sample oder ID enthalten.

Hiermit könntest du den Namen aus der Txt-Datei extrahieren (ungetestet):
@Echo off
for /f "Tokens=2 delims=:(" %%A in (  
  'findstr /I "Sample.ID" 20100209100805.txt'  
    ) Do Call :Trim SampleID %%A
Echo SampleID: %SampleID%
Goto :Eof
:Trim
Set %1=%2
Goto :Eof

Gruß
LotPings
Member: bastla
Solution bastla Apr 28, 2010, updated at Apr 20, 2015 at 08:44:47 (UTC)
Goto Top
@77559
Mit Leerzeichen behandelt findstr die zwei Begriffe unabhängig bei der Suche , sprich er schmeisst alle Zeilen raus die entweder Sample oder ID enthalten.
Wenn Du aber ganz besonders pingelig sein wolltest (und tatsächlich nur "Sample ID" - also durch ein Leerzeichen, und nur durch ein solches getrennt - gefunden werden soll), könntest Du ja noch zu "/c:" greifen ...

Grüße
bastla
Mitglied: 77559
77559 Apr 28, 2010 at 10:30:26 (UTC)
Goto Top
@bastla,
ja ich weß, aber wenn ich den Suchbegriff modifiziere bin ich meist zu faul nochmal vorne was zu ändern face-wink
Aber du hast schon Recht, man umgeht die Macken von findstr schon intuitiv ohne darüber nachzudenken das Anfänger den Code nicht so ohne weiteres nachvollziehen können.

[OT]
Wäre es nicht schön wenn findstr vollwertige RegEx beherschen würde .. seufz
[/OT]

Gruß
LotPings
Member: bastla
bastla Apr 28, 2010 at 10:38:29 (UTC)
Goto Top
[OT]
@77559
Wäre es nicht schön wenn findstr vollwertige RegEx beherschen würde .. seufz
Würde es dann noch zum gleichen Betriebssystem gehören? face-wink

Grüße
bastla
[/OT]
Member: mimuCH
mimuCH Apr 28, 2010 at 11:15:20 (UTC)
Goto Top
sorry bei findstr /I "Sample.ID" 20100209100805.pdf gab es keine Ausgabe, deshalb habe ich es mit "Sample ID" probiert.


dass txt extrahieren hat funktioniert und es gab mir die gewünschte Ausgabe.
Mitglied: 77559
Solution 77559 Apr 28, 2010, updated at Apr 20, 2015 at 08:45:38 (UTC)
Goto Top
Prima, wenn du bei dem Lösungsansatz

Mein Lösungsansatz wäre:
1. PDF wird zu TXT umgewandelt
2. SampleID wird aus TXT ausgelesen
3. PDF Datei wird mit der SampleD umbenannt
4. TXT Datei wird gelöscht

weitere Hilfe brauchst, einfach fragen.

Gruß
LotPings
Mitglied: 77559
Solution 77559 Apr 28, 2010, updated at Apr 20, 2015 at 08:45:50 (UTC)
Goto Top
Hier eine komplettlösung, wenn sie noch gefragt ist:
@Echo off
:: Batch benötigt pdftptext.exe aus diesem Paket (nicht auf Win x64 lauffähig)
:: ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl4-win32.zip
For /f "Delims=" %%A in ('Dir /B /A-D ".\20*.pdf"') Do Call :ProcPDF "%%A" "%%~nA.txt"  
Goto :Eof

:ProcPDF
PdfToTxt.exe %1
If defined SampleID set "SampleID="  
for /f "Tokens=2 delims=:(" %%B in ( 'findstr /I "Sample.ID" %2 ' ) Do Call :Trim SampleID %%B  
If Not Defined SampleID Echo Keine SampleID in %1 & goto :EOF
Echo Ren %1 "%SampleID%.PDF"  
Del %2 /Q 2>NUL
Goto :Eof 

:Trim 
Set %1=%2 
Goto :Eof

Gruß
LotPings

Edit:Wenn die Ausgabe korrekt erscheint das Echo vor dem Ren Befehl entfernen.
Member: mimuCH
mimuCH Apr 29, 2010 at 11:16:29 (UTC)
Goto Top
Hallo LotPings

Erst mal einen grossen Dank an dir. Ich habe den Batch getestet und komme leider nicht weiter face-sad

Es will immer den PDF mit Analysed umbennen.
Ausgabe sah so aus: Ren "20100209100805.pdf" "Analysed .PDF"

Ich habe den PDF in Text mit deinem Tool umgewandelt uns es sieht so aus:

...zahlen
12.998
Method name: Analysed: GC method: Sample ID:
Std-FAST 24.03.2010 18:02 Std-FAST GLN00146-011-F1 (# 38)
P e a k Numb e r # ---------------1 2 To t a l s
...weitere zahlen
Member: bastla
bastla Apr 29, 2010 at 11:29:30 (UTC)
Goto Top
Hallo mimuCH!
Es will immer den PDF mit Analysed umbennen.
Da "findstr" zeilenorientiert arbeitet, ist das nicht weiter verwunderlich - gefunden und zerlegt wird, anders als in Deinem Beispiel von oben:
Sample ID: GLN00146-011-F1 (# 38)
hier eben:
Method name: Analysed: GC method: Sample ID:
Mit "tokens=2 delims=:" wird diese Zeile anhand des Trennzeichens ":" in 4 (oder 5, falls nach dem letzten ":" noch zB Leerzeichen folgen sollten) Teile ("tokens") zerlegt, wobei sich als zweiter Teil eben " Analysed" ergibt ...

Es könnte zwar die Suche verfeinert werden, indem verlangt wird, dass "Sample ID:" am Zeilenanfang stehen muss - dies würde aber nur dazu führen, dass hier eben gar keine Zeile mehr gefunden würde; insofern ist es also tatsächlich (wie von LotPings bereits gemutmaßt) nicht so so einfach, an die Informationen zu kommen ...

Grüße
bastla
Mitglied: 77559
Solution 77559 Apr 29, 2010, updated at Apr 20, 2015 at 08:46:33 (UTC)
Goto Top
Zitat von @mimuCH:
Anhand deiner obigen Angaben (und unter der Annahme das die Struktur einheitlich ist) habe ich den (for /f findstr)-Befehl aufgebaut.
Das war offensichtlich danebengeschossen. Deinem ersten Beispiel nach habe ich den Begriff hinter Sample Id und vor der offenen Klammer als Dateiname gewählt.
Das passt natürlich nicht wenn Sample ID nicht am Zeilenanfang steht und der Inhalt dahinter auch noch mit Leerzeichen unterbrochen ist.

Je nach Herkunft der PDF Datei müssen Texte auch nicht in der Datei in der Reihenfolge enthalten sein wie sie auf dem Papier erscheinen, was es dann ohne OCR unmöglich macht die Sample ID sauber zu extrahieren.

Ich habe den PDF in Text mit deinem Tool umgewandelt uns es sieht so aus:
...zahlen
12.998
Method name: Analysed: GC method: Sample ID:
Std-FAST 24.03.2010 18:02 Std-FAST GLN00146-011-F1 (# 38)
P e a k Numb e r # ---------------1 2 To t a l s
...weitere zahlen

Selbst wenn man mit besseren RegEx möglichkeiten z.Bsp. von Grep exakter den Text hinter Sample Id und vor dem "(" rauszieht wäre immer noch die Frage was von
Std-FAST 24.03.2010 18:02 Std-FAST GLN00146-011-F1 denn jetzt als Dateiname dienen soll?

Wie man sieht habe ich voreilig auf deinen Angaben eine Batch gebaut.
Ob es lohnt ohne präzisere Angaben von dir weitere Zeit zu investieren ist fraglich.

Gruß
LotPings
Member: mimuCH
mimuCH Apr 29, 2010 at 12:13:02 (UTC)
Goto Top
hoi bastla

Ich habe bei der konvertierung noch -raw hinzugefügt und kann die ID auslesen, da beide jetzt auf der gleichen Zeile sind face-smile
PdfToText.exe -raw %1

Danach gab es:
Ren "20100209100805.pdf" "GLN00146-011-F1 .PDF"


Wie kann ich jetzt noch die Leerzeichen wegnehmen?

beste grüsse
mimu
Member: bastla
Solution bastla Apr 29, 2010, updated at Apr 20, 2015 at 08:46:45 (UTC)
Goto Top
Hallo mimuCH!

Wenn jetzt die entsprechende Zeile den anfangs beschriebenen Aufbau hat, sollte sich das Leerzeichen durch eine Anpassung der Schleifenparameter in der Zeile 10 auf
for /f "Tokens=3 delims=:( " %%B in ( 'findstr /I "Sample.ID" %2 ' ) Do Call :Trim SampleID %%B
eliminieren lassen (das Prinzip sollte ja inzwischen nachvollziehbar sein) ...

Grüße
bastla
Member: Pandamir
Pandamir Apr 09, 2014 at 15:18:15 (UTC)
Goto Top
Moin,

ich eröffne mal an dieser Stelle da ich ein ähnliches Problem habe.
Ich möchte aus einem PDF eine Kundennummer auslesen und diese dann als Dateinamen verwenden.
Aufbau:
Kundennummer 123456KD123456
Ich hab versucht die obige Batch entsprechend abzuändern aber irgendwie klappt das nicht, da er keine Kundennummer findet.
Er wandelt allerdings die pdfs in txt um und hier steht die Kundennummer nicht mehr in der selben Zeile.
Zu der Kundennummer ist zu sagen, dass die Ziffern sowohl vor dem KD als auch danach variabel sein können. Das "KD" steht jedoch in jeder Kundennummer.

Kann mir hier jemand helfen?

Danke und VG
Panda
Member: bastla
bastla Apr 09, 2014 updated at 16:49:49 (UTC)
Goto Top
Hallo Pandamir!

Wenn Du nicht nach "Sample.ID", sondern nach "KD" suchst, solltest Du zumindest schon die richtigen Zeilen erhalten - wie die Zerlegung dieser Zeilen erfolgen muss, kannst nur Du wissen; sollte allerdings in einer solchen Zeile tatsächlich nur
Kundennummer 123456KD123456
stehen, bräuchtest Du nur "tokens=2" (ohne "delims", da Leerzeichen und TAB Default-Trennzeichen sind) ...

Grüße
bastla
Mitglied: 77559
77559 Apr 09, 2014 at 17:03:19 (UTC)
Goto Top
Hallo Panda,

eine PDF-Datei kann sehr unterschiedliche Informationen enthalten. Wenn sie nur Pixelinformationen enthält, ist da z.Bsp. kein Text der gefiltert werden könnte.
Deine Informationen lassen weder erkennen was du bisher genau gemaht hast - noch wie erfahren du im Umgang mit solchen Problemen bist.
Das obige ist kein Patentrezept sondern eine vor langer Zeit schrittweise erarbeitete Lösung für ein konkretes Problem.
Leider haben wir alle nicht immer Zeit und/oder Lust für ein solches Vorgehen das ja auch auf deinen Skills basieren muss.

Gruß LotPings
Member: Pandamir
Pandamir Apr 10, 2014 at 06:40:41 (UTC)
Goto Top
Hallo und guten Morgen.

mit der oben genannten Batch und pdftotext kann ich die PDF-Datei in eine Textdatei umwandeln.
Diese Textdatei enthält auch auslesbaren Text und die benötigte Kundennummer ist auch im entsprechenden Format enthalten.
Meine Idee war jetzt einfach "Sample.ID" durch "Kundennummer" zu ersetzen.
Hier kommt jedoch die Fehlermeldung, dass keine Kundennummer gefunden werden konnte.
Suche ich jetzt wie von bastla (trotzdem danke für den Tip) nach "KD" stellt sich mir die Frage ob die Batch die "KD" casesensitive ausliest.
Sollte das nicht so sein, und "KD" wird auch als "kd" genutzt könnte es theoretisch passieren, dass ein Kundenname als Dateiname verarbeitet wird oder die Batch die Verarbeitung abbricht?

Danke und VG
Panda
Member: bastla
bastla Apr 10, 2014 updated at 07:15:55 (UTC)
Goto Top
Hallo Pandamir!

Case-sensitive wird's, wenn Du bei "findstr" das "/I" weg lässt ...

Grüße
bastla
Member: Pandamir
Pandamir Apr 10, 2014 at 08:49:00 (UTC)
Goto Top
Super. Das Script funktioniert. Leider habe ich noch das Problem wie bereits oben beschrieben, dass er zum Ende des Dateinamens ein Leerzeichen einfügt.
Bei dem von bastla eingestellten Änderung in Zeile 10:
for /f "Tokens=3 delims=face-sad " %%B in ( 'findstr /I "Sample.ID" %2 ' ) Do Call :Trim SampleID %%B

konnte ich nur die Änderung von Tokens=2 in Tokens=3 erkennen. Baue ich diese Änderung ein, wird die Kundennummer nicht mehr gefunden.
Gibt es eine Möglichkeit das Leerzeichen noch zu entfernen?
Wenn nicht, wär es auch nicht wild (wär "nur" das Sahnehäubchen). face-smile

Danke und VG
Panda
Member: bastla
bastla Apr 10, 2014 at 11:46:22 (UTC)
Goto Top
Hallo Pandamir!

Versuch es mit folgender Zeile 17:
Set "%1=%2"
Grüße
bastla
Member: Pandamir
Pandamir Apr 10, 2014 at 12:10:56 (UTC)
Goto Top
PERFEKT!!!
Danke. face-smile

VG
Panda
Member: Pandamir
Pandamir Apr 10, 2014 at 14:09:29 (UTC)
Goto Top
Aaaaargh...
jetzt wirds tricky.
In der pdf sind Bankdaten enthalten bei deren BIC ggf. auch ein KD enthalten ist.
Resultat ist, dass der Dateiname dann "BIC" heisst.
Kann ich den Such-String so definieren, dass im Dokument nach 123456KD123456 (6xZiffer KD 6xZiffer) gesucht wird?

VG
Panda
Member: bastla
bastla Apr 10, 2014 at 14:21:31 (UTC)
Goto Top
Hallo Pandamir!

Dein Suchstring wäre dann
findstr "[0-9][0-9][0-9][0-9][0-9][0-9]KD[0-9][0-9][0-9][0-9][0-9][0-9]"
Grüße
bastla
Member: Pandamir
Pandamir Apr 11, 2014 updated at 08:12:10 (UTC)
Goto Top
Hallo Bastla,

Danke für deine Hilfe. Leider besteht das Problem noch immer.
Ich habe eine Vermutung wo mein Problem liegt.
Ich habe mir dei Textdatei mal dazu angesehen.
Die Auswertung erfolgt so wie ich das sehe zeilenweise. Der Token-Befehl gibt an welchen Wert er ausgeben soll.
Damit wird aber wenn ich richtig liege der "findstr" ausser Kraft gesetzt da ich ihm ja bereits mit Token sage welchen wert er mir ausgeben soll.
Ich benötige also eine Lösung die zwar Zeilenweise sucht, aber mir nur das ausgibt was bastla im "findstr" als Suchparameter übergibt.
Nämlich:
findstr "[0-9][0-9][0-9][0-9][0-9][0-9]KD[0-9][0-9][0-9][0-9][0-9][0-9]"

Die Kundennummer ist eindeutig und kommt auch nur einmal in dem gesamten Dokument vor.
Problematisch wird es ggf. dadurch, dass die Kundennummer in unterschiedlichen Zeilen in dem Textdokument stehen kann.
Anbei mal der aktuelle Quelltext:

@Echo off
:: Batch benötigt pdftotext.exe aus diesem Paket (nicht auf Win x64 lauffähig)
:: ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl4-win32.zip
For /f "Delims=" %%A in ('Dir /B /A-D ".\Rechnung*.pdf"') Do Call :ProcPDF "%%A" "%%~nA.txt"  
Goto :Eof

:ProcPDF
pdftotext.exe %1
If defined Kundennumer set "Kundennumer="  
for /f "Tokens=2" %%B in ( 'findstr "[0-9][0-9][0-9][0-9][0-9][0-9]KD[0-9][0-9][0-9][0-9][0-9][0-9]" %2 ' ) Do Call :Trim Kundennumer %%B  
If Not Defined Kundennumer Echo Keine Kundennumer in %1 & goto :EOF
Echo Ren %1 "%Kundennumer%.pdf"  
Del %2 /Q 2>NUL
Goto :Eof 

:Trim 
Set "%1=%2"   
Goto :Eof

Ich hoffe dafür gibt es eine Lösung.

Danke für eure Unterstützung.

VG
Panda
Member: bastla
bastla Apr 11, 2014 at 12:33:52 (UTC)
Goto Top
Hallo Pandamir!
Damit wird aber wenn ich richtig liege der "findstr" ausser Kraft gesetzt da ich ihm ja bereits mit Token sage welchen wert er mir ausgeben soll.
Damit liegst Du nicht richtig - zunächst wird "findstr" ausgeführt und liefert eine oder mehrere passende Zeilen (und zwar immer die gesamten Zeilen) und dann erst werden diese durch die Schleife nacheinander abgearbeitet und anhand der Angaben für "tokens" und (ggf "delims") zerlegt. In %%B erhältst Du daher das, was in der jeweiligen Zeile als 2. Token (also zwischen erstem und zweitem Leerzeichen) steht.

Lass den Batch mal mit "echo on" laufen und schau Dir den Ablauf an.

Hilfreich für die Fehlersuche wäre es, wenn Du die relevanten Zeilen einer (anonymisierten) Beispiel-Textdatei (als "Code" formatiert) posten könntest.

Vereinfachen ließe sich Dein Code aber jedenfalls schon mal etwa so:
@Echo off & setlocal
For /f "Delims=" %%A in ('Dir /B /A-D "Rechnung*.pdf"') Do Call :ProcPDF "%%A" "%%~nA.txt"  
Goto :Eof

:ProcPDF
pdftotext.exe %1
set "KNr="  
for /f "Tokens=2" %%B in ( 'findstr "[0-9][0-9][0-9][0-9][0-9][0-9]KD[0-9][0-9][0-9][0-9][0-9][0-9]" %2 ' ) Do set "KNr=%%B"  
If Not Defined KNr Echo Keine Kundennummer in %1 & goto :EOF
Echo Ren %1 "%KNr%.pdf"  
Del %2 /Q 2>NUL
Goto :Eof 
Grüße
bastla
Member: Pandamir
Pandamir Apr 11, 2014 updated at 13:35:31 (UTC)
Goto Top
Hallo Bastla,

danke für deine Aufklärungsarbeit.
Mein Problem ist, dass die benötigte Kundennummer in der Zeile an unterschiedlichen Stellen liegen kann,
da in der Zeile auch Namen und Vornamen und ggf. 2. und 3 Personen jeweils mit Namen und Vornamen stehen.
Ich benötige also einen Bereich in der Zeile.
Nach einem Test mit Token wird mir jeweils bei Tokens=1 der erste Token bei Tokens=2 der 2. Token usw. ausgegeben.
Diese stimmen jedoch nicht mit dem String überein.
Ich bin eig. davon ausgegangen dass Die Definition des String nach findstr explizit nach der Zeichenfolge in der Zeile sucht.
Die BIC stimmt jedoch nicht mit dem Suchstring überein (Dateiname lautet "BIC.pdf" sollte aber 123456KD123456.pdf lauten).

VG
Panda
Member: bastla
bastla Apr 11, 2014 at 14:02:18 (UTC)
Goto Top
Hallo Pandamir!

Wenn auf jeden Fall "Kundennummer" in der gleichen Zeile und unmittelbar vor der gesuchten Nummer steht, dann vielleicht so:
@Echo off & setlocal
For /f "Delims=" %%A in ('Dir /B /A-D "Rechnung*.pdf"') Do Call :ProcPDF "%%A" "%%~nA.txt"  
Goto :Eof

:ProcPDF
pdftotext.exe %1
set "Zeile="  
for /f "delims=" %%B in ( 'findstr "[0-9][0-9][0-9][0-9][0-9][0-9]KD[0-9][0-9][0-9][0-9][0-9][0-9]" %2 ' ) Do set "Zeile=%%B"  
If Not Defined Zeile Echo Keine Kundennummer in %1 & goto :EOF
set "KNr="  
for /f "tokens=1" %%B in ("%Zeile:*Kundennummer=%") do set "KNr=%%B"  
If Not Defined KNr Echo Keine Kundennummer in %1 & goto :EOF
Echo Ren %1 "%KNr%.pdf"  
Del %2 /Q 2>NUL
Goto :Eof 
Damit wird zunächst alles vom Zeilenanfang bis inklusive "Kundennummer" durch "nichts" ersetzt, wodurch die gesuchte Nummer dann eigentlich Token 1 sein müsste ...

Grüße
bastla
Member: Pandamir
Pandamir Apr 16, 2014 at 12:36:39 (UTC)
Goto Top
Hallo bastla,

sorry für meine späte Antwort.
Leider ist dem nicht so, dass in jeder Textdatei das Wort Kundenummer vor der Kundennummer steht.
Das einzige Merkmal was die Kundennummer identifizieren kann ist das Schema "[0-9][0-9][0-9][0-9][0-9][0-9]KD[0-9][0-9][0-9][0-9][0-9][0-9]"
da dieses wirklich nur einmal vorkommt.
Was auf jeden Fall (zumindest in den Textdateien die ich bisher gesehen habe) vorkommt, ist die Zeichenfolge "[0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]".

VG
Panda
Member: madgeek
madgeek Apr 07, 2015 updated at 15:04:10 (UTC)
Goto Top
@Echo off
:: Batch benötigt pdftptext.exe aus diesem Paket (nicht auf Win x64 lauffähig)
:: ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl4-win32.zip
For /f "Delims=" %%A in ('Dir /B /A-D ".\20*.pdf"') Do Call :ProcPDF "%%A"  
"%%~nA.txt"  
Goto :Eof

:ProcPDF
PdfToTxt.exe %1
If defined SampleID set "SampleID="  
for /f "Tokens=2 delims=:(" %%B in ( 'findstr /I "Sample.ID" %2 ' ) Do Call :Trim SampleID %%B  
If Not Defined SampleID Echo Keine SampleID in %1 & goto :EOF
Echo Ren %1 "%SampleID%.PDF"  
Del %2 /Q 2>NUL
Goto :Eof 

:Trim 
Set %1=%2 
Goto :Eof


Hallo zusammen

Ich könnte diesen Script auch super verwenden, allerdings sollte einfach die erste Zeile in der TXT-Datei verwendet werden, um die Datei umzubenennen (also suchen im Text nicht notwendig).

Kann mir jemand helfen?

Vielen Dank und liebe Grüsse
MadGeek
Member: bastla
bastla Apr 09, 2015 at 12:19:54 (UTC)
Goto Top
Hallo madgeek!

Den Inhalt der ersten Zeile bekommst du einfach mit
set /p SampleID=<%1
in die Variable %SampleID% ...

Grüße
bastla
Member: madgeek
madgeek Apr 10, 2015 at 09:03:53 (UTC)
Goto Top
Vielen Dank bastla!

Das war's genau.

Beste Grüsse
MadGeek
Member: ucdsr2019
ucdsr2019 Nov 28, 2019 at 12:31:54 (UTC)
Goto Top
Hallo, vielen Dank an alle Leute die hier schon Lösungen vorgeschlagen haben. Ich habe ein Vorhaben, was ich leider noch nicht umsetzen konnte.

Ich habe PDFs die wie folgt benannt sind:
DOC_144658_001.pdf
DOC_144658_002.pdf
also immer:
DOC*.pdf

Der Aufbau des Layouts (Lieferschein) ist immer gleich. Ich möchte die Lieferscheinnummer auslesen und mit diese Nummer soll die pdf unbenannt werden.

Die Nummer gibt es immer zweimal im Dokument:
1. "Nummer: 1541884"
2. weiter unten: "Lieferschein-Nr. 1541884 vom 26.11.2019 - Seite 1 von 1"

hier meine momentane Bat:
es wird jeweils eine txt angelegt, aber es wird die pdf nicht unbenannt - kann mir jemand helfen?

Vielen DANK!

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

:ProcPDF
pdftotext.exe %1
If defined Nummer set "Lieferschein-Nr.="
for /f "Tokens=2 delims=face-sad" %%B in ( 'findstr /I "Lieferschein-Nr." %2 ' ) Do Call :Trim Nummer %%B
If Not Defined Nummer Echo Keine Nummer in %1 & goto :EOF
Echo Ren %1 "%Nummer%.pdf"
Del %2 /Q 2>NUL
Goto :Eof

:Trim
Set "%1=%2"
Goto :Eof
Member: ucdsr2019
ucdsr2019 Dec 16, 2019 at 11:27:39 (UTC)
Goto Top
Hallo,
ich habe es nun hinbekommen - bzw.mir Hilfe geholt. Bei mir machte das "delims=:"Probleme und musste raus.

Ich benötige nun aber noch eine Hilfe face-sad ... Die OCR macht fast immer "Lieferschein-Nr. 1542540" - dann passt es, da hier ein Leerzeichen zwischen Lieferschein-Nr. und der Nummer steht. Bei einigen pdfs macht die OCR aber kein Leerzeichen und schreibt "Lieferschein-Nr.1542540" - dann nimmt die bat das nächste Wort, was immer "vom" ist

Die komplette Zeile lautet - Beispiel:
"Lieferschein-Nr.1542540 vom 10.12.2019 - Seite 1 von 1"

Also nennen die bat eine Datei vom - die restlichen nennt er nicht um, da es ja nur eine vom.pdf geben kann....
Kann ich der bat also einen Befehl zuweisen, entweder ohne oder mit Leerzeichen die Nummer zu suchen?
Die Nummer hat immer 7 Stellen - vielleicht ist dies von Bedeutung.

nun sieht die bat so aus:

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

:ProcPDF
pdftotext.exe %1
If defined Nummer set "Lieferschein-Nr."  
for /f "Tokens=2" %%B in ( 'findstr /I "Lieferschein-Nr." %2 ' ) Do Call :Trim Nummer %%B  
If Not Defined Nummer Echo Keine Nummer in %1 & goto :EOF
Ren %1 "%Nummer%.pdf"  
Del %2 /Q 2>NUL
Goto :Eof 

:Trim 
Set "%1=%2"   
Goto :Eof


Vielen Dank
Member: Christian-aus-Hessen
Christian-aus-Hessen Aug 22, 2021 at 11:11:15 (UTC)
Goto Top
Hallo, bin neu hier.

Ich würde gerne das stadt das Lieferschein-Nr das Datum steht.
Das Datum steht dan so. (24.03.2010.pdf) nach den ich den Script angepast habe.

Ich würde das aber gerne so stehen haben. (2010-03-24.pdf)

Was müste man bei diesen Script endern.
Member: aqui
aqui Aug 22, 2021 updated at 11:32:38 (UTC)
Goto Top
Ich würde gerne das stadt das Lieferschein-Nr das Datum steht.
Bahnhof ? Ägypten ? Die Stadt aus der Anschrift, Das Datum und die LS Nummer ??? 🤔
Der Satz ist erklärungsbedürftig zumindestens aber korrekturbedürftig damit man ihn von der Aussage her wirklich versteht ?!
Member: Christian-aus-Hessen
Christian-aus-Hessen Aug 22, 2021 updated at 13:33:19 (UTC)
Goto Top
so sieht die Text Datei aus.. -Habe den Text aus den Forum entnomme-

Method name: Std-FAST
Analysed: 24.03.2010 18:02
GC method: Std-FAST
Sample ID: GLN00146-011-F1 (# 38)

Script...

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

:ProcPDF
pdftotext.exe %1
If defined Nummer set "Analysed:"  
for /f "Tokens=2" %%B in ( 'findstr /I "Analysed:" %2 ' ) Do Call :Trim Nummer %%B  
If Not Defined Nummer Echo Keine Nummer in %1 & goto :EOF
Ren %1 "%Nummer%-Vodafon.pdf"  
Del %2 /Q 2>NUL
Goto :Eof 

:Trim 
Set "%1=%2"   
Goto :Eof

datei name (24.03.2010-Vodafon.pdf) wird ausgegeben.

Ist die Script richtig ?
Was muss ich ändern das er mir das Datum so ausgibt ? (2010-03-24-Vodafon.pdf)
Member: Christian-aus-Hessen
Christian-aus-Hessen Aug 22, 2021 at 21:06:28 (UTC)
Goto Top
Ich habe die Lösung gefunden.
Zusätzlich noch den Alten Namen dran gehangen. (2010-03-24-Vodafon-DOC*.pdf)

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

:ProcPDF
pdftotext.exe %1
If defined Nummer set "Analysed:"  
for /f "Tokens=2" %%B in ( 'findstr /I "Analysed:" %2 ' ) Do Call :Trim Nummer %%B  
If Not Defined Nummer Echo Keine Nummer in %1 & goto :EOF
Ren %1 "%Nummer:~-4%-%Nummer:~-7,2%-%Nummer:~-10,2%-Vodafon-%1"  
Del %2 /Q 2>NUL
Goto :Eof 

:Trim 
Set "%1=%2"   
Goto :Eof

Ist das so richtig ?
Member: ucdsr2019
ucdsr2019 Aug 25, 2021 at 13:29:05 (UTC)
Goto Top
Kann mir vielleicht auch jemand helfen?
... Die OCR macht fast immer "Lieferschein-Nr. 1542540" - dann passt es, da hier ein Leerzeichen zwischen Lieferschein-Nr. und der Nummer steht. Bei einigen pdfs macht die OCR aber kein Leerzeichen und schreibt "Lieferschein-Nr.1542540" - dann nimmt die bat das nächste Wort, was immer "vom" ist

Die komplette Zeile lautet - Beispiel:
"Lieferschein-Nr.1542540 vom 10.12.2019 - Seite 1 von 1"

Also nennen die bat eine Datei vom - die restlichen nennt er nicht um, da es ja nur eine vom.pdf geben kann....
Kann ich der bat also einen Befehl zuweisen, entweder ohne oder mit Leerzeichen die Nummer zu suchen?
Die Nummer hat immer 7 Stellen - vielleicht ist dies von Bedeutung.
Mitglied: 149062
149062 Aug 25, 2021 updated at 13:38:35 (UTC)
Goto Top
Für sowas nutzt man heutzutage gleich die Powershell mit Regular Expression Power, da kann man jegliche Varianten effektiv behandeln:
Powerhellskript zum auslesen von Kundennummern aus diversen PDFs, mit anschließender Umbenennung der Datei

Die OCR macht fast immer "Lieferschein-Nr. 1542540" - dann passt es, da hier ein Leerzeichen zwischen Lieferschein-Nr. und der Nummer steht. Bei einigen pdfs macht die OCR aber kein Leerzeichen und schreibt "Lieferschein-Nr.1542540" - dann nimmt die bat das nächste Wort, was immer "vom" ist
Mit nem For-Loop und "tokens=2 delims=. " kein Thema
Einfach hier mal durchlesen
Tutorial zur FOR-Schleife
Member: Christian-aus-Hessen
Christian-aus-Hessen Aug 26, 2021 at 10:16:33 (UTC)
Goto Top
Ich habe da ein ähnliches Problem.

Die komplette Zeile lautet - Beispiel:
"Rechnung Nummer 11829-2020/809406"

Würde gerne nur 11829 auslesen wollen.

Wie kann Ich das mit tokens und delims umsetzen?
Mitglied: 149062
149062 Aug 26, 2021 updated at 10:28:43 (UTC)
Goto Top
Zitat von @Christian-aus-Hessen:

Ich habe da ein ähnliches Problem.

Die komplette Zeile lautet - Beispiel:
"Rechnung Nummer 11829-2020/809406"

Würde gerne nur 11829 auslesen wollen.

Wie kann Ich das mit tokens und delims umsetzen?

"tokens=3 delims=- "
Member: Christian-aus-Hessen
Christian-aus-Hessen Aug 26, 2021 at 10:46:23 (UTC)
Goto Top
Viel Dank

Du hast meine Buchhaltung sehr erleichtert.
Member: Christian-aus-Hessen
Christian-aus-Hessen Aug 29, 2021 at 08:34:54 (UTC)
Goto Top
Ich habe da noch ein Problem.

Die komplette Zeile lautet - Beispiel:
Rechnung Nummer

11829


for /f "Tokens=2" %%B in ( 'findstr /I "Rechnung.Nummer" %2 ' ) Do Call :Trim Nummer %%B  

Ich würde gerne die Rechnungs Nummer 11829 ausgebeben wollen. Die Rechnungs Nummer befindet sich zwei zeilen da drunter.
Wie sieht es mit tokens, delims aus?