zoukankan      html  css  js  c++  java
  • 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+'PDFBoxpdfbox-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,大功告成!

  • 相关阅读:
    老男孩Python全栈开发(92天全)视频教程 自学笔记08
    datagrid---columns列
    easyui---datagrid
    easyui---layout实战
    easyui---layout布局
    easyui---表单验证
    easyui---form表单_validatebox验证框
    easyui---easyloader.js
    easyui---基础组件:dialog
    easyui---基础组件:window
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/6970226.html
Copyright © 2011-2022 走看看