Delphi - 使用 reader 应用程序没有默认路径的参数打开 PDF
Delphi - open PDF with parameters without a default path for the reader application
我在打开来自 Delphi 的 pdf 文件时遇到问题。
我需要用参数打开 pdf,因为我想为我的程序创建帮助手册。我尝试使用 shellExecute,但此函数需要 reader pdf.
的路径
procedure TForm3.Button2Click(Sender: TObject);
var e,s:String;
begin
s:='/A nameddest=somePlaceInPDF pathToMyFile.pdf';
e:='AcroRd32';
ShellExecute(handle,'open',pchar(e),pchar(s),nil,sw_show);
end;
程序运行,但对我来说不是解决方案。一些用户可以使用其他 pdf reader。您知道跳过添加 reader 路径的方法吗?
另一种方式是
if ShellExecute(handle,'open',pchar(e),pchar(s),nil,sw_show) < 32 then
begin
ShellExecute(0,0,'rundll32.exe','shell32.dll,OpenAs_RunDLL pathToMyFile.pdf',0,SW_SHOW);
end;
我想,我需要一些方法,从 pdf 中提取路径 reader。这是这个问题的最佳解决方案吗?
使用默认系统应用程序打开 PDF
ShellExecute(Handle, nil, 'pathToMyFile.pdf', nil, nil, SW_SHOW);
如果 lpOperation
是 nil
,则使用默认的 verb。
打开带有参数的 PDF 文件
在 Windows 上使用命令行参数打开 PDF 文件的方法是:
"C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe" /A "zoom=1000=OpenActions" "C:\Documents and Settings\winUser\Desktop\wss-v1.1-spec-errata-os-SOAPMessageSecurity.pdf"
以上打开 PDF 文件,缩放倍数为 x1000(确实不是很有用)。
要获得与 ShellExecute
相同的结果,请执行以下操作:
var
application, appParams, fileName,
shellParams: string;
begin
application := 'AcroRd32.exe';
appParams:= '/A "zoom=1000=OpenActions"';
fileName := 'C:\Documents and Settings\winUser\Desktop\wss-v1.1-spec-errata-os-SOAPMessageSecurity.pdf';
shellParams := Format('%s "%s"', [appParams, fileName]);
ShellExecute(Handle, nil, PChar(application), PChar(shellParams), nil, SW_SHOW);
end;
这里PDF Open Parameters供参考
最后(没有 try
)注意 PDF 打开参数 是特定于应用程序的,因此在最好的情况下,不同的 reader 可能会忽略它们;在最坏的情况下,应用程序将拒绝启动。
我建议仅在确保客户端上有正确的应用程序后才使用 open parameters;如果不行,就用第一种方法。
如果您希望将参数传递给可执行文件,那么您将忽略任何关联并需要特定可执行文件的存在。因为特定参数仅对一个特定的可执行文件有效。也就是说,Acrobat 的参数不会被 Foxit 理解,反之亦然。
在这种情况下,您应该使用 CreateProcess
调用它。要找到 Acrobat Reader 的可执行文件,请参考这个问题:How to get Adobe Reader full path(including executable file name)? 其他 PDF 程序也有类似的方法。
ShellExecute
的真正意义在于它了解文件关联的系统和用户首选项。 shell 知道应该使用哪个应用程序打开不同的文件类型,以及在哪里可以找到该应用程序。
一般来说,如果您知道可执行文件的位置,请使用 CreateProcess
。如果您知道文档的位置并希望系统找到可执行文件,请使用 ShellExecute(Ex)
。
因此,将 PDF 文件的完整路径传递给 ShellExecute
,让系统找到并打开关联的应用程序。
ShellExecute(0, 'open', PChar(PdfFileName), nil, nil, SW_SHOW);
如果您想要正确的错误处理,请使用 ShellExecuteEx
。您也可以将 'open'
替换为 nil
并让系统选择默认操作。
这是对我的问题的最佳回答
procedure TForm3.Button2Click(Sender: TObject);
var s, result:String;
path: array[0..250] of char
begin
s:='/A nameddest=somePlaceInPDF "pathToMyFile.pdf"';
FindExecutable('pathToMyFile.pdf',nil,path);
result := trim(StrPas(path));
ShellExecute(handle,nil,pchar(result),pchar(s),nil,sw_show);
end
pdf 文件可能与另一个程序关联,因此 "FindExecutable" 不是找到已安装的 Acrobat Reader 程序的可靠方法。
我使用注册表项:HKEY_CLASSES_ROOT\Software\Adobe\Acrobat\Exe
procedure TfrmFsYtd.btnPdfHelpTestClick(Sender: TObject);
var strAcro, strParam:string;
Registry: TRegistry;
begin
// Get the users' installed Adobe Reader from the registry >>
Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_CLASSES_ROOT;
Registry.OpenKey('Software\Adobe\Acrobat\Exe',False);
strAcro :=Registry.ReadString('');
Registry.Free;
// Use the installed Adobe Reader to open your pdf- help- file at a specific page >>
strParam := ' /A page=4 "'+ProgPath+'FsYtd_Manual.pdf"';
ShellExecute(Handle, 'open', PChar(strAcro), PChar(strParam),nil, SW_SHOWNORMAL);
end;
我在打开来自 Delphi 的 pdf 文件时遇到问题。 我需要用参数打开 pdf,因为我想为我的程序创建帮助手册。我尝试使用 shellExecute,但此函数需要 reader pdf.
的路径procedure TForm3.Button2Click(Sender: TObject);
var e,s:String;
begin
s:='/A nameddest=somePlaceInPDF pathToMyFile.pdf';
e:='AcroRd32';
ShellExecute(handle,'open',pchar(e),pchar(s),nil,sw_show);
end;
程序运行,但对我来说不是解决方案。一些用户可以使用其他 pdf reader。您知道跳过添加 reader 路径的方法吗?
另一种方式是
if ShellExecute(handle,'open',pchar(e),pchar(s),nil,sw_show) < 32 then
begin
ShellExecute(0,0,'rundll32.exe','shell32.dll,OpenAs_RunDLL pathToMyFile.pdf',0,SW_SHOW);
end;
我想,我需要一些方法,从 pdf 中提取路径 reader。这是这个问题的最佳解决方案吗?
使用默认系统应用程序打开 PDF
ShellExecute(Handle, nil, 'pathToMyFile.pdf', nil, nil, SW_SHOW);
如果 lpOperation
是 nil
,则使用默认的 verb。
打开带有参数的 PDF 文件
在 Windows 上使用命令行参数打开 PDF 文件的方法是:
"C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe" /A "zoom=1000=OpenActions" "C:\Documents and Settings\winUser\Desktop\wss-v1.1-spec-errata-os-SOAPMessageSecurity.pdf"
以上打开 PDF 文件,缩放倍数为 x1000(确实不是很有用)。
要获得与 ShellExecute
相同的结果,请执行以下操作:
var
application, appParams, fileName,
shellParams: string;
begin
application := 'AcroRd32.exe';
appParams:= '/A "zoom=1000=OpenActions"';
fileName := 'C:\Documents and Settings\winUser\Desktop\wss-v1.1-spec-errata-os-SOAPMessageSecurity.pdf';
shellParams := Format('%s "%s"', [appParams, fileName]);
ShellExecute(Handle, nil, PChar(application), PChar(shellParams), nil, SW_SHOW);
end;
这里PDF Open Parameters供参考
最后(没有 try
)注意 PDF 打开参数 是特定于应用程序的,因此在最好的情况下,不同的 reader 可能会忽略它们;在最坏的情况下,应用程序将拒绝启动。
我建议仅在确保客户端上有正确的应用程序后才使用 open parameters;如果不行,就用第一种方法。
如果您希望将参数传递给可执行文件,那么您将忽略任何关联并需要特定可执行文件的存在。因为特定参数仅对一个特定的可执行文件有效。也就是说,Acrobat 的参数不会被 Foxit 理解,反之亦然。
在这种情况下,您应该使用 CreateProcess
调用它。要找到 Acrobat Reader 的可执行文件,请参考这个问题:How to get Adobe Reader full path(including executable file name)? 其他 PDF 程序也有类似的方法。
ShellExecute
的真正意义在于它了解文件关联的系统和用户首选项。 shell 知道应该使用哪个应用程序打开不同的文件类型,以及在哪里可以找到该应用程序。
一般来说,如果您知道可执行文件的位置,请使用 CreateProcess
。如果您知道文档的位置并希望系统找到可执行文件,请使用 ShellExecute(Ex)
。
因此,将 PDF 文件的完整路径传递给 ShellExecute
,让系统找到并打开关联的应用程序。
ShellExecute(0, 'open', PChar(PdfFileName), nil, nil, SW_SHOW);
如果您想要正确的错误处理,请使用 ShellExecuteEx
。您也可以将 'open'
替换为 nil
并让系统选择默认操作。
这是对我的问题的最佳回答
procedure TForm3.Button2Click(Sender: TObject);
var s, result:String;
path: array[0..250] of char
begin
s:='/A nameddest=somePlaceInPDF "pathToMyFile.pdf"';
FindExecutable('pathToMyFile.pdf',nil,path);
result := trim(StrPas(path));
ShellExecute(handle,nil,pchar(result),pchar(s),nil,sw_show);
end
pdf 文件可能与另一个程序关联,因此 "FindExecutable" 不是找到已安装的 Acrobat Reader 程序的可靠方法。 我使用注册表项:HKEY_CLASSES_ROOT\Software\Adobe\Acrobat\Exe
procedure TfrmFsYtd.btnPdfHelpTestClick(Sender: TObject);
var strAcro, strParam:string;
Registry: TRegistry;
begin
// Get the users' installed Adobe Reader from the registry >>
Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_CLASSES_ROOT;
Registry.OpenKey('Software\Adobe\Acrobat\Exe',False);
strAcro :=Registry.ReadString('');
Registry.Free;
// Use the installed Adobe Reader to open your pdf- help- file at a specific page >>
strParam := ' /A page=4 "'+ProgPath+'FsYtd_Manual.pdf"';
ShellExecute(Handle, 'open', PChar(strAcro), PChar(strParam),nil, SW_SHOWNORMAL);
end;