這是一個有趣的問題。如果您願意在.NET中使用Windows,那麼可以使用dotImage(免責聲明,我爲Atalasoft工作並編寫大部分OCR引擎代碼)執行此操作。讓我們來分析這個問題分解成塊 - 首先是遍歷所有的PDF文件:
此獲取結束.pdf和所有文件的列表,如果該文件是一個有效的PDF,調用一個程序來處理它:
public void ProcessPdf(string path, Stream stm)
{
using (Document doc = new Document(stm)) {
int i=0;
foreach (Page p in doc.Pages) {
if (p.SingleImageOnly) {
ProcessWithOcr(path, stm, i);
}
else {
ProcessWithTextExtract(path, stm, i);
}
i++;
}
}
}
這將打開該文件作爲一個Document對象,詢問是否每一頁的圖像而已。如果是這樣,將OCR的頁面,否則將文本中提取:
public void ProcessWithOcr(string path, Stream pdfStm, int page)
{
using (Stream textStream = GetTextStream(path, page)) {
PdfDecoder decoder = new PdfDecoder();
using (AtalaImage image = decoder.Read(pdfStm, page)) {
ImageCollection coll = new ImageCollection();
coll.Add(image);
ImageCollectionImageSource source = new ImageCollectionImageSource(coll);
OcrEngine engine = GetOcrEngine();
engine.Initialize();
engine.Translate(source, "text/plain", textStream);
engine.Shutdown();
}
}
}
這樣做是柵格化PDF頁面轉換爲圖像,並把它變成一個形式,是可口的engine.Translate。這並不是嚴格按照這種方式完成的 - 人們可以通過調用Recognize來從AtalaImage的引擎中獲取OcrPage對象,但是這將取決於客戶端代碼在結構上循環並寫出文本。
您會注意到我遺漏了GetOcrEngine() - 我們爲客戶端提供了4種OCR引擎:Tesseract,GlyphReader,RecoStar和Iris。你會選擇一個最適合你需求的。
最後,你需要的代碼,以從已經對他們有非常好的文本的網頁中提取文本:
public void ProcessWithTextExtract(string path, Stream pdfStream, int page)
{
using (Stream textStream = GetTextStream(path, page)) {
StreamWriter writer = new StreamWriter(textStream);
using (PdfTextDocument doc = new PdfTextDocument(pdfStream)) {
PdfTextPage page = doc.GetPage(i);
writer.Write(page.GetText(0, page.CharCount));
}
}
}
這提取從給定的頁面中的文本,並將其寫入到輸出流。
最後,你需要GetTextStream():
public Stream GetTextStream(string sourcePath, int pageNo)
{
string dir = Path.GetDirectoryName(sourcePath);
string fname = Path.GetFileNameWithoutExtension(sourcePath);
string finalPath = Path.Combine(dir, String.Format("{0}p{1}.txt", fname, pageNo));
return new FileStream(finalPath, FileMode.Create);
}
這會不會是一個100%的解決方案?不,當然不是。你可以想象PDF頁面包含一個帶有框的單個圖像 - 這顯然會使圖像僅測試失敗,但不會返回有用的文本。也許,更好的方法是隻使用提取的文本,如果不返回任何內容,請嘗試使用OCR引擎。從一種方法轉變到另一種方法是寫一個不同的謂詞的問題。