Delphi - 使用参数打开PDF,但没有读取器应用程序的默认路径

时间:2015-05-23 07:53:36

标签: delphi winapi pdf

我在从Delphi打开pdf文件时遇到问题。 我需要打开带参数的pdf,因为我想为我的程序创建帮助手册。我尝试使用shellExecute,但是这个函数需要读者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阅读器。你知道一种跳过添加阅读器路径的方法吗?

另一种方式是

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阅读器中拉出路径。这是解决这个问题的最佳解决方案吗?

4 个答案:

答案 0 :(得分:2)

使用默认系统应用程序

打开PDF

ShellExecute(Handle, nil, 'pathToMyFile.pdf', nil, nil, SW_SHOW);

如果lpOperationnil,则使用默认的动词


打开包含参数的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"

以上打开带有x1000缩放的 PDF 文件(确实不太有用)。

要使用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开放参数是特定于应用程序的,因此不同的读者可能会在最好的情况下忽略它们;在最坏的情况下,应用程序将拒绝启动 我建议只有在确保客户端上有正确的应用程序后才能使用打开参数;如果没有,请使用第一种方法。

答案 1 :(得分:2)

如果您希望将参数传递给可执行文件,那么您将忽略任何关联并要求存在特定的可执行文件。因为特定参数仅对一个特定可执行文件有效。也就是说,Foxit不会理解Acrobat的参数,反之亦然。

在这种情况下,您应该使用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,然后让系统选择默认操作。

答案 2 :(得分:0)

这是我的问题的最佳答案

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

答案 3 :(得分:0)

pdf文件可能与另一个程序相关联,因此&#34; FindExecutable&#34;找不到已安装的Acrobat Reader程序是不可靠的方法。 我使用注册表项:HKEY_CLASSES_ROOT \ Software \ Adob​​e \ 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;