最近項目需要實現根據關鍵字搜索pdf內容,實現思路就是提取pdf文本,然後進行索引。 工具上選擇: IText 4.16之後採用agpl License,不能用作商用,而且轉換中文會有亂碼問題, pdfsharp 採用MIT License,許可權上沒有問題,但是轉換中文也會有亂碼, 最後決定採用xp ...
最近項目需要實現根據關鍵字搜索pdf內容,實現思路就是提取pdf文本,然後進行索引。
工具上選擇:
IText 4.16之後採用agpl License,不能用作商用,而且轉換中文會有亂碼問題,
pdfsharp 採用MIT License,許可權上沒有問題,但是轉換中文也會有亂碼,
最後決定採用xpdf.
官網地址:https://www.xpdfreader.com/download.html
需要下載對應的xpdf包,本人採用的windows x64 版本
此外還要下載中文字元集包:簡體中文字元集
包准備工作如下:
- 在合適目錄創建xpdf文件夾
- 將下載的包解壓並將bin64文件夾下的pdftotext.exe 拷貝到xpdf文件夾下
- 解壓中文字元集後進入文件夾繼續解壓xpdf-chinese-simplified.tar,在解壓後的xpdf-chinese-simplified文件夾拷貝到xpdf下
- 在xpdf文件夾下創建xpdf的字元載入文件xpdfrc
- 打開xpdf文件夾下的子文件chinese-simplified里的add-to-xpdfrc,將裡面內容copy到xpdfrc
將xpdf文件夾copy到項目合適位置實現功能,這裡只演示單個文件的轉換工作,本人是將xpdf訪問asp.mvc啟動工程的根目錄下進行測試的(文件路徑有空格一定要加雙引號)
1 public ActionResult Search(string keyword) 2 { 3 var rooPath = Server.MapPath("~/"); 4 ProcessStartInfo startInfo = new ProcessStartInfo 5 { 6 UseShellExecute = false, 7 WindowStyle = ProcessWindowStyle.Normal, 8 RedirectStandardInput = true, 9 RedirectStandardOutput = true, 10 RedirectStandardError = true, 11 CreateNoWindow = false, 12 WorkingDirectory = string.Format("{0}xpdf", rooPath), 13 //FileName = string.Format("{0}xpdf\\pdftotext.exe", rooPath) 14 FileName ="cmd.exe" 15 }; 16 //pdftotext.exe -layout -enc GBK 你不知道的JavaScript(下捲).pdf 17 var arguments = string.Format("/C pdftotext.exe -layout -enc GBK \"{1}\" \"{2}\"", rooPath, rooPath + @"xpdf\1.pdf", rooPath + @"xpdf\JavaScript.txt"); 18 //var arguments = string.Format(@"{0}1.pdf", rooPath); 19 startInfo.Arguments = arguments; 20 var ss = string.Empty; 21 22 using (Process process = Process.Start(startInfo)) 23 { 24 25 process.OutputDataReceived += new DataReceivedEventHandler((object sender, DataReceivedEventArgs e) => 26 { 27 ss += e.Data; 28 }); 29 process.BeginOutputReadLine(); 30 using (var error = process.StandardError) 31 { 32 ss += error.ReadToEnd(); 33 } 34 //等待退出 35 process.WaitForExit(); 36 } 37 38 return Json(ss, JsonRequestBehavior.AllowGet); 39 }
error 可能會有報字體的錯誤,但不影響轉換,可以忽略:
Syntax Error: Unknown character collection 'DYNA-HK1'
Syntax Error: Unknown character collection 'DYNA-HK1'
下麵再附上工程目錄: