Delphi提取PDF文本实例

生成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,大功告成!

作者:jingxian

%s 个评论

要回复文章请先登录注册