欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

pdf转中文txt

程序员文章站 2022-06-25 13:09:44
最近项目需要实现根据关键字搜索pdf内容,实现思路就是提取pdf文本,然后进行索引。 工具上选择: IText 4.16之后采用agpl License,不能用作商用,而且转换中文会有乱码问题, pdfsharp 采用MIT License,权限上没有问题,但是转换中文也会有乱码, 最后决定采用xp ......

最近项目需要实现根据关键字搜索pdf内容,实现思路就是提取pdf文本,然后进行索引。

工具上选择:

itext 4.16之后采用agpl license,不能用作商用,而且转换中文会有乱码问题,

pdfsharp 采用mit license,权限上没有问题,但是转换中文也会有乱码,

最后决定采用xpdf.

官网地址:

需要下载对应的xpdf包,本人采用的windows x64 版本

此外还要下载中文字符集包:

包准备工作如下:

  1. 在合适目录创建xpdf文件夹
  2. 将下载的包解压并将bin64文件夹下的pdftotext.exe 拷贝到xpdf文件夹下
  3. 解压中文字符集后进入文件夹继续解压xpdf-chinese-simplified.tar,在解压后的xpdf-chinese-simplified文件夹拷贝到xpdf下
  4. 在xpdf文件夹下创建xpdf的字符加载文件xpdfrc
  5. 打开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'

下面再附上工程目录:

pdf转中文txt