Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0527: PDF-Dokument auslesen

 von 

Beschreibung 

Dieser Code liest die erste Seite eines PDF-Dokumentes und übergibt ihn an eine VB Funktion als String zur Auswertung des Inhaltes, um Sie, wie in diesem Beispiel z.B. einer Datenbanktabelle zu speichern.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [9,02 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
' Es muss ein Verweis auf 'Adobe Acrobat 5.0 Type Library' gesetzt werden.

'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"


' Verweis : Adobe Acrobat 5.0 Type Library
' Link für SDK : http://partners.adobe.com/asn/developer/sdks.html

' Author: Ruru Date: 07.2002  mailto: ruruhp@lycos.de
'
' Da es wenig Dokumentation und Material außerhalb der SDK für ADOBE gibt,
' und das Adobe Forum alles andere als gut ist, wollte ich
' ein kleines Beispiel über das Auslesen und Erkennen von
' PDF Dateien schreiben.
' Dieser Code liest die erste Seite eines Dokumentes und
' übergibt ihn an eine VB Funktion als String zur Auswertung des Inhaltes,
' um Sie, wie in diesem Beispiel z.B. einer Datenbanktabelle zu übergeben.

' Die PDF Datei Rechnung.PDF sowie die Vorlage in Word, Vorlage.DOC befinden
' sich im beiliegendem Zip Archiv

Option Explicit

Dim PDTextS As Acrobat.CAcroPDTextSelect
Dim Result As Long, PDDoc As Acrobat.CAcroPDDoc
Dim PDPage As Acrobat.CAcroPDPage
Dim PDHili As Acrobat.CAcroHiliteList
Dim B As Boolean
Dim PDFStream As String
Dim Filename As String

' Strings Falls Text von Anfang ausgelesen werden soll (bzw bis zum Ende)
Dim FromFirst As String
Dim ToLast As String

Private Type SQLField
    SQLName As String
    StartTxt As String
    EndTxt As String
End Type
Dim Indizes() As SQLField


Private Sub Form_Load()
' Text1 Multiline auf true setzen, sowie Scrollbars auf 3 (beide)

' Statische Datei
Filename = App.Path & "\Rechnung.pdf"

FromFirst = Chr(169) & Chr(170) & Chr(172)
ToLast = Chr(163) & Chr(165) & Chr(164)

' Indizes werden eingelesen
ReadSpecifications
End Sub


' Start Button

Private Sub Command1_Click()
Dim Str As String, NTL As Long, IString As String
Dim FieldValue As String, i As Integer
Dim SQLString As String, SQLRows As String

Label1.Visible = True

' Initialisierung mit Redim aus PDF SDK, dürfte auch ohne funktionieren,
' so können aber mehrere Dokumente Instanziert werden
ReDim XY(1)

'Trotz Verweises müssen die meisten PDF Elemente über CreateObject
' Eingebunden werden (New bei der Declaration der Variablen geht nicht!)
Set PDDoc = CreateObject("AcroExch.pdDoc")
Result = PDDoc.Open(Filename)

    If Not Result Then
        MsgBox "Can't open file: " & Filename
        Exit Sub
    End If

' Nehme die Erste Seite - Index 0
Set PDPage = PDDoc.AcquirePage(0)

' Erzeuge ein Highlight Objekt und weise ihm 2000 Elemente bei (keine Grenzprobleme)
Set PDHili = CreateObject("AcroExch.HiliteList")
B = PDHili.Add(0, 2000)

' Erzeuge eine Textauswahl aus dem gesamten Text
Set PDTextS = PDPage.CreatePageHilite(PDHili)

    ' Hole Anzahl der "Textblöcke"
    NTL = PDTextS.GetNumText

    ' Gebe den Text der Textauswahl zurück
    For i = 0 To NTL - 1
        Str = Str & PDTextS.GetText(i)
    Next i
    
    
    Text1.Text = Str
    PDFStream = ""
    PDFStream = Str
    
    For i = 1 To 5
        FieldValue = GetIndexfromPDF(Indizes(i).StartTxt, Indizes(i).EndTxt)
        
        ' SQL FELDER
        If SQLRows = "" Then
            SQLRows = Indizes(i).SQLName
        Else
            SQLRows = SQLRows & "," & Indizes(i).SQLName
        End If
        
        ' Inhalt
        If IString = "" Then
            IString = FieldValue
        Else
            IString = IString & "," & FieldValue
        End If
        
    MsgBox Indizes(i).SQLName & "  =  " & FieldValue
    Next i
    SQLString = "Insert into TestTable (" & SQLRows & ") Values (" & IString & ")"
   
    MsgBox "Insert befehl für die Datenbank:" & vbNewLine & SQLString


Result = PDDoc.Close

Set PDPage = Nothing
Set PDHili = Nothing
Set PDTextS = Nothing
Set PDDoc = Nothing
Label1.Visible = False
End Sub




' Einlesen der Daten
' zum Anpassen von Verschiedenen PDF Dateien können diese
' extern in eine INI Datei gespeichert werden und zur Laufzeit ausgelesen werden
Sub ReadSpecifications()
' in unserem Fall kennen wir die Anzahl der Felder
ReDim Preserve Indizes(1 To 5)

Indizes(1).SQLName = "Adresse"
Indizes(1).StartTxt = "Adresse:"
Indizes(1).EndTxt = "Tel:"

Indizes(2).SQLName = "Telefon"
Indizes(2).StartTxt = "Tel:"
Indizes(2).EndTxt = "Rechnungs Nr.:"

Indizes(3).SQLName = "Rechnungs_Nr"
Indizes(3).StartTxt = "Rechnungs Nr.:"
Indizes(3).EndTxt = "Betrag:"

Indizes(4).SQLName = "Betrag"
Indizes(4).StartTxt = "Betrag:"
Indizes(4).EndTxt = "Rechnung"

' Auch Texte mit Leerstellen können verwendet werden
Indizes(5).SQLName = "Text"
Indizes(5).StartTxt = "Rechnung über"
Indizes(5).EndTxt = ToLast   ' Programminterne Konvention für -'nimm den Rest'

End Sub

' Gebe den Inghalt eines Feldes zurück
Function GetIndexfromPDF(Start As String, EndS As String) As String
Dim Pos1 As Long, Pos2 As Long
Dim InitialText As String

On Error Goto fehler

GetIndexfromPDF = ""
InitialText = PDFStream

    ' Cariage Return und LF werden eliminiert,
    ' macht natürlich keinen Sinn bei Text und NText SQL Felder
    InitialText = Replace(InitialText, Chr(13), "")
    InitialText = Replace(InitialText, Chr(10), " ")
    
' Variable von Anfang des Textes
If Start = FromFirst Then
    Pos1 = 1
Else
    Pos1 = InStr(InitialText, Start)    ' Position String1
End If

' Variable bis zum Ende des Textes
If EndS = ToLast Then
    Pos2 = Len(InitialText)
Else
    Pos2 = InStr(Pos1 + Len(Start), InitialText, EndS)  ' Position String2
End If

GetIndexfromPDF = Mid(InitialText, Pos1 + Len(Start), Pos2 - Pos1 - Len(Start) - 1)
Exit Function
fehler:
    MsgBox "Fehler in der Funktion " & GetIndexfromPDF & vbNewLine & _
            "Fehler Nr. " & Err.Number & vbNewLine & Err.Description, vbExclamation, "Fehler"

End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 38 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von am 07.04.2011 um 09:04

Habt Ihr einen Code für vb2008

PDF auslesen?

viele grüße
arthur

Kommentar von Sebastian Franz am 10.12.2008 um 08:08

Hallo Rüdiger,

ich würd mich brennend dafür interessieren, hab aber keine Ahnung, wie ich mit dir Kontakt aufnehmen soll. Aber vielleicht kannst du dich ja bei mir melden:

leviathan99(AT)hotmail(Punkt)com

Wäre echt klasse.

Gruß Sebastian

Kommentar von Rüdiger Furch am 05.12.2008 um 15:11

Hallo

es muss nicht "Adobe Acrobat" komplett installiert sein! 2 Einträge in der Registry und acrobat.exe reichen dafür völlig aus!
Bei Interesse am ToDo melden!
Gruß
Rüdiger

Kommentar von Rolf Klingel am 24.03.2008 um 14:52

Hallo Florian Rittmeier
Habe ein ähnliches Problem bin aber leider kein Progarmierer
Möchte per VBA PDF Dateien die immer gleich strukturiert sind in eine Exceldatei einlesen. Bisherige vorgehensweise: Ich erzeuge mit Adobe Acrobat 8 eine Sammelmappe und exportiere diese in HTML. Danach lese ich die Datei per Webabfrage in Excel ein. Dort verarbeite ich die Dateien weiter. Problem an der Vorgehensweise: Ich muss die Schritte Sammelmappe erzeugen und als html exportieren bei jeder Änderung neu vornehmen. Die Verarbeitung in Excel klappt dagegen.
Können Sie mir ein Angebot machen den Code entsprechend anzupassen?
Mfg
Rolf Klingel

Kommentar von Florian Rittmeier am 14.11.2007 um 20:09

Hallo Moritz, Hallo Wilhelm,

ihr benötigt den "Adobe Acrobat" auf eurem Computer. Der "Adobe Reader" egal in welcher Version, reicht NICHT aus!

Gruß Florian

Kommentar von klaus am 14.11.2007 um 11:31

Hallo

ich habe das gleiche Problem wie Wilhelm.
Ich habe allerdings nur den Acrobat Reader 8.0, hab schon gehört das es da Lizenzprobleme geben soll.
Stimmt das???
Wenn ja, was für Möglichkeiten gibt es diese zu beheben?

Gruß
Moritz

Kommentar von Wilhelm am 02.08.2007 um 12:28

Hallo !

Als Verweis kann ich nur "Adobe Acrobat 7.0 Type Library" hinzufügen.
Bei Zeile
Set PDDoc = CreateObject("AcroExch.pdDoc")
erhalte ich die Fehlermeldung
"Objekterstellung durch ActiveX-Komponente nicht möglich"

Kommentar von Florian Rittmeier am 11.07.2007 um 20:10

Hallo Manfred,

was genau funktioniert denn nicht? Ich habe vor kurzem noch auf Basis dieses Tipps mit VB.NET einen PDF-Extrahierer geschrieben, der mit vielen u.A. auch sehr großen PDFs zurecht kam und dabei wurde der aktuelle Adobe Acrobat Standard verwendet, frag mich nicht nach der Version, aber aber aktuell.

Einzig aufgefallen ist mir, das CreatePageHilite bei leeren Seiten auch Nothing zurück geben kann.

Beschreib bitte mal dein Problem genauer bzw. wende Dich mal direkt per E-Mail an mich unter <florian@activevb.de>, ich werde dann demnächst eine Korrektur für den Tipp erarbeiten.

Gruß Florian

Kommentar von Manfred Wolf am 11.07.2007 um 17:17

Hallo,
das funktioniert leider ab Adobe Reader 6 nicht mehr. Es gibt zwar mehrere Hinweise in anderen Foren, dass das so ist, aber eine Lösung habe ich noch nicht gefunden.
Wäre für mich wichtig!
Danke

Kommentar von Thomas Plendl am 10.03.2006 um 20:14

Diesen Beitrag finde ich wirklch sehr gut.
Leider konnte ich nicht herausfinden wie ich mit Feldern in Acrobat arbeiten kann. Ich würde gerne ein Acorbat Dokument verwenden und in diese Formular Felder einfügen, die dann dynamisch gefüllt oder ausgelesen werden können.
Leider ist mir der Zugriff auf die Felder noch nicht gelungen. Es währe einfach super, wenn ich hier einen Tip bekommen könnte.

Kommentar von Florian Rittmeier am 05.01.2006 um 15:11

Hallo Diana,

bitte stell deine Frage mitsamt des aktuell von Dir verwendeten Quellcodes im VB5/6-Forum. Dort lässt sich besser diskutieren.

Gruß Florian

Kommentar von Diana am 05.01.2006 um 14:31

Hallo,

zur Zeit liest das Programm nur die PDF- Files, die im selben Verzeichnis liegen. Ich möchte allerdings auch auf Pdf- Files zugreifen, die woanders abgelegt sind. Leider funktioniert das nicht, wenn man einfach den Pfad und die Datei angibt. Es erscheint die Fehlermeldung, dass die Datei nicht gefunden wurden ist. Wie kann ich dem Programm sagen, dass er auf den Pfad zugreifen soll, den ich Ihm sage?

Danke für die Hilfe im Voraus :)

Diana

Kommentar von Didi am 12.12.2005 um 16:27

Problem gelöst.Es hat sich sozusagen erledigt.

Kommentar von Didi am 12.12.2005 um 15:24

der Code funktioniert prima.
ich benötige jedoch nur einen kleinen Tipp, wie ich Daten solange auslesen kann bis ein Zeilenumbruch im pdf- Dokument erfolgt. Also die ToLast Methode so umformen, dass der Text nicht bis zum ende ausgelesen wird, sondern nur bis ein Zeilennumbruch kommt. Leider weiß ich nicht so genau, wie der entsprechende Befehl lauten muss bzw. wie ich vorgehen kann. Kennt jemand eine Lösung?

Kommentar von Florian Rittmeier am 10.12.2005 um 22:01

Hallo Willy,

die entsprechende Bibliothek ist nur vorhanden, wenn Du den Adobe Acrobat kaufst. Und der kostet nicht nur 20€.

Gruß Florian

Kommentar von Winkelmann Willy am 10.12.2005 um 19:02

Sehr geehrte Herren,

leider kann ich die 'Adobe Acrobat 5.0 Type Library' nicht ausfindig machen.
Ich bin sehr an ihrem Projekt interessiert.
Wäre es möglich mir zu sagen wo ich diese DLL ausfindig machen kann auf der Adobe-Seite.

MFG,

W. WINKELMANN

Kommentar von Stefan Schulte am 27.07.2005 um 11:10

Hallo!

Leider bietet der AR6/7 kein OCX mehr zur Anzeige (es funktioniert jedenfalls nicht mehr mit dem 7). Gibt es Alternativen (außer den AR5.1 zusätzlich zu installieren)?

MfG

Stefan Schulte

Kommentar von Florian Rittmeier am 20.01.2005 um 18:34

Hallo Robin,

der FAQ-Artikel http://www.activevb.de/rubriken/faq/pdf-view.html sollte deine Frage beantworten.

Gruß Florian

Kommentar von Robin Geyer am 19.01.2005 um 14:38

Guten Tag,
Wie kann ich eine PDF Datei aus dem VB heraus öffnen und Anzeigen lassen?
Liebe Grüße

Kommentar von Michael Niemand am 14.11.2004 um 22:31

Kann man das so oder ähnlich auch mit Access-VBA nutzen?

Kommentar von Delphaner am 18.06.2004 um 09:34

Ich muss sagen, das Beispiel hilft mir sehr viel weiter, nach einigen kläglich gescheiterten Versuchen die SDK von Adobe aufzutreiben fand ich diesen Beitrag.
Ich Programmiere zwar in Delphi aber trotzdem, die Aufrufe sind im prinzip nur durchgeschleift.

Vielen Herzlichen Dank und auf eine Gute zusammenarbeit... :-)

Kommentar von Florian Rittmeier am 21.04.2004 um 16:22

Hallo Max,

was genau meist Du mit "Vollversion von Acrobat"?
Damit dieser Tipp funktioniert benötigst Du Adobe Acrobat. Der Adobe Acrobat Reader reicht nicht aus.

Gruß Florian

Kommentar von Max am 21.04.2004 um 09:29

Also, ich bin aus dem nicht schlau geworden.
Braucht man oder braucht man nicht die Vollversion von Acrobat?

Kommentar von Ruru am 16.12.2003 um 20:07

Drucken kann man wenn der Regkeyeintrag:
HKEY_CLASSES_ROOT\AcroExch.Document\shell\printto\command
ausgelesen und mit variablen gefüllt wird

Kommentar von Florian Rittmeier am 04.12.2003 um 22:35

Hallo Roya,

stell die Frage doch im ganz normalen VB5/6-Forum. Dort passt sie besser hin, also zu diesem Tipp.

Ansonsten schau Dir mal das OCX an, das in http://www.activevb.de/rubriken/faq/pdf-view.html beschrieben ist.

Gruß Florian

Kommentar von Roya Soltan am 04.12.2003 um 13:21

Dieses Beispiel hat mir Überblick geschafft. Frage : wie kann ich eine erstellte PDF Datei ausdrucken??

für eine Feedback werde ich dankbar.
Roya Soltan

Kommentar von Ruru am 03.08.2003 um 19:53

Hi all,

da immer wieder Anfragen an mich gesendet werden, und da ich leider seit über einemJahr wegen Arbeitsplatzwechsel nichts mehr mit Adobe zu tuen habe, muss ich euch leider vertrösten. Vielleicht macht jemand anderes mal eine ausgearbeitete Version vom ganzen. Sorry, kann euch nicht mehr sagen als auf dieser Seite steht.

Grüße Ruru

Kommentar von Ednax am 28.07.2003 um 13:28

Hi,

wie dem Sourcecode auch bei

'Verweis : Adobe Acrobat 5.0 Type Library

zu entnehmen ist.

Darum geht es ja. Bei dem SDK (welches man bei Adobe kostenlos in der Version 5.0 laden kann) ist diese Type Libary ja dabei, jedoch funktioniert dieses Beispiel damit nicht. Ich vermute also, dass man zwingend den Adobe Acrobat benötigt und nicht nur das SDK, von welchem ein Link direkt unter der Zeile die du Zitierst steht.

mfG
Ednax

Kommentar von Florian Rittmeier am 28.07.2003 um 13:02

Hallo ednax!
Das ganze läuft nur mit dem Adobe Acrobat,
wie dem Sourcecode auch bei

'Verweis : Adobe Acrobat 5.0 Type Library

zu entnehmen ist.

Gruß Florian

Kommentar von ednax am 24.07.2003 um 16:25

Hi,

kann es sein, dass das ganze nur funktioniert, wenn man den Adobe Acrobat (nicht Acrobat Reader) installiert hat?

Ich habe nämlich nur den Reader und die Library, aber es geht nicht. Ich bekomme auch folgenden Fehler bei

Set PDDoc = CreateObject("AcroExch.pdDoc")

Die Fehlermeldung lautet:
Laufzeitfehler '429'
Objekterstellung durch ActiveX-Komponente nicht möglich.

cu
Ednax

Kommentar von cXn am 22.04.2003 um 14:52

An die Lib kommt ihr, indem ihr Adobe Acrobat installiert!

Kommentar von Matze am 17.02.2003 um 15:20

Hi!
Ich habe das ganze in VB.NET programmiert auf einem etwas anderen Weg und habe nun folgendes Problem:
Es tritt bei einem anderen Rechner eine Invalid Cast Exception auf wenn ich das Objekt PDDoc mittels CreateObject("AcroExch.PDDoc") instanzieren will. Weiß einer von euch die genaue Ursache und eventuell einen Ausweg? Ich tippe darauf das man den CreateObject Befehl nur auf registrierte Komponenten anwenden kann ?! Allerdings sollte mein Programm schon überall laufen und den Text aus den PDFs holen können...

Kommentar von Ruru am 10.02.2003 um 12:23

Menno, stellt euch doch nicht so an. Die Library wurde oben angegeben, warum liestr ihr euch das Teil nicht genauer durch? Habe extra die Zeilen hingeschrieben damit ihr auch alles gut nachvollziehen könnt. Naja, egal, nochmal der Link:
http://partners.adobe.com/asn/developer/sdks.html

Kommentar von Sina am 22.01.2003 um 13:50

Hallo,
bei mir fliegt das Programm nach Drücken des Start-Buttons an dieser Stelle raus:

Set PDDoc = CreateObject("AcroExch.pdDoc")

Die Fehlermeldung lautet:
Laufzeitfehler '429'
Objekterstellung durch ActiveX-Komponente nicht möglich.

PDF-Files kann ich aber ganz normal anschauen. An der Registrierung ganz doch dann nicht liegen.

Weiss jemand einen Rat?

Gruss
Sina

Kommentar von Martin am 16.12.2002 um 09:36

Die Lib gibt es unter der im Quelltext angegebenen URL in der Datei acro5sdkr4.zip. Aber: bei mir läuft dieses Programm nicht; Fehler: Obj. unterstützt Methode nicht in Zeile
Set PDPage = PDDoc.AcquirePage(0)
Wer weiß weiter?

Kommentar von Christian Eckler am 11.12.2002 um 08:40

Auch ich würde gerne Wissen wie man an die Lib kommt.

Kommentar von Klaus Mucke am 06.12.2002 um 18:34

Funktioniert ! Bringt mich aber nicht wirklich weiter... Hat jemand eine Idee, wie man PDF-Formulare ausfüllt ? ... per Code natürlich ;-)

Kommentar von Horst am 03.11.2002 um 21:22

Wie komme ich an die "Adobe Acrobat 5.0 Type Library"?