【问题标题】:Data URI Hash Parameters (Hide PDF toolbar for data URI)数据 URI 哈希参数(隐藏数据 URI 的 PDF 工具栏)
【发布时间】:2016-05-24 02:42:42
【问题描述】:

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

例如:

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

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

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

例如。

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

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

有没有办法在 URI 的末尾包含这些哈希参数?

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

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

【问题讨论】:

    标签: html pdf data-uri


    【解决方案1】:

    我自己也处于同样的位置,不幸的是看着

    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);
    

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

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

    【讨论】:

    • 最终使用URL.createObjectURL()。没有限制或限制的更好的选择。
    【解决方案2】:

    就像科林所说,没有办法直接发送带有数据 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'
    

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

    【讨论】:

    • 这个答案对我有用。另一个(在 application/pdf 和 base64 之间注入工具栏=0)不起作用,我在 chrome 中收到 ERR_INVALID_URL 错误。
    【解决方案3】:

    昨天我也遇到了类似的问题,并找到了一个可行的解决方案。当您在 URI 中使用 base64 并尝试设置默认行为 none(#toolbar=0&navpanes=0&scrollbar=0&) 时,src 无法检测到以“#”开头的边界。你可以用这个来得到想要的结果data:application/pdf;#toolbar=0&amp;navpanes=0&amp;scrollbar=0&amp;;base64,your_base64_string。 根据您的代码,您可以像这样返回:

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

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

    【讨论】:

      【解决方案4】:

      您只需将 '#toolbar=0&' 放在 data Url 中的 'data:application/pdf;' 之后标记以从 pdf 查看器中隐藏工具栏,如下所示-

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多