none
Extract Text from PDF

    General discussion

  • Hi there!

    I know this question rather belongs to the Adobe Dev. Forum, but I will give it a try here:

    Anyone knows a way to extract text from a specific area of a page (defined by coordinates, not keywords) of a PDF file?

    I know there are lots of commercial dlls available, but they cost about $4000 for a distr. license.

    Thanks°!
    Wednesday, December 17, 2008 1:08 AM

All replies

  • Hi,

    This is probably not helpful or what your looking for, however...

    You could have a look at Poppler which is a Unix based toolset. The pdftotext executable
    from that allows you to grab specific pages from within a PDF file, although not from specific coordinates.

    I've managed to compile it under MS Interix (SFU) and on Cygwin more or less out of the box.

    It works really quickly and on every PDF version I've used it on.

    Hope this is some help.

    Regards,

    Bob.

    Thursday, December 18, 2008 2:08 AM
  • Thank you, I've found something too, but I didnt test it yet.

    I decided to work with XPS rather than PDF, actually simply because the DEV kits for XPS such as virtual print driver etc. are cheaper.

    Anyway, if anyone wants to try it out, maybe can also post his experiences with this bunch of code here from this site. They also have a forum on that site, but I think it's only in German language.

    I post it again here, because if this code really works, it should not be hidden somewhere on the web at all:

    '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 StringAs 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 --------------  
     


    Tuesday, December 23, 2008 8:24 PM
  • Note: this solution for PDF requires the Acrobat SDK.
    Thanks,
    Corey Furman
    Code Slabs
    ______________________________________________________
    Please mark posts as answer or helpful when they are.
    Tuesday, December 23, 2008 8:44 PM