Генерация PDF из байтового массива Base64 в VBA - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующий JSON-ответ от метода веб-сервиса, который вернет byte [] в формате PDF:

JVBERi0xLjQKJeLjz9MKMSAwI......nVq2P63zkirBH1z9aW3pDxn6F7q9TFV==

Возвращаемое значение - массив byte (). В течение нескольких дней я пытался использовать функцию, доступную в одном из вопросов, опубликованных в « Генерация PDF из строки Base64 в VBA », для генерации PDF из вышеуказанного байтового массива Base64, но я не смог ,

Что я сделал, так это то, что на основе байтового массива возврата из метода веб-сервиса я сохраняю его как переменную байтового массива с именем b64testByte . Затем я продолжаю вызывать 2 метода в моей программе, а именно сначала сначала encodeBase64, а затем - DecodeBase64. PDF-файл создан. Однако при попытке открыть файл возникает ошибка «Ошибка: документ поврежден и не может быть восстановлен. Не удалось открыть Adobe Reader, так как он не поддерживает тип файла или файл поврежден ( например, оно было отправлено в виде вложения электронной почты и не было правильно декодировано). "

Dim b64testByte() As Byte
b64testByte = xmlhttp.responseText 

Dim B64String As String
B64String = encodeBase64(b64testByte)


    Dim FilePath As String
    FilePath = "D:\label.pdf"
    Open FilePath For Binary Access Write As #1
    Put #1, 1, DecodeBase64(B64String)
    Close #1


Private Function DecodeBase64(ByVal strData As String) As Byte()
    Dim objXML As Object 'MSXML2.DOMDocument
    Dim objNode As Object 'MSXML2.IXMLDOMElement
    'get dom document
    Set objXML = CreateObject("MSXML2.DOMDocument")
    'create node with type of base 64 and decode
    Set objNode = objXML.createElement("b64")
    objNode.DataType = "bin.base64"
    objNode.Text = strData
    DecodeBase64 = objNode.nodeTypedValue
    'clean up
    Set objNode = Nothing
    Set objXML = Nothing
End Function

Private Function encodeBase64(ByRef arrData() As Byte) As String
    Dim objXML As Object 'MSXML2.DOMDocument
    Dim objNode As Object 'MSXML2.IXMLDOMElement
    'get dom document
    Set objXML = CreateObject("MSXML2.DOMDocument")

    Set objNode = objXML.createElement("b64")
    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = arrData
    encodeBase64 = objNode.Text

    Set objNode = Nothing
    Set objXML = Nothing
End Function**
...