DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: monica9612
今日帖子: 2
在线用户: 15
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/5/20 10:38:03
标题:
求教:Delphi开发的App中如何生成PDF及通过微信分享? 浏览:1119
加入我的收藏
楼主: Delphi开发的App中如何生成PDF及通过微信分享?
这个我一点思路都没,请给提供一些帮助,感谢
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/5/22 9:46:54
1楼: @flyers  @iamdream  请帮帮忙!
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2023/5/23 21:18:12
2楼: 我不用Delphi做移动开发呢。找到一个安卓下生成PDF的文章:Delphi安卓创建PDf文件并打开
微信分享坛子里应该有不少人知道,我没做过。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/5/25 9:10:06
3楼: @iamdream
谢谢你的回复,我也找了好久,没找到相应的文章,及可用的控件。
也许是找的方向不对吧!
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 jzzm2006 (jzzm2006) ▲▲▲▲▲ -
普通会员
2023/5/25 23:44:56
4楼: // 使用此功能需要在IDE编辑器中 打开一个选项  Project ->   Options -> (Application -> Entitlement List ->  saecure File Sharing 值为 TRUE)
procedure ShellOpenFile(const AFileName: string);     //打开文件.
var
  LIntent: JIntent;
  LUri: Jnet_Uri;
begin
  LUri := TAndroidHelper.JFileToJURI(TJFile.JavaClass.init(StringToJString(AFileName)));
  LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
  LIntent.setDataAndType(LUri, StringToJString('application/pdf'));
  //LIntent.setDataAndType(LUri, StringToJString(Leixing));
  LIntent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
  TAndroidHelper.Activity.startActivity(LIntent);
end;
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/5/26 13:26:36
5楼: 如果在安卓底下创建 PDF 不好做,不妨在 WINDOWS 里面做 -- 写一个 WINDOWS 底下的 SERVER 来完成这个事情,手机端作为客户端把活丢给服务器端干。

现在很多 APP 其实就是个壳子,里面都是 HTML,干活都靠云端。用 DELPHI 写 APP 的,也要学会这样来看待程序需要实现的功能。

举个例子:

现在停车场入口都有摄像机,做车牌识别。厉害的,是在摄像机的嵌入式芯片里面直接做图像识别。但同样的功能,水平不够的也能拿到订单,它就是拍张图片传到云端,由后台服务器的代码去识别。
----------------------------------------------
-
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/8/20 17:13:46
6楼: @jzzm2006
可以把您的方法说的详细一点么?十分感谢!
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/8/20 17:15:57
7楼: @pcplayer,您的这个思路的确可以,就是需要再服务器端生成PDF后,传给客户端,再由客户端分享给微信。这其中的很多功能实现代码都比较陌生,您有详细的案例么?
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/8/20 18:13:46
8楼: 7 楼,现在很多所谓的移动端,比如你去点菜,扫码弹出来的点菜的微信小程序,本质就是个浏览器页面,它的所有功能都在后端完成。你手指头点了一个菜,它好半天才出现那个表示你点了菜的红点,导致你以为没点上,又按一次。结果,不小心一个菜点了三份。

它的点菜操作,就是你在界面上点了以后,提交数据到后端的服务器。一个网- 络来回很慢,导致操作的反馈延迟。

上述操作,如果用 Delphi 做的 APP,是不会有这个问题的。因为用户点下去,到显示点菜成功,都是在手机端完成的,没有网-络来回。

----------
但是,如果你要创建 PDF,可以使用后台服务器创建的方式嘛。这个慢一点也没啥关系。

至于详细案例?这个我只能给你建议。其实就是把 APP 当作客户端,然后你做一个服务器端,让 APP 和后台服务器端通讯,完成这个功能。

1. APP 上面用户触摸操作需要创建 PDF,APP 响应用户触摸,发送命令和相应的数据给服务器;

2. 服务器收到命令和数据,根据数据,创建 PDF 文件;

3. 服务器创建好 PDF 文件,把文件发送给 APP;

4. APP 收到 PDF,接下来是打开 PDF 还是保存还是分享,就看你想干什么了。

具体技术实现,用 Delphi 的话,办法很多。比如:
1. 使用 Delphi 现在推出的 DataSnap架构。这个架构下,你可以做一个 App Server 工作在 WINDOWS 服务器上面,然后你的 APP 里面实现这个架构的客户端(Delphi 提供了一套控件的)来完成整个通讯过程;

2. 你自己使用 TCP/IP 实现服务器端和客户端,自己定义命令和数据格式。比如使用 Indy TCP Server 和 Indy TCP Client;

3. 使用 Delphi 提供的 WebService 框架,做一个 SOAP 的服务器端,在 APP 里面实现 SOAP 的客户端,通过远程调用函数的方式去实现客户端和服务器端的通讯;

4. 使用 Delphi 提供的 WebBroker 框架,做一个 WINDOWS 服务器端的 Web Server,然后在 APP 里面使用 Indy HTTP Client 或者干脆使用一个浏览器控件,去和服务器端通讯。

5. 还有很多第三方的 C/S 框架,你也可以使用。

通讯的原理搞清楚了,使用哪个框架都无所谓,选一个自己熟悉的或者入门简单的就行了。

比如很多年前,我做了一个网页作为客户端的程序,用户录入数据后,需要打印成 PDF,我只好在服务器端使用 EhLib 的控件来输出 PDF,然后再下载给网页客户端了。那时候我完全不知道如何在浏览器里面直接打印 PDF,那时候的浏览器的功能还没现在完善。

这个服务器端,我就是用 Delphi 做的,既然是网页,我忘记了是用 IntraWeb 还是直接用的 WebBroker 了。
----------------------------------------------
-
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/8/21 20:17:58
9楼: @jzzm2006,您看一下,哪里有问题了?为什么会提示外部错误?


procedure TR_XSD_Fm.ListBoxItem1Click(Sender: TObject);
var strStream:TStream;
var strFileStream:TFileStream;
var FileName:string;
var FilePath:string;
var LIntent: JIntent;
var LUri: Jnet_Uri;
begin
  TThread.CreateAnonymousThread(
   procedure()
  begin

     try
       fileName:=Edit1.Text+FormatDateTime('YYYYMMDD-HHnnss',NOw)+'.pdf';

       FilePath:=TPath.GetTempPath + '/' + FileName;

        strStream:=ClientModule1.Fc_Server_SM_FmClient.DownLoadPDFs('13',Edit1.Text);

       sleep(10000);

       strStream.Position:=0;

       strFileStream.Create(FilePath,fmCreate);
       strFileStream.CopyFrom(strstream,strstream.Size);

       LUri := TAndroidHelper.JFileToJURI(TJFile.JavaClass.init(StringToJString(FilePath)));
       LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
       LIntent.setDataAndType(LUri, StringToJString('application/pdf'));
      //LIntent.setDataAndType(LUri, StringToJString(Leixing));
       LIntent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
       TAndroidHelper.Activity.startActivity(LIntent);

      except
       On E:Exception do
      TThread.Synchronize(TThread.CurrentThread,procedure()
       begin
        showmessage('1:'+e.Message);// SHOWMESSAGE('单据打印任务失败 !  '+billvchcode);
      end);
     end;

  end).Start;

end;
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/8/22 15:51:29
10楼: 安卓下,用FilePath:=TPath.GetCachePath;
获得的路径是:/data/user/0/com.embarcadero.FangC_SdNew/cache/Fc.pdf
为什么在手机的文件管理里,找不到这个路径?
在手机下可以看到:
手机存储/Android/data/com.embarcadero.FangC_SdNew/cache
手机存储/Android/data/com.embarcadero.FangC_SdNew/files

感觉获得的路径与手机上看到的不一样,把需要分享的文件拷贝到手机能看到的路径下后,分享的时候提示找不到文件。
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/8/22 21:45:33
11楼: many path in Linux needs a "root" privilegies to see, read, write, etc...
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/8/23 17:55:18
12楼: 今天做的差不多了。
用的pcplayer的思路,移动端向服务器提供参数:单据ID及客户名称;SANP服务器根据客户端的参数,生成本地pdf文件,再用TMemoryStream将PDF传回APP移动端,然后保存到移动端的临时文件夹中,再用的jzzm2006的代码,先打开再分享。


虽然行的通了,但是,是先打开再分享,也就是说:这个分享是在移动端用其他应用打开后再分享的,如何能在delphi的App里直接分享呢?

请各位前辈指教!
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/8/24 11:55:46
13楼: @sxfgf

Tip 0: 
1) generate your PDF file on server
2) encode it in "BASE64" string
3) compress this "Base64" string using TZCompressStream (native in Delphi) or any other
4) send this compressed string for your client

--------->  you can get until 90% compression without lost, in some file

on Client, do the revert task:
1) uncompress the string
2) decode "Base64" string
3) save your stream as PDF!


In Android mobile, you can try open PDF using a Web brower / Intent = OK!
https://blogs.embarcadero.com/opening-a-pdf-on-android-with-delphi/
https://delphiaball.co.uk/2018/08/03/opening-a-pdf-on-android-with-delphi/
Video: https://youtu.be/ImKBMqhDDk0

https://stackoverflow.com/questions/58947323/open-pdf-file-delphi-rio

https://stackoverflow.com/questions/30453937/cannot-open-pdf-file-created-by-android-app

In Android mobile, you can try "share" your file/text using "INTENT"

Sample using WhatsApp: Share by "Intent"

https://stackoverflow.com/questions/39522482/how-to-share-pdf-and-text-through-whatsapp-in-android
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行33.20313毫秒 RSS