【问题标题】:How to fetch local links from PDF using ngx-extended-pdf-viewer如何使用 ngx-extended-pdf-viewer 从 PDF 中获取本地链接
【发布时间】:2021-11-21 09:24:19
【问题描述】:

我们有一个 Angular 应用程序,它使用 ngx-extended-pdf-viewer 从服务器呈现 pdf 文件。一些 pdf 文件包含指向外部站点 https://... 的外部链接,因此它们将在新的浏览器选项卡中打开。还有指向 Angular 应用程序中对象的链接。这些链接使用内部 id,例如 12345。

从普通 Windows 桌面打开 pdf 文件时,内部链接显示为“file:///12345”,但使用 ngx-extended-pdf-viewer 在 Angular 应用程序中打开 pdf 时,链接为消失了,因此我们无法获取它们以路由到应用程序内的内部页面。

有据可查的展示 https://pdfviewer.net/extended-pdf-viewer/links 描述了不支持此类链接。

有没有一种方法可以获取不以 https://... 开头的链接,以便在我们的场景中路由到内部页面?

【问题讨论】:

    标签: angular pdf ngx-extended-pdf-viewer


    【解决方案1】:

    正确阅读问题后更新答案:

    “在 Angular 应用程序中访问对象”可能意味着很多事情——但基本上我能想到的每个场景都围绕着调用 Angular 组件或服务中的方法,并让 Angular 的变更检测意识到这一点。

    首先,您需要添加一个 onclick 处理程序来调用您的 Angular 方法。您可以通过注册 (textLayerRendered) 并使用它来修改由 pdf.js 呈现的 HTML 代码来做到这一点。除此之外,它还包含您特殊的file:// 链接。添加一个 onclick 处理程序来调用您的 Angular 方法。

    接下来,您遇到的问题是调用了 Angular 方法,但在 Angular 上下文之外。要解决这个问题,请注入NgZone。像这样实现你想在 Angular 中运行的代码:

    public onCustomLinkClick(link): void {
      zone.run(() => {
         // put your custom code here
      });
    }
    

    这应该可以解决问题。请注意,我还没有尝试过源代码,但我很快就会在展示中添加一个工作演示。

    关于如何访问传统 file:// 网址的原始答案:

    恐怕您遇到的问题不是 ngx-extended-pdf-viewer 的错。这是一般浏览器应用程序的问题。如果您能够以编程方式打开用户硬盘上的文件,那么您可能能够读取他们的所有文件。其实在互联网还年轻的时候,也有可以读取任意本地文件的漏洞。

    现在假设您是一名黑客,试图窃取一些敏感数据。编写一个读取任意本地文件的浏览器应用程序对您来说是天赐之物!这就是为什么每个现代浏览器都竭尽全力禁止此类访问的原因。

    有一个例外:如果用户同意,您可以访问本地文件。为此,用户必须使用拖放操作或使用“文件打开”对话框。

    长话短说:只要您正在编写一个在浏览器中运行的应用程序,那么您就不走运了。如果您正在使用 Electron 或 Cordova 编写应用程序,我有一个好消息要告诉您:有一个开放的票证可以消除这种环境中的限制 (https://github.com/stephanrauh/ngx-extended-pdf-viewer/issues/938)。我什至给了它很高的优先级,所以这个功能可能很快就会出现。

    【讨论】:

    • 非常感谢您的回复。在我的场景中,它与读取本地文件无关。就像这样,PDF 中的“内部”链接使用 ID 指向应用程序中的 PDF 或其他内容。我只需要能够读取我可以加载相应内容的 ID。我很感激任何关于如何解决这个问题的建议。
    • 哦。很抱歉对您没有提出的问题给出了正确答案。我会更新我的答案。
    猜你喜欢
    • 2021-11-04
    • 2020-05-31
    • 2019-11-13
    • 2019-11-10
    • 2022-10-20
    • 2021-06-17
    • 1970-01-01
    • 2020-05-31
    • 2021-11-05
    相关资源
    最近更新 更多