数据 URI 哈希参数(隐藏数据 URI 的 PDF 工具栏)

问题描述 投票:0回答:6

我有一个 PDF base64 编码数据 URI。

例如:

return <object data="data:application/pdf;base64,JVBERi0xLjMKJf////8KOCAwIG9...VmCjI0MTU4OAolJUVPRgo=" type="application/pdf"></object>

我可以毫无问题地将其嵌入页面中。但是,默认情况下,浏览器在 PDF 中包含一个工具栏。

似乎禁用此工具栏的唯一方法是在网址末尾包含一些哈希参数。

例如。

<object data="path/to/file.pdf#toolbar=0&navpanes=0&scrollbar=0" type="application/pdf"></object>

如果通过相对路径或 URL 访问 PDF,则效果很好,但我无法找到一种方法来使其与数据 URI 一起工作。

有什么方法可以在 URI 末尾包含这些哈希参数吗?

或者有人知道以其他方式隐藏此工具栏的方法吗?

非常感谢任何帮助。提前致谢。 :)

html pdf data-uri
6个回答
18
投票

就像 kolin 所说,没有办法直接发送带有数据 URI 的查询字符串。但是,您可以将数据 URI 切换为 blob URL 并在其中传递参数。

只需获取您的 base64 数据并将其转换为 pdf blob,如下所示:

function b64toBlob(b64Data, contentType) {
var byteCharacters = atob(b64Data)

var byteArrays = []

for (let offset = 0; offset < byteCharacters.length; offset += 512) {
    var slice = byteCharacters.slice(offset, offset + 512),
        byteNumbers = new Array(slice.length)
    for (let i = 0; i < slice.length; i++) {
        byteNumbers[i] = slice.charCodeAt(i)
    }
    var byteArray = new Uint8Array(byteNumbers)

    byteArrays.push(byteArray)
}

var blob = new Blob(byteArrays, { type: contentType })
return blob}

然后使用 createObjectURL 方法创建一个 URL,您可以像这样放置查询字符串:

URL.createObjectURL(b64toBlob(data.buffer.data, 'application/pdf')) + '#toolbar=0&navpanes=0&scrollbar=0'

将对象的数据属性设置为结果字符串,您就会得到它。


6
投票

我自己也处于同样的境地,并且不幸的是看着

https://developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs

声明(“常见问题”内):

不支持查询字符串等。 数据 URI 的数据部分是不透明的,因此尝试将查询字符串(特定于页面的参数,语法为?参数数据)与数据 URI 一起使用只会将查询字符串包含在 URI 表示的数据中。

似乎表明这是不可能的。

如果您试图阻止打印 PDF,并有权访问生成 PDF 的代码(例如 iText),您可以使用类似于(加密文档)的代码以编程方式禁用打印按钮

stamper.setEncryption(null,null, PdfWriter.HideWindowUI, PdfWriter.STRENGTH40BITS); 
stamper.setViewerPreferences(PdfWriter.HideToolbar);

但是,这不会阻止保存文档。 (看 : http://developers.itextpdf.com/question/how-disable-save-button-and-hide-menu-bar-adobe-reader

如果能够将 has 参数传递给嵌入(或对象)元素,那就太好了,但是呵呵。


2
投票

昨天我也遇到了类似的问题并找到了有效的解决方案。当您在 URI 中使用 base64 并尝试将默认行为设置为 none(#toolbar=0&navpanes=0&scrollbar=0&) 时,src 无法检测以“#”开头的边界。你可以用这个来获得想要的结果

data:application/pdf;#toolbar=0&navpanes=0&scrollbar=0&;base64,your_base64_string
。 根据您的代码,您可以这样返回:

return <object data="data:application/pdf;#toolbar=0&navpanes=0&scrollbar=0&;base64,JVBERi0xLjMKJf////8KOCAwIG9...VmCjI0MTU4OAolJUVPRgo=" type="application/pdf"></object>

我希望这可以帮助您和其他人。


0
投票

对于这样的问题

现在有效的方法可能在过去或未来或所有版本的所有弓箭手中都无效。

# 片段是由 Adobe 在 Internet Explorer 中为 Acrobat 设计的,在 OP 时,我怀疑 dataURI 不允许

.....PDF#blah,blah
片段

这里之前给出的答案之一仅适用于三分之二的最新浏览器。第一个仍然有自动隐藏工具栏,中间是 Edge 中的 Acrobat,右边是 PDF.js。

数据....#toolbar=0"

/pdf;#toolbar=0;base64/pdf;#toolbar=0&navpanes=0&scrollbar=0&;base64
通常会损坏 base64 起始字符串,因此在主要浏览器中不起作用。


-1
投票

我今天刚刚遇到这个问题,结果我可以将这些配置参数(例如#toolbar=0)放在base64字符串的末尾。像这样

<object data="data:application/pdf;base64,...#toolbar=0"></object>

PS;使用 chrome 116。


-3
投票

您只需将“#toolbar=0&”放入数据网址中“data:application/pdf;”之后标签可从 pdf 查看器中隐藏工具栏,如下所示 -

  • 数据:应用程序/pdf;#toolbar=0;base64
© www.soinside.com 2019 - 2024. All rights reserved.