我有一个PDF base64编码数据URI。
例如:
return <object data="data:application/pdf;base64,JVBERi0xLjMKJf////8KOCAwIG9...VmCjI0MTU4OAolJUVPRgo=" type="application/pdf"></object>
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地将其嵌入页面中。但是,默认情况下,浏览器在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的末尾包含这些哈希参数?
还是有人知道以其他方式隐藏此工具栏的某种方式?
任何帮助是极大的赞赏。提前致谢。:)
我自己在这里也处于同样的位置,而且,不幸的是,看着
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)
能够将参数传递给嵌入(或对象)元素会很好,但是呵呵。
就像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属性设置为结果字符串,您将拥有它。