Importare dati da Pdf a Excel

Ciao a tutti!!!

 

Avrei bisogno di importare dei dati da file pdf a Excel:

In una cartella sono presenti tutti i file pdf da leggere salvati nel formato: Scheda_1 , Scheda_2, Scheda_3 ............

 

Quello che vorrei fare è attivare una macro da Excel che mi legge iterativamente tutti i file pdf, li apre, e copia il contenuto su Excel dividendo opportunamente i dati per colonne. Ad es nel file pdf il titolo della scheda tecnica e la data sono presenti sulla stessa riga, la macro da realizzare dovrebbe importare su Excel i dati in due colonne distinte: Colonna titolo e colonna data. 

 

Per ogni file pdf vorrei avere una riga corrispondente nel file Excel con le varie suddivisioni in colonna.

 

Avevo già fatto una cosa simile prendendo i dati da word e fissando i riferimenti delle stringhe da copiare con l'ausilio dei segnalibri, purtroppo non saprei proprio come fare per leggerli da file pdf.

 

Grazie a tutti per un eventuale aiuto!!!

 

Ciao ciao

 

Informazioni domanda


Ultimo aggiornamento dicembre 1, 2018 Visualizzazioni 18.430 Si applica a:
Risposta

Il parametro -layout, per quanto possibile, ma nel caso del tuo pdf direi egregiamente, mantiene la formattazione originaria del documento e questo può risultare utile proprio nel caso di tabelle come la tua. Di fatto, il txt risultante è visivamente uguale al pdf originario, anche se le colonne non sono separate da tabulazione o altro carattere speciale, ma solamente da spazi.




Uhmmmm.... una per tutto, senza passare dai file .txt:

 

Public Sub mPdfToXlsx()

    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim myReturn As Double
    Dim sPath As String
    Dim sh As Worksheet
    Dim shNew As Worksheet
    Dim lRiga As Long
    Dim lCol As Long
    Dim lng As Long
    Dim lUltRiga As Long
    Dim wk As Workbook
   
    sPath = ThisWorkbook.Path & "\"
    Set objFSO = CreateObject( _
        "Scripting.FileSystemObject")
    Set objFolder = _
        objFSO.GetFolder(sPath)
   
    Application.ScreenUpdating = False
   
    For Each objFile In objFolder.Files
   
        If LCase(Right(objFile.Name, 3)) = "pdf" Then
       
            myReturn = Shell("C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\AcroRd32.exe " & sPath & objFile.Name, vbNormalFocus)
           
            Application.Wait (Now + TimeValue("0:00:02"))
            SendKeys "^a", True
            SendKeys "^c", True
            SendKeys "%F", True
            SendKeys "X", True
            Application.Wait (Now + TimeValue("0:00:02"))
           
            Set wk = Workbooks.Add()
            Set sh = wk.Worksheets("Foglio1")
            lRiga = 1
            sh.Range("A1").PasteSpecial
            lUltRiga = sh.Range("A" & sh.Rows.Count).End(xlUp).Row
            Set shNew = wk.Worksheets.Add
            shNew.Name = "FoglioCorretto"
            lng = 1
           
            For lRiga = 1 To lUltRiga
                For lCol = 1 To 3
                    shNew.Cells(lng, lCol).Value = sh.Cells(lRiga, 1).Value
                    If lCol < 3 Then
                        lRiga = lRiga + 1
                    End If
                Next
                lng = lng + 1
            Next
           
            Set sh = Nothing
            wk.SaveAs Filename:=sPath & Mid(objFile.Name, 1, Len(objFile.Name) - 3) _
                & "xlsx", FileFormat:=xlOpenXMLWorkbook
                wk.Close
            Set wk = Nothing
            Application.Wait (Now + TimeValue("0:00:02"))
           
        End If
       
        Set objFile = Nothing
       
    Next
   
    Application.ScreenUpdating = True
       
    Set objFile = Nothing
    Set objFolder = Nothing
    Set objFSO = Nothing

End Sub

 

Buttata giù senza fare molti test. Ovviamente si deve modificare il numero delle colonne interessate, 3 in questo caso specifico.

--
Mauro Gamberini
Microsoft© MVP (Excel)
http://www.maurogsc.eu

La risposta è risultata utile a 5 persone

·

Il problema è stato risolto?

Siamo spiacenti che questo non sia stato d'aiuto.

Fantastico! Grazie per aver scelto questa risposta.

Sei soddisfatto di questa risposta?

Grazie per il tuo commento, ci aiuta a migliorare il sito.

Sei soddisfatto di questa risposta?

Grazie per il tuo commento.

Risposta

Ciao Andrea,

 

Grazie per la risposta, purtroppo non ho Acrobat, ho solo Reader, ho già trovato un po' di codice che andrebbe bene solo se avessi Acrobat perché utilizza delle librerie proprie, tu sapresti come implementarlo senza l'utilizzo di Acrobat? 


Ciao,
ti do una traccia!

In primo luogo ti devi munire di un convertitore di formato da pdf a testo che funzioni anche da linea di comando, io ho utilizzato pdfToText, però non saprei indicarti il link dal quale scaricarlo. Comunque ce ne sono molti altri.

Ti allego un esempio di codice che converte un pdf in testo, utilizzando il convertitore indicato, eventualmente, con poche modifiche potrai adattarlo all'utilizzo con un altro strumento.

Infine, non rimane che estrarre i dati che ti servono, ma questo dipende dal contenuto.

Buon lavoro,
Andrea.

-----
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Function pdfAsText(sPdfFileName As String, _
                           Optional sOptions As String = vbNullString, _
                           Optional bRemoveFile As Boolean = True) As String
Dim sFolder As String, sTxtFile As String, sAppName As String
Dim sCmdExec As String, sText As String
Dim lTimeOut As Long

  pdfAsText = vbNullString
  '---------- initialize
  sFolder = ActiveWorkbook.Path & "\"
  sAppName = sFolder & "pdftotext.exe"
  If (LenB(Dir$(sPdfFileName)) > 0) Or (LenB(Dir$(sAppName)) > 0) Then
    sAppName = getFileName()
    If (LenB(sAppName) = 0) Then
      Call MsgBox("Sorry, but i can't find 'pdftotext.exe'", vbCritical, "PDF extract")
      Exit Function
    End If

  Else
    Err.Raise ERR_NUM, "pdfAsText", "TextFile or pdftoText.exe not found."
  End If

  '---------- convert pdf file to text one
  sOptions = " " & sOptions & " "
  sCmdExec = """""" & sAppName & """" & sOptions & """" & sPdfFileName & """"""
  Call Shell("cmd /c " & sCmdExec, vbMinimizedNoFocus)
  sTxtFile = Replace(sPdfFileName, ".pdf", ".txt")

  '---------- wait for text file max 5 seconds
  lTimeOut = GetTickCount() + 5000
  Do While (LenB(Dir(sTxtFile)) = 0) And (GetTickCount() < lTimeOut)
    Sleep 100
  Loop
  If (LenB(Dir$(sTxtFile)) = 0) Then Exit Function

  pdfAsText = fileRead(sTxtFile)

  '---------- delete the text file
  If bRemoveFile Then Kill sTxtFile
End Function

-----
Andrea

Il problema è stato risolto?

Siamo spiacenti che questo non sia stato d'aiuto.

Fantastico! Grazie per aver scelto questa risposta.

Sei soddisfatto di questa risposta?

Grazie per il tuo commento, ci aiuta a migliorare il sito.

Sei soddisfatto di questa risposta?

Grazie per il tuo commento.