Delphi提取PDF文本实例

所属分类: 软件编程 / Delphi 阅读数: 172
收藏 0 赞 0 分享

生成PDF的控件很多,但解析的不是太多,pdf Toolkit可以,但测试的第一个复杂的pdf就报告错误,并且汉字乱码,可能使用的版本或使用方法不对。

想起之前使用java调用的Apache名下的pdfBox库很好用,于是就用下载了pdfBox,使用Delphi来调用pdfBox解析pdf文本。

环境要求:java运行环境

pdfBox应用包:pdfbox-app-2.0.6.jar

这里使用了DOS命令行来解析,然后调用解析结果。

首先是执行DOS命令:

procedure CheckResult(b: Boolean);
begin
 if not b then
  raise Exception.Create(SysErrorMessage(GetLastError));
end;

function RunDOS(const CommandLine: string): string;
var
 HRead, HWrite: THandle;
 StartInfo: TStartupInfo;
 ProceInfo: TProcessInformation;
 b: Boolean;
 sa: TSecurityAttributes;
 inS: THandleStream;
 sRet: TStrings;
begin
 Result := '';
 FillChar(sa, sizeof(sa), 0);
//设置允许继承,否则在NT和2000下无法取得输出结果
 sa.nLength := sizeof(sa);
 sa.bInheritHandle := True;
 sa.lpSecurityDescriptor := nil;
 b := CreatePipe(HRead, HWrite, @sa, 0);
 CheckResult(b);

 FillChar(StartInfo, SizeOf(StartInfo), 0);
 StartInfo.cb := SizeOf(StartInfo);
 StartInfo.wShowWindow := SW_HIDE;
//使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式
 StartInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
 StartInfo.hStdError := HWrite;
 StartInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); //HRead;
 StartInfo.hStdOutput := HWrite;

 b := CreateProcess(nil, //lpApplicationName: PChar
  PChar(CommandLine), //lpCommandLine: PChar
  nil, //lpProcessAttributes: PSecurityAttributes
  nil, //lpThreadAttributes: PSecurityAttributes
  True, //bInheritHandles: BOOL
  CREATE_NEW_CONSOLE,
  nil,
  nil,
  StartInfo,
  ProceInfo);

 CheckResult(b);
 WaitForSingleObject(ProceInfo.hProcess, INFINITE);

 inS := THandleStream.Create(HRead);
 if inS.Size > 0 then
 begin
  sRet := TStringList.Create;
  sRet.LoadFromStream(inS);
  Result := sRet.Text;
  sRet.Free;
 end;
 inS.Free;

 CloseHandle(HRead);
 CloseHandle(HWrite);
end;

然后调用显示:

function TfrmPDFTool.GetPDFText(sFile: string): string;
var
 cmd:string;
 pdfFilePath,pdfFileName,txtFileName:String;
begin
 //java -jar pdfbox-app-2.0.6.jar ExtractText -encoding utf-8 e:\\temp\\test.pdf e:\\temp\\testiii.txt
 pdfFilePath:=ExtractFilePath(sFile);
 pdfFileName:=ExtractFileName(sFile);
 txtFileName:=FAppPath+'Temp\'+pdfFileName+'.txt';
 cmd:='java -jar '+FAppPath+'PDFBox\pdfbox-app-2.0.6.jar ExtractText '
  +' -encoding utf-8 '+sFile
  +' '+txtFileName;

 AddLog(cmd);

 Result:=RunDOS(cmd);

 AddLog(Result);

 memTxtFile.Lines.LoadFromFile(txtFileName,TUTF8Encoding.Create);

 FPDFText:=memTxtFile.Text;

 AddLog(FPDFText);

end;

OK,大功告成!

以上这篇Delphi提取PDF文本实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Delphi实现毫秒级别的倒计时实例代码

这篇文章主要介绍了Delphi实现毫秒级别的倒计时实例代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi中对时间操作方法汇总

这篇文章主要介绍了Delphi中对时间操作方法汇总,可以对Delphi的时间操作有一个更加深入的了解,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现碰撞球体完整实例代码

这篇文章主要介绍了Delphi实现碰撞球体完整实例代码,通过该实例,读者可以完整的了解一个Delphi项目的创建过程,加深对Delphi运行原理的了解,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现读取系统时间与日期完整实例

这篇文章主要介绍了Delphi实现读取系统时间与日期完整实例,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi常用关键字用法详解

这篇文章主要介绍了Delphi常用关键字用法,包括了各个常用的关键字及其详细用法,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实例演示Rect、Bounds生成TRect的区别

这篇文章主要介绍了Delphi实例演示Rect、Bounds生成TRect的区别,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi之Pascal语言中的关键字及保留字汇总

这篇文章主要介绍了Delphi之Pascal语言中的关键字及保留字汇总,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现图片滚动切换的完整实例代码

这篇文章主要介绍了Delphi实现图片滚动切换的完整实例代码,通过本实例,读者可以进一步掌握Delphi控件及图形处理的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现图像文本旋转特效完整实例代码

这篇文章主要介绍了Delphi实现图像文本旋转特效完整实例代码,对于帮助读者进一步理解Delphi图形及文字特效的处理有一定的借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现限定软件使用时间的方法

这篇文章主要介绍了Delphi实现限定软件使用时间的方法,商业软件开发中非常实用的功能,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多