Data URI Hash Parameters (Hide PDF toolbar for data URI)

前端 未结 2 1509
孤城傲影
孤城傲影 2021-02-15 04:00

I have a PDF base64 encode data URI.

eg:

return 

        
                      
相关标签:
2条回答
  • 2021-02-15 04:52

    I'm in the same position myself here, and, unfortunately looking at

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

    the statement (within "common problems"):

    No support for query strings, etc. The data portion of a data URI is opaque, so an attempt to use a query string (page-specific parameters, with the syntax ?parameter-data) with a data URI will just include the query string in the data the URI represents.

    seems to indicate that this is not possible.

    If you are trying to prevent the printing of the PDF, and have access to the code that generates it (such as iText) you can programatically disable the print button using code similar to (encrypting the doc)

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

    however this will not prevent the document being able to be saved. (see : http://developers.itextpdf.com/question/how-disable-save-button-and-hide-menu-bar-adobe-reader)

    It would be nice to be able to pass through has parameters to an embed(or object) element, but ho hum.

    0 讨论(0)
  • 2021-02-15 04:56

    Like kolin said there is no way to directly send in query strings with a data URI. However, you can switch the data URI into a blob URL and pass the parameters in there.

    Just take your base64 data and convert it into a pdf blob like so:

    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}
    

    Then use the createObjectURL method to create a URL you can put query strings on like so:

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

    Set your object's data attribute to the resulting string and you'll have it.

    0 讨论(0)
提交回复
热议问题