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

14
我有一个PDF的Base64编码数据URI。

例如:

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

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

PDF工具栏示例

看起来,禁用此工具栏的唯一方法是在URL末尾包含一些散列参数。

例如:

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

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

是否有任何方法可以在URI末尾包含这些哈希参数?

还是有人知道其他隐藏该工具栏的方法吗?

非常感谢任何帮助。先行致谢。:)

5个回答

18

正如kolin所说,没有直接将查询字符串通过data URI发送的方法。不过,你可以将data 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'

将您的对象的数据属性设置为生成的字符串,您就可以拥有它。


1
这个答案对我有效。另一个方法(在application/pdf;和base64之间注入toolbar=0)没有起作用,我在Chrome中得到了ERR_INVALID_URL错误。 - Kasheftin

6
我自己也处于同样的位置,不幸的是看到了“常见问题”中的声明(在https://developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs),似乎表明这是不可能的:“不支持查询字符串等。数据URI的数据部分是不透明的,因此尝试使用查询字符串(页面特定参数,语法为?parameter-data)与数据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)

能够将参数传递给嵌入(或对象)元素将是很好的,但唉。


1
最终使用了 URL.createObjectURL()。这是一个更好的选择,没有任何限制或限制。 - m4heshd

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>

我希望这能帮助你和其他人。

-1
我今天刚遇到这个问题,结果发现我可以把这些配置参数(例如#toolbar=0)放在base64字符串的末尾,就像这样。
<object data="data:application/pdf;base64,...#toolbar=0"></object>

PS:使用Chrome 116。

-3

你只需要在"data:application/pdf;"标签后面加上"#toolbar=0&",就可以隐藏PDF查看器中的工具栏,如下所示-

  • data:application/pdf;#toolbar=0;base64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接