Clever-Excel-Forum

Normale Version: Pdf auslesen - in Excel übertragen??
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo Zusammen,

gibt es irgendeine Möglichkeit bestimmte Zeilen von einer PDF-Datei (ohne das man diese in eine exe. Datei umwandeln muss) 
auszulesen und diese in Excel übertragen werden??

ich habe schon von einigen VBAs gelesen, damit kenne ich mich leider nicht ganz so aus und denke
das hier die Datei umgewandelt werden muss.... 

Für Eure Hilfe bin ich sehr Dankbar  Blush

LG Sandra
Hallöchen,

eine pdf in eine exe umwandeln? Wie geht das?
Ansonsten, schaue, ob Du die Datei in Word bekommst und wenn ja, kopiere die Daten von dort.

PS:
Bei der Versionsangabe in Deinem Profil interessiert uns im Excel-Forum eher die Excel-Version Smile
Hi Sandra,

mit VBA? 
Ja gibt es.

Um eine qualifiziertere Antwort geben zu können würde ein Beispiel-PDF sich hier anbieten.
Außerdem, welchen Text Du daraus begehrst.
Hallo,

es geht um Rechnungen aus denen ich die "Ref.: 2274176,2274176,2274176"  mit der dazugehörigen "Lademittelart 1 EW-Palette 1 Colli" und
"Abrechnungsposten Fracht Paletten inkl. Maut EUR 39,90" in Excel auswerten will.
Anbei ein PDF Beispiel, die Aufstellung ist immer die selbe, meistens 2-3 Positionen pro Seite.
Und damit ich nicht alles manuell mit Copy&Paste ins Excel übertragen muss dachte ich mir ob es vl. eine einfachere Lösung gibt....

Vielen Dank :)
Hallo,

mit "PDFtoTEXT.exe" kann die Datei in eine Text-Datei gewandelt werden. Dies sollte auch für viele Dateien mit einem Aufruf möglich sein.

Die beigefügte Datei kann dann entweder direkt aus dem Menu, oder besser mit VBA "OPEN file FOR READING" gelesen werden.

mfg
@Fennek:
Genau da wollen wir hin ;)

Code:
Option Explicit
Const sPFADEXEFILE As String = "C:\Test\xpdf-tools-win-4.02\bin32\pdftotext.exe" '<--- anpassen; Pfad zur Pdftotext.exe

Sub main()
   
    Dim f As Scripting.File
    Dim fso As New Scripting.FileSystemObject
    Dim sFile As String
   
    With fso.GetFolder("C:\Test\PDF\") '<--- anpassen; Pfad mit den PDFs
   
        For Each f In .Files
            If InStr(1, f.Path, ".pdf", vbTextCompare) > 0 Then
                fGetPDFText sPFADEXEFILE, f.Path, Replace(f.Path, ".pdf", ".txt")
            End If
        Next f
   
    End With
   
   
   
End Sub


Public Function fGetPDFText(ByVal sExecuteFile As String, _
                        ByVal sSourcePDF As String, _
                        ByVal sTargetTXT As String) As Boolean
'// ------------------------------------------------------------------------------------
'// Methode:  | Erzeugen einer Textdatei aus einem PDF-Dokument
'// ------------------------------------------------------------------------------------
'// Parameter: | sExecuteFile - vollständiger Pfad der pdftotext.exe
'//            | sSourcePDF  - vollständiger Pfad des Quelldokumentes (PDF)
'//            | sTargetTXT  - vollständiger Pfad des Zieldokumentes (TXT)
'// ------------------------------------------------------------------------------------
'// Rückgabe:  | True bei Erfolg
'// ------------------------------------------------------------------------------------
'// Autor:    | ebs17
'// ------------------------------------------------------------------------------------
'// Hinweis:  | pdftotext.exe beziehbar über http://www.foolabs.com/xpdf/download.html
'//            | aktueller Download zum 18.01.2011:
'//            | ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl5-win32.zip
'// ------------------------------------------------------------------------------------

  Dim sCommand As String
  Dim vResult As Variant
  sCommand = sExecuteFile & " -raw " & sSourcePDF & " " & sTargetTXT
  vResult = Shell(sCommand, vbHide)
  fGetPDFText = Not IsNull(vResult)
End Function

Sub main2()
   
    Dim s As String
    Dim v
    Dim f As Scripting.File
    Dim fso As New Scripting.FileSystemObject
    Dim FF As Integer: FF = FreeFile
   
    With fso.GetFolder("C:\Test\TXT\") '<--- anpassen; Pfad zu den TXT
   
        For Each f In .Files
       
            Open f.Path For Binary As FF
                s = Space$(LOF(FF))
                Get #FF, , s
            Close FF
       
            v = Split(s, vbCrLf)
            '*** Daten eintragen
            With Worksheets(1).Cells(Rows.Count, 1).End(xlUp)
                .Offset(1).Value = f.Path
                .Offset(1, 1).Value = v(1)  '<--- Zeilen der TXT
                .Offset(1, 2).Value = v(2)  '<--- Zeilen der TXT
            End With
        Next f
   
    End With

End Sub

Vorgehensweise:
- PDFtoText runterladen extrahieren
- den Pfad im Code anpassen
- alle PDFs unter C:\Test\PDF\ ablegen
- Prozedur main() ausführen
- in C:\Test\PDF\ nun alle txt-Files ausschneiden
- in c:\Test\TXT\ einfügen

ab hier entweder mit main2() weitermachen (dazu müsste man aber weitere PDFs analysieren; Stichwort: 2-3 Positionen auf einem PDF -> gibt Dein Beispiel nicht her)

Oder aber, was für Dich wesentlich praktikabler wäre, ist der Einsatz von PowerQuery.
Da klickst Du das begehrte dann zusammen.

Eine gute Seite zum einlesen wäre m.E. diese hier:
PQ-Import en détail | Excel ist sexy! (excel-ist-sexy.de)

Oder Günther meldet sich selbst zu Wort, dann lerne Ich in Sachen PQ auch mal wieder was dazu ;)


Edit:
Sehe eben, dass ich stur aus einem Projekt kopierte.
Bevor Du den Code zum laufen bekommst, musst im Visual Basic Editor noch einen Verweis setzen.

Starte Excel -> Alt+F11 -> Extras -> Verweise -> M$ Scripting Runtime suchen -> anhaken -> mit OK bestätigen.

Ist zwar umständlicher als LateBinding, aber komfortabler für Dich/Euch, falls Ihr Änderungen vornehmen wollt/müsst.
Vielen Dank für die Hilfe einst weil - werde ich gleich testen und melde mich 
dann dazu :)

LG
Habe es jetzt mal lt. deiner Anleitung als Beispiel ausprobiert - hat wunderbar funktioniert. :)
Vielen Dank dafür. 

Habe jetzt ein Beisp. angehängt mit mehreren Positionen bzw. Seiten -> Stichwort: 2-3 Positionen auf einem PDF.
In dieser Situation kann ich diesen VBA-Code wenig verwenden da die Zeilen ja immer unterschiedlich sind. 
Gibt es vl. auch eine Möglichkeit das z.B. nur der Text gesucht wird und mir dann die Zeile (oder auch nur der Text) ausgelesen wird?

Danke im Voraus 
LG
Hallo,

es scheint eine recht einfache Möglichkeit zu geben. Mit der zweiten Beispiel-txt-Datei geht:

Code:
im CMD:

find "Ref" Beisp._2.txt

---------- BEISP._2.TXT
Abgangsland: AT Ref.: 2274176,2274176,2274176
Empfangsland: AT Ref.: Mail 20.12.2019
Abgangsland: AT Ref.: 2276570,2276570,2276570
Empfangsland: Ref.: AD Sattler
Abgangsland: AT Ref.: 2273441,2273441,2273441
Empfangsland: Ref.: Y3I9G
Abgangsland: AT Ref.: 2277481,2277481,2277481
Empfangsland: Ref.: 384089
Abgangsland: AT Ref.: 2275112,2275112,2275112
Empfangsland: Ref.: lt. Mail
Abgangsland: AT Ref.: 2274879,2274879,2274879
Empfangsland: Ref.: Y3QR5

Mein PC mit Excel wurde heute noch nicht hochgefahren, deshalb ein "low tech" Versuch.

mfg
Da Dir nun alle PDFs (mit Einer sowie n-Positionen) als TXT vorliegen, könntest Du doch versuchen, den TXT-Ordner in PQ einzulesen und entsprechend zu filtern.
Schon etwas eingelesen in dieser Richtung?

Natürlich ginge auch eine VBA Lösung. Einen Ansatz hast Du bereits in der Prozedur main2().
Die müsste man entsprechend anpassen; das Array geschickt befüllen... aber diesen Weg werde Ich nicht mitgehen.

Bis hierhin ok - der Rest darf etwas Eigenleistung verlangen ;)
Seiten: 1 2