Riconoscimento programmatico del testo dalle scansioni in un file PDF [chiuso]
Domanda
Ho un file PDF, che contiene i dati che dobbiamo importare in un database. I file sembrano essere scansioni pdf di testo alfanumerico stampato. Sembra 10 pt. Times New Roman.
Esistono strumenti o componenti che possono permettermi di riconoscere e analizzare questo testo?
Soluzione
Ho usato pdftohtml per rimuovere correttamente le tabelle dal PDF in CSV. È basato su Xpdf , che è uno strumento più generico, che include pdftotext . L'ho appena racchiuso in una Process.Start chiamata da C #.
Se stai cercando qualcosa di un po 'più fai-da-te, c'è la iTextSharp - una porta di Java iText - e PDFBox (sì, dice Java - ma hanno una versione .NET tramite IKVM.NET ). Ecco alcuni articoli di CodeProject sull'uso di iTextSharp e PDFBox da C #.
E, se sei davvero un masochista, puoi chiamare PDF IFilter con interoperabilità COM. Le Specifiche IFilter sono piuttosto semplici, ma immagino che l'interoperabilità ambientale sarebbe significativo.
Modifica: dopo aver riletto la domanda e le successive risposte, diventa chiaro che l'OP ha a che fare con immagini nel suo PDF. In tal caso, dovrai estrarre le immagini (le librerie PDF sopra sono in grado di farlo abbastanza facilmente) ed eseguirle attraverso un motore OCR.
Ho usato MODI in modo interattivo prima, con risultati decenti. È COM, quindi chiamarlo da C # tramite interop è anche fattibile e piuttosto semplice :
' lifted from http://en.wikipedia.org/wiki/Microsoft_Office_Document_Imaging
Dim inputFile As String = "C:\test\multipage.tif"
Dim strRecText As String = ""
Dim Doc1 As MODI.Document
Doc1 = New MODI.Document
Doc1.Create(inputFile)
Doc1.OCR() ' this will ocr all pages of a multi-page tiff file
Doc1.Save() ' this will save the deskewed reoriented images, and the OCR text, back to the inputFile
For imageCounter As Integer = 0 To (Doc1.Images.Count - 1) ' work your way through each page of results
strRecText &= Doc1.Images(imageCounter).Layout.Text ' this puts the ocr results into a string
Next
File.AppendAllText("C:\test\testmodi.txt", strRecText) ' write the OCR file out to disk
Doc1.Close() ' clean up
Doc1 = Nothing
Altri come Tesseract , ma ne ho un'esperienza diretta. Ho sentito cose sia positive che negative, quindi immagino che dipenda molto dalla qualità della tua fonte.
Altri suggerimenti
Non è possibile estrarre il testo acquisito da un PDF. È necessario il software OCR. La buona notizia è che ci sono alcune applicazioni open source che puoi provare e il percorso OCR sarà molto più facile rispetto all'utilizzo di una libreria PDF per estrarre il testo. Dai un'occhiata a Tesseract e GOCR.
Ho pubblicato informazioni sull'analisi dei pdf in uno dei miei blog. Premi questo link:
Modifica: il collegamento non funziona più a lungo. Di seguito citato da http://web.archive.org/web/20130507084207/http://devpinoy.org /blogs/marl/archive/2008/03/04/pdf-to-text-using-open-source-library-pdfbox-another-sample-for-grade-1-pupils.aspx
Bene, quanto segue si basa su esempi popolari disponibili sul web. Quello che fa è "leggere". il file pdf e l'output come testo nel file controllo casella di testo RTF nel modulo. La libreria PDFBox per .NET può essere scaricato da sourceforge.
Devi aggiungere un riferimento a IKVM.GNU.Classpath & amp; PDFBox-0.7.3. E inoltre, è necessario aggiungere FontBox-0.1.0-dev.dll e PDFBox-0.7.3.dll la cartella bin dell'applicazione. Per qualche motivo non ricordo (forse viene da uno dei tutorial), ho anche aggiunto al cestino IKVM.GNU.Classpath.dll.
Nella nota a margine, ho appena ricevuto la mia copia di " Head First C # " (su Keith's suggerimento) da Amazon. Il libro è fantastico! È davvero scritto per principianti. Questa edizione copre VS2008 e il framework 3.5.
Ecco qua ...
/* Marlon Ribunal
* Convert PDF To Text
* *******************/
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Printing;
using System.IO;
using System.Text;
using System.ComponentModel.Design;
using System.ComponentModel;
using org.pdfbox.pdmodel;
using org.pdfbox.util;
namespace MarlonRibunal.iPdfToText
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
void Button1Click(object sender, EventArgs e)
{
PDDocument doc = PDDocument.load("C:\\pdftoText\\myPdfTest.pdf");
PDFTextStripper stripper = new PDFTextStripper();
richTextBox1.Text=(stripper.getText(doc));
}
}
}
In un'azienda per cui lavoravo, abbiamo usato il toolkit ActivePDF con un certo successo:
http://www.activepdf.com/products/serverproducts/toolkit /index.cfm
Penso che avresti bisogno almeno della versione Standard o Pro ma hanno delle prove in modo da poter vedere se farà quello che vuoi.
Una rapida ricerca su Google mostra questo risultato promettente. http://www.pdftron.com/net/index.html
Puoi usare un modulo come PDF di perl il testo. E usa un altro strumento per importare le informazioni pertinenti nel database.
Sono sicuro che ci sono componenti PDF per .NET, ma non ne ho provato nessuno, quindi non so cosa sia buono.
Se il PDF è una scansione del testo stampato, sarà difficile (coinvolge l'elaborazione delle immagini, il riconoscimento dei caratteri ecc.) farlo da soli. Il PDF generalmente memorizzerà i documenti scansionati come JPEG internamente. È meglio utilizzare uno strumento di terze parti (strumento OCR) che esegua ciò.
Di recente ho trovato ReportLab per Python.
Se ho capito bene, sheebz sta chiedendo come estrarre i campi PDF e caricare i dati in un database. Hai visto iTextSharp? - http://sourceforge.net/projects/itextsharp/
Sulla base della risposta di Mark Brackett, ho creato un pacchetto Nuget per avvolgere pdftotext .
È open source , destinato a .net standard 1.6 e .net framework 4.5 .
Utilizzo:
using XpdfNet;
var pdfHelper = new XpdfHelper();
string content = pdfHelper.ToText("./pathToFile.pdf");