1

我们有一个 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://... 开头的链接,以便在我们的场景中路由到内部页面?

4

1 回答 1

0

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

“访问 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://URL 的原始答案:

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

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

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

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

于 2021-09-30T19:24:43.107 回答