Возникли проблемы с надуванием строки base64: ошибка zlib: -3 - PullRequest
0 голосов
/ 08 февраля 2012

Мое приложение получает PDF в виде строки base64 с дефлированной zLib в XML-файле.По крайней мере, это тот формат, в котором, как мне сказали, он находится. Он сохраняется в базе данных, а затем мне нужно заново создать PDF-файл из этой строки.Я создал тестовое приложение, чтобы понять это.Приведенная ниже функция берет строку и должна вернуть ее в декодированном, раздутом формате, который, я думаю, я смогу использовать для перестроения оригинального PDF (я еще не там).

Я провел много исследований и нашел несколько разных библиотек и способов сделать это, а также получил Java-программу от разработчика, который отправляет мне PDF-файл для использования в качестве примера.Однако я не могу получить строку в пригодном для использования формате.Использование ManagedZLib.dll и функции, представленной ниже, кажется мне наиболее близким.Насколько я могу судить по отладке, все работает, пока я не попытаюсь распаковать:

zStream.Read(decompressedBytes, 0, decodedBytes.Length - 1)

Это приводит к "ошибке zLib: -3".Единственная информация, которую я могу найти об этой ошибке - это «ошибка данных».В Интернете очень мало другой информации об этом.

Любая помощь в преодолении этой ошибки или мысли о другом / лучшем подходе к достижению моей конечной цели очень ценится.

Public Function DecompressString4(ByVal origString As String) As String

    Dim returnString = Nothing
    ' get the base64 content into String
    ManagedZLib.ManagedZLib.Initialize()

    '// parse the string into a byte array
    Dim b64bytes() As Byte = System.Text.Encoding.UTF8.GetBytes(origString)
    Dim decodedBytes() As Byte = Nothing

    'decode the byte array into another byte array, but this time of Base 64.
    Using ms As New MemoryStream(b64bytes)
        Using zStream As New ManagedZLib.Base64Stream(ms, Base64Options.Decode)
            ReDim decodedBytes(b64bytes.Length)
            zStream.Read(decodedBytes, 0, b64bytes.Length)
        End Using
    End Using

    decmpStrTxtBox.Text = Convert.ToString(decodedBytes)

    Dim decompressedBytes() As Byte = Nothing

    ' inflate the base64 array
    Using ms2 As New MemoryStream(decodedBytes)
        Using zStream As New ManagedZLib.CompressionStream(ms2, CompressionOptions.Decompress)
            'ReDim decompressedBytes(origString.Length)
            ReDim decompressedBytes(decodedBytes.Length)
            zStream.Read(decompressedBytes, 0, decodedBytes.Length - 1)
        End Using
    End Using

    'write output to a stream
    returnString = Convert.ToString(decompressedBytes)
    ManagedZLib.ManagedZLib.Terminate()

    Return returnString

End Function

1 Ответ

0 голосов
/ 17 февраля 2012

Видимо, я делал это слишком сложно.Вот окончательное решение: взять дефлированную строку base64, декодировать ее, затем накачать ее и вывести из нее PDF.Его можно легко настроить, чтобы вернуть полученную строку при необходимости.Я получил гораздо лучшие результаты, не включив никаких библиотек (которые должны были сделать это проще :-)).На самом деле я не нашел ответа на полученную ошибку и предположил, что библиотека не предназначена для моих целей.Использование встроенных классов .net сделало свое дело намного лучше (Convert.FromBase64String и System.IO.Compression.DeflateStream).

Я надеюсь, что это поможет кому-то в будущем, так как я не смог найти пример этогогде угодно.

Imports System.IO
Imports System.IO.Compression
Imports System.Text

    Public Sub DecompressString(ByVal origString As String)

    Dim decodedDeflatedBytes() As Byte = Nothing
    Dim decodedInflatedBytes() As Byte = Nothing

    'parse the string into a decoded byte array
    decodedDeflatedBytes = Convert.FromBase64String(origString)

    'once around the block to get the length of the buffer we'll need
    Dim decompressedBufferLength As Integer = 0
    Using ms1 As New MemoryStream(decodedDeflatedBytes)
        Using dStream1 As System.IO.Compression.DeflateStream = New System.IO.Compression.DeflateStream(ms1, Compression.CompressionMode.Decompress)
            While dStream1.ReadByte <> -1  ' -1 indicates nothing left to read
                decompressedBufferLength += 1
            End While
        End Using
    End Using

    'a second time around the block to do the actual inflation now that we have the length
    Using ms2 As New MemoryStream(decodedDeflatedBytes)
        Using dStream2 As System.IO.Compression.DeflateStream = New System.IO.Compression.DeflateStream(ms2, Compression.CompressionMode.Decompress)
            ReDim decodedInflatedBytes(decompressedBufferLength - 1) '11711
            dStream2.Read(decodedInflatedBytes, 0, decompressedBufferLength) '11712
        End Using
    End Using

    'output the PDF with a 'save as' prompt
    Response.ClearContent()
    Response.ClearHeaders()
    Response.Clear()
    Response.ContentType = "Application/pdf"
    Response.AddHeader("Content-Length", decodedInflatedBytes.Length.ToString)
    Response.AddHeader("content-disposition", "attachment;filename=YourReport.pdf")
    Response.BinaryWrite(decodedInflatedBytes)
    Response.End()

End Sub
...