胖牛看个球 發表於 2017-6-10 13:12:38

Delphi提取PDF文本实例

<p>生成PDF的控件很多,但解析的不是太多,pdf Toolkit可以,但测试的第一个复杂的pdf就报告错误,并且汉字乱码,可能使用的版本或使用方法不对。</p>
<p>想起之前使用java调用的Apache名下的pdfBox库很好用,于是就用下载了pdfBox,使用Delphi来调用pdfBox解析pdf文本。</p>
<p><strong>环境要求:java运行环境</strong></p>
<p><strong>pdfBox应用包:pdfbox-app-2.0.6.jar</strong></p>
<p>这里使用了DOS命令行来解析,然后调用解析结果。</p>
<p><span style="background-color: #ccffcc"><strong>首先是执行DOS命令:</strong></span></p>
<div class="jb51code">
<pre class="brush:xhtml;">
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 &gt; 0 then
begin
sRet := TStringList.Create;
sRet.LoadFromStream(inS);
Result := sRet.Text;
sRet.Free;
end;
inS.Free;

CloseHandle(HRead);
CloseHandle(HWrite);
end;</pre>
</div>
<p>然后调用显示:</p>
<div class="jb51code">
<pre class="brush:xhtml;">
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;</pre>
</div>
<p>OK,大功告成!</p>
<p>以上这篇Delphi提取PDF文本实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Delphi 用DLL实现插件的简单实例</li><li>Delphi 根据字符串找到函数并执行的实例</li><li>Delphi 中内存映射对于大文件的使用</li><li>Delphi XE5 为Android应用制作签名的方法(图文)</li><li>ListView 百分比进度条(delphi版)</li><li>Delphi实现截屏存盘的方法</li><li>Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法</li><li>Delphi 实现软件自动升级的功能</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Delphi提取PDF文本实例