首页 > 代码库 > Delphi提取PDF文本

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

Delphi提取PDF文本