首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi 10.3.3如何查看Ubuntu上的pdf文件

Delphi 10.3.3如何查看Ubuntu上的pdf文件
EN

Stack Overflow用户
提问于 2020-05-13 10:11:39
回答 1查看 154关注 0票数 0

我的应用程序从服务器下载文件,并将文件保存在默认的下载目录中。如何在下载后打开该文件以查看它。

代码语言:javascript
复制
try
        MS := TMemoryStream.Create;
        try
          Http.Request.BasicAuthentication:= true;
          Http.Request.Username := '*****';
          Http.Request.Password := '****';
          Http.Get('http://'+serverIP+':8080/api/getpdf/'+fType, MS);
          MS.Position:=0;
          {$IFDEF MSWINDOWS}
          MS.SaveToFile(fl);
          {$ENDIF}
          {$IFDEF LINUX}
          MS.SaveToFile(fl);
          {$ENDIF}
          {$IFDEF ANDROID}
          if PermissionsService.IsPermissionGranted(JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)) then
          begin
           MS.SaveToFile(fl);
          end;
         {$ENDIF}         
         previewFile(fl,fType);<--------------
        finally
         MS.Free;
        end;
      finally
        Http.Free;
      end;

windows平台上的

代码语言:javascript
复制
ShellExecute(0, 'open',PChar(fl),nil,nil,0)

对Linux有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2020-05-13 10:57:29

多亏了sddk,我得到了这个解决方案,在Ubuntu19.1下工作得很好。

代码语言:javascript
复制
procedure TfrmMain.previewFile(fl,fType:string);
var
 a:string;
 M : TMarshaller;
 {$IFDEF ANDROID}
  Intent      : JIntent;
  URI         : Jnet_Uri;
 {$ENDIF}
begin
 AniIndicatorItems.Enabled:=false;
 AniIndicatorItems.Visible:=false;
 rcMaskItems.Visible:=false;
 TabItem1.Repaint;
 {$IFDEF MSWINDOWS}
  ShellExecute(0, 'open',PChar(fl),nil,nil,0) ;
 {$ENDIF}
 {$IFDEF LINUX}
  fl:='xdg-open '+fl;//<-------------------------------------
  popen(M.AsAnsi(PWideChar(fl)).ToPointer,'r');//<-----------
 {$ENDIF}
 {$IFDEF ANDROID}
  if PermissionsService.IsPermissionGranted(JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)) then
  begin
   if fType='1' then//pdf
    OpenPDF(fl)
   else//excel
    OpenXLSX(fl);
  end;
 {$ENDIF}
end;

//------------------------------------------------------------------------------
{$IFDEF ANDROID}
procedure OpenPDF(const AFileName: string);
var
  LIntent: JIntent;
  LAuthority: JString;
  LUri: Jnet_Uri;
begin
  LAuthority := StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider');
  LUri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, LAuthority, TJFile.JavaClass.init(StringToJString(AFileName)));
  LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
  LIntent.setDataAndType(LUri, StringToJString('application/pdf'));
  LIntent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
  TAndroidHelper.Activity.startActivity(LIntent);
end;
//------------------------------------------------------------------------------
procedure OpenXLSX(const AFileName: string);
var
  LIntent: JIntent;
  LAuthority: JString;
  LUri: Jnet_Uri;
begin
  LAuthority := StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider');
  LUri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, LAuthority, TJFile.JavaClass.init(StringToJString(AFileName)));
  LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
  LIntent.setDataAndType(LUri, StringToJString('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'));
  LIntent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
  TAndroidHelper.Activity.startActivity(LIntent);
end;
{$ENDIF}

对于android,您还需要以下内容:DW.Androidapi.JNI.FileProvider.pas

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61771894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档