Delphi提取PDF文本实例
作者:BrightSoul
时间:2026-06-29
浏览:0
针对当前PDF解析工具稀缺且易出错的现状,本文提出一种利用Delphi语言封装ApachePDFBox开源库的解决方案,通过命令行调用其ExtractText功能,有效实现PDF文档的文本提取。该方法需要Java运行环境以及pdfbox-app-2.0.6.jar包支持,运行稳定可靠,并且能够正确处理中文内容,具有实用性。
市面上能生成 PDF 的控件不少,但真正好用的解析工具可不多。之前试过 pdf Toolkit,结果第一个稍微复杂点的 PDF 就报错,汉字还乱码——可能是版本或用法不对,但折腾下去实在不划算。

于是想起以前用 Ja va 时调过 Apache 的 pdfBox 库,效果很不错。索性下载一份,用 Delphi 来封装调用,把 PDF 文本解析出来。
环境要求:Ja va 运行环境
pdfBox 应用包:pdfbox-app-2.0.6.jar
思路很简单:通过命令行调用 pdfBox 的提取功能,再在 Delphi 里捕获结果。
首先,封装一个执行 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;
然后,封装一个专门解析 PDF 文本的函数,把命令拼好,调用上面那个函数:
function TfrmPDFTool.GetPDFText(sFile: string): string; var cmd:string; pdfFilePath,pdfFileName,txtFileName:String; begin //ja va -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:='ja va -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,大功告成!
作者最新文章
索尼 Xperia 1 VIII / VII / VI 等手机获 Android 17 更新,新增桌面模式等功能
2026-09-08 16:44
加拿大留学监护声明书(IMM 5646)双页签署与公证核对指南
2026-09-03 15:02
在线PDF转图片教程:一键生成高清图片包
2026-09-03 12:04
Creo零基础入门:新建零件与第一次拉伸建模完整指南
2026-09-03 06:02
扫描件PDF转Word的在线操作步骤与编辑可行性判断
2026-09-02 18:39
上一篇:
Delphi实现截屏存盘的方法
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































