Delphi提取PDF文本實(shí)例
生成PDF的控件很多,但解析的不是太多,pdf Toolkit可以,但測(cè)試的第一個(gè)復(fù)雜的pdf就報(bào)告錯(cuò)誤,并且漢字亂碼,可能使用的版本或使用方法不對(duì)。
想起之前使用java調(diào)用的Apache名下的pdfBox庫(kù)很好用,于是就用下載了pdfBox,使用Delphi來(lái)調(diào)用pdfBox解析pdf文本。
環(huán)境要求:java運(yùn)行環(huán)境
pdfBox應(yīng)用包:pdfbox-app-2.0.6.jar
這里使用了DOS命令行來(lái)解析,然后調(diào)用解析結(jié)果。
首先是執(zhí)行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); //設(shè)置允許繼承,否則在NT和2000下無(wú)法取得輸出結(jié)果 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; //使用指定的句柄作為標(biāo)準(zhǔn)輸入輸出的文件句柄,使用指定的顯示方式 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;
然后調(diào)用顯示:
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文本實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Delphi 用DLL實(shí)現(xiàn)插件的簡(jiǎn)單實(shí)例
- Delphi 根據(jù)字符串找到函數(shù)并執(zhí)行的實(shí)例
- Delphi 中內(nèi)存映射對(duì)于大文件的使用
- Delphi XE5 為Android應(yīng)用制作簽名的方法(圖文)
- ListView 百分比進(jìn)度條(delphi版)
- Delphi實(shí)現(xiàn)截屏存盤(pán)的方法
- Delphi實(shí)現(xiàn)窗體感知鼠標(biāo)滑過(guò)并自動(dòng)隱藏與顯示窗口的方法
- Delphi 實(shí)現(xiàn)軟件自動(dòng)升級(jí)的功能
相關(guān)文章
Delphi用TActionList實(shí)現(xiàn)下載文件的方法
這篇文章主要介紹了Delphi用TActionList實(shí)現(xiàn)下載文件的方法,需要的朋友可以參考下2014-07-07Delphi使用OpenGL2d繪圖之畫(huà)圖片Bmp的方法
這篇文章主要介紹了Delphi使用OpenGL2d繪圖之畫(huà)圖片Bmp的方法,需要的朋友可以參考下2014-07-07Delphi實(shí)現(xiàn)檢測(cè)并枚舉系統(tǒng)安裝的打印機(jī)的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)檢測(cè)并枚舉系統(tǒng)安裝的打印機(jī)的方法,需要的朋友可以參考下2014-07-07Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解
CountDownLatch和CyclicBarrier是Java并發(fā)包提供的兩個(gè)非常易用的線程同步工具類(lèi),本文主要介紹了Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11為什么繼續(xù)選擇DELPHI(即將逝去的Delphi前景在何方)
已經(jīng)鉆DELPHI很深了,當(dāng)然現(xiàn)在DELPHI是過(guò)了最輝煌的時(shí)代。但為什么要繼續(xù)下去,而不轉(zhuǎn)向其它的?這是不是死腦筋2018-02-02