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

nma*_*jor 6 html pdf data-uri

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

例如:

return <object data="data:application/pdf;base64,JVBERi0xLjMKJf////8KOCAwIG9...VmCjI0MTU4OAolJUVPRgo=" type="application/pdf"></object>
Run Code Online (Sandbox Code Playgroud)

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

PDF工具栏示例

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

例如。

<object data="path/to/file.pdf#toolbar=0&navpanes=0&scrollbar=0" type="application/pdf"></object>
Run Code Online (Sandbox Code Playgroud)

如果通过相对路径或URL访问PDF,效果很好,但是我无法找到一种使数据URI正常工作的方法。

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

还是有人知道以其他方式隐藏此工具栏的某种方式?

任何帮助是极大的赞赏。提前致谢。:)

kol*_*lin 5

我自己在这里也处于同样的位置,而且,不幸的是,看着

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

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

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

似乎表明这是不可能的。

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

stamper.setEncryption(null,null, PdfWriter.HideWindowUI, PdfWriter.STRENGTH40BITS); 
stamper.setViewerPreferences(PdfWriter.HideToolbar);
Run Code Online (Sandbox Code Playgroud)

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

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


Sam*_*ham 5

就像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}
Run Code Online (Sandbox Code Playgroud)

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

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

将对象的data属性设置为结果字符串,您将拥有它。