最近项目需要实现根据关键字搜索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'
下面再附上工程目录: