Lettura File PDf

di il
8 risposte

Lettura File PDf

Ciao a tutti,

vi scrivo qua perchè dopo numerosi test, non sono riuscito a sviluppare il metodo che volevo. in pratica avrei bisogno di leggere all'interno di una fattura in pdf, questa fattura è chiaramente salvabile in formato testo, e quindi leggibile in formato testo.

io fin'ora ero riuscito a convertirla e anche a leggere la fattura una volta convertita, il problema è il seguente, sembra che la disposizione del testo sia cambiata, mi spiego meglio, se io lo salvo manualmente in pdf ho per esempio:

NumeroOrdine
8823432

se invece lo salvo tramite la mia macro ottengo il tutto in maniera sballata,
del tipo

NumeroOrdine
CodInco
Fornitore
8823432


e non riesco a risistemarlo per poterlo manipolare in maniera adeguata

    Private Function PDFToText(ByVal nfile As String) As String
        Dim testo As New System.Text.StringBuilder
        Dim reader As New PdfReader(nfile)
        For i As Integer = 1 To reader.NumberOfPages
            testo.AppendLine(PdfTextExtractor.GetTextFromPage(reader, i))
        Next
        Return testo.ToString

    End Function

e la richiamo da

Dim resPdf = PDFToText(pdfPath)
trarmite button.

avete idee?

8 Risposte

  • Re: Lettura File PDf

    Nel tuo quesito ci sono diversi lati poco chiari. Ad esempio,
    avrei bisogno di leggere all'interno di una fattura in pdf, questa fattura è chiaramente salvabile in formato testo, e quindi leggibile in formato testo.
    Se la fattura contiene informazioni che sono un testo, non vuol dire che può essere letta come tale una volta esportata, se il formato scelto è il PDF, poiché si sta passando da un "formato testo " a un "formato grafico", dove il testo può essere posizionato, formattato, incolonnato, ecc. e non è quindi detto che da questo si possa risalire alla fattura originale, a meno di non usare posizioni estremamente fisse per gli elementi della pagina e recuperando il testo relativo individuare esattamente la collocazione di determinati valori nelle righe di testo, ma è una pratica molto "error prone".
    se io lo salvo manualmente in pdf ho per esempio
    Cosa si intende per "salvare manualmente"?
    non riesco a risistemarlo per poterlo manipolare in maniera adeguata
    Come detto all'inizio, trattandosi di un formato di stampa, il recupero di testo dal PDF non è detto che avvenga sempre con le stesse modalità: ad esempio, se il testo viene diviso in pagine perché il numero di dettagli aumenta, potresti trovare dei numeri di pagina o delle ripetizioni tra le scatole se vai a recuperare in modo "brutale" il testo presente nelle pagine del documento.

    La posizione di tutti i valori può variare anche sensibilmente a seconda della presenza (o assenza) di determinati valori.

    Il formato PDF non è particolarmente adatto a memorizzare dati strutturali, poiché orientato alla stampa: trattandosi di una fattura, meglio usare uno standard più strutturato, come quello previsto dall'Agenzia delle Entrate per la Fattura Elettronica, ad esempio.

    Se le cose non sono chiare o centrate, rispondi aggiungendo qualche dettaglio.

    Ciao!
  • Re: Lettura File PDf

    Inanzi tutto ti ringrazio per la risposta e l'interessamento,

    -1 la posizione in termine grafico all'interno della fattuura è la medesima anche in caso di un calcolo superiore del numero di pagine.
    perchè è sull'intestazione della fattura stessa.

    esempio
    PARTITA IVA
    VAT NO.
    Job nr.
    12456654
    COD.FORNITORE
    SUPPLIER CODE
    RESA / DELIVERY TERMS

    questo incolonnamento perfetto però lo derivo salvando manualmente, il pdf in txt. Intendo aprendo a mano il pdf e poi facendo save as text, e mi rimane incolonnato perfettamente, mentre quando faccio pdf to text.
    PARTITA IVA COD FORNITORE RESA/DELIVERY TERMS
    FCA
    12456654

    sembra che sballi e che non mantenga i lformato.
  • Re: Lettura File PDf

    Quell'incolonnamento perfetto che ottieni è semplicemente una "feature avanzata" del programma che usi per leggere il documento, che non si limita a buttare fuori il testo all'interno del file così come viene, ma tenta di impaginarlo con qualche escamotage.

    Il metodo GetTextFromPage() semplicemente recupera il testo che viene indicato nelle istruzioni di stampa all'interno del PDF, cercando di indovinare quali righe vanno assieme guardando la Y (posizione verticale) delle stringhe.

    Nella libreria iText originale il metodo accetta anche diverse "strategy" possibili per estrarre il testo in modo diverso, ma (come indicato nella documentazione) sono implementazioni recenti e suscettibili di parecchie modifiche, e probabilmente non coincidono con il risultato che ottieni salvando il PDF come testo dal lettore che usi.
  • Re: Lettura File PDf

    >>>Intendo aprendo a mano il pdf e poi facendo save as text, e mi rimane incolonnato perfettamente
    non puoi utilizzare da riga di comando il software che usi per queste operazioni? ,potresti utilizzarlo programmaticamente con process,ciao
  • Re: Lettura File PDf

    gian82 ha scritto:


    >>>Intendo aprendo a mano il pdf e poi facendo save as text, e mi rimane incolonnato perfettamente
    non puoi utilizzare da riga di comando il software che usi per queste operazioni? ,potresti utilizzarlo programmaticamente con process,ciao
    Aspetta, mi spiego meglio. Se apri u nfile pdf con adobe reader, fai save as text, e lo salvi come testo, in questo modo la sua impaginazione rimane perfetta.
  • Re: Lettura File PDf

    Timer86 ha scritto:


    Aspetta, mi spiego meglio. Se apri u nfile pdf con adobe reader, fai save as text, e lo salvi come testo, in questo modo la sua impaginazione rimane perfetta.
    E' quello che ti dicevo io quando scrivevo questo:
    Quell'incolonnamento perfetto che ottieni è semplicemente una "feature avanzata" del programma che usi per leggere il documento, che non si limita a buttare fuori il testo all'interno del file così come viene, ma tenta di impaginarlo con qualche escamotage.

    Quella impaginazione non viene "gratis", ma è frutto di una particolare elaborazione del programma che stai usando.

    Ciò non significa che ogni libreria .NET in grado di manipolare PDF che abbia una esportazione in formato testo ti produca esattamente la stessa
    struttura: dipende da come l'esportazione è stata implementata dallo sviluppatore, con quale algoritmo, con quali opzioni, con quale cura, ecc.

    Ciao!
  • Re: Lettura File PDf

    Potresti provare con pdftotext.exe, mi sembra che sia gratis e anche lui riorganizza la struttura in modo da farla il più possibile come il PDF

    Se vuoi mandami un file PDF e ti estraggo il io il testo, vediamo cosa ne esce
  • Re: Lettura File PDf

    Ciao a tutti,

    col finire sono riuscito a fare quello che volevo fare rispettando il testo contenuto e soprattutto il suo incolonnamento.
    
     Dim ddtref As String
                Dim oReader As New iTextSharp.text.pdf.PdfReader("c:\Kochapp\Cache\trb_" & pdfCont & ".pdf")
                Dim sOut As StringBuilder = New StringBuilder()
                For i = 1 To oReader.NumberOfPages
                    Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy
                    Dim strLineText As String = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its)
                    strLineText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(strLineText)))
                    sOut.Append(strLineText)
                Next
                oReader.Close()
                MsgBox(sOut.ToString)
    
    questo giusto nel caso voglite poi usarlo..

    seconda cosa in cui mi sono imbattuto che non riesco per un discorso di esperiena a trovare una risposta al momento, all'interno di questo file di testo, che è un documento commerciale con molte informazioni stavo andando a ricercare un Campo.
    Nel File pdf appare = NUMERO / NO. e io devo prendere i numeri adiacenti a questo.

    il problema è che nella scritturar di codice, facendo sia string.contains che il compare tu, mi estrapola un testo dove ciò non è mai menzionato, dove non esiste mai il NO. O la frase completa NUMERO / NO.
    questo infatti è il continuo, qui con il compare
    
    
     If sOut.ToString().CompareTo("NO.") Then
                    Dim separe = sOut.ToString.Split("NO")
                    Dim newsep = separe(1)
                    MsgBox(newsep)
                End If
    
    qui con il contains.
    
                If sOut.ToString().Contains("NO.") Then
                    Dim separe = sOut.ToString.Split("NO")
                    Dim newsep = separe(1)
                    MsgBox(newsep)
                End If
    
    QUESTO è come è composta la riga che vorrei prelevare
    COD. CLIENTE / CUSTOMER AS1342 NUMERO / NO. / DATA / DATE PAG 1
    A 2928 21/08/2019
    prelevando appunto A 2928

    quello che mi restituisce è un campo dell'anagrafica ma senza ne NO. ne la frase completa che avevo provato come test,
    dove sbaglio?
Devi accedere o registrarti per scrivere nel forum
8 risposte