iText7使用iText.Layout.Element.Link能否打开自定义URI方案
问题根因
绝大多数PDF阅读器出于安全策略限制,对CreateURI生成的URI链接做了白名单校验,仅允许http、https、mailto、ftp等公认通用协议跳转,自定义URI Scheme会被直接拦截,因此浏览器可以正常触发的自定义协议在PDF中点击无响应。
可行解决方案
方案1:使用JavaScript动作触发(兼容性最高)
iText7支持创建带JS脚本的动作,通过PDF阅读器内置的JS引擎调用app.launchURL方法触发自定义协议,可绕过大部分阅读器的白名单限制,示例代码如下:
Dim targetUri As String = "myCustomScheme:C:\Temp\Exemple.sgs" ' 第二个参数为true表示在系统默认应用中打开链接,而非阅读器内置浏览器 Dim jsContent As String = $"app.launchURL(""{targetUri}"", true);" Dim linkKo As New Link("test", PdfAction.CreateJavaScript(jsContent)) paragraph.Add(linkKo)
该方案适配绝大多数支持JS的主流PDF阅读器,包括Adobe Acrobat/Reader、福昕阅读器等。
方案2:使用Launch动作调用本地脚本(仅适合Windows可控分发场景)
如果使用场景为权限可控的Windows环境,也可以通过启动本地批处理脚本的方式拉起目标应用:提前在对应路径存放批处理文件,内容为start myCustomScheme:C:\Temp\Exemple.sgs,iText7代码示例如下:
Dim launchAction As PdfAction = PdfAction.CreateLaunch("C:\Temp\launch_sgs.bat") Dim linkKo As New Link("test", launchAction) paragraph.Add(linkKo)
注意事项
- 轻量PDF阅读器、浏览器内置的PDF预览工具大多默认禁用JS和本地文件启动权限,测试时请使用支持完整PDF规范的桌面端阅读器验证效果
- 对外分发的PDF优先使用方案1,同时提示用户使用支持JS的PDF阅读器打开即可
内容的提问来源于stack exchange,提问作者Valentin Marie
相关产品推荐
相关产品推荐

