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文本实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持lingkb。