PdfSharp.SharpZipLib.SharpZipBaseException - Контрольная сумма заголовка незаконна

Я действительно застрял, пытаясь захватить первую страницу PDF, которая не защищена паролем (то есть Adobe Reader может открыть ее просто отлично без подсказки), я получаю сообщение об ошибке, когда я вызываю PdfReader.Open ()

using (var pdfStream = new MemoryStream(_underlyingBytes))
{
    using (var allPages = PdfReader.Open(pdfStream, string.Empty, PdfDocumentOpenMode.ReadOnly))
    {
        if (allPages.PageCount < 1) throw new ArgumentException("PDF has no pages");

                using (var firstPage = new PdfDocument())
                {
                    firstPage.AddPage(allPages.Pages[0]);

                    using (var stream = new MemoryStream())
                    {
                        firstPage.Save(stream);
                        _underlyingBytes = stream.ToArray();

                        return this;
                    }
                }
     }
}

РЕДАКТИРОВАТЬ

Вот PDF, который я пытаюсь открыть

И если кто-то задавался вопросом, где находится _underlyingBytes:

using (var stream = new MemoryStream())
{
    blob.DownloadToStream(stream);
    stream.Position = 0;
    _underlyingBytes = stream.ToArray();
}

c#,pdf,pdfsharp,

-1

Ответов: 1


0 принят

Ну, мне не удалось получить эту работу с помощью PDFSharp, но я, наконец, смог использовать ITextSharp. Они выставляют статическое свойство «unethicalreading», которое позволяет вам открывать PDF-файлы, защищенные паролем - все равно не на 100%, почему это так, если Adobe Reader может открыть PDF без пароля ...

В любом случае, код теперь:

using (var pdfStream = new MemoryStream(_underlyingBytes))
{
    PdfReader.unethicalreading = true;
    using (var reader = new PdfReader(pdfStream))
    {
        if (reader.NumberOfPages < 1) throw new ArgumentException("PDF has no pages");

        using (var document = new Document(reader.GetPageSizeWithRotation(1)))
        {
            using (var outputStream = new MemoryStream())
            {
                using (var pdfCopyProvider = new PdfCopy(document, outputStream))
                {
                    document.Open();

                    var importedPage = pdfCopyProvider.GetImportedPage(reader, 1);
                    pdfCopyProvider.AddPage(importedPage);

                    document.Close();
                    reader.Close();


                    _underlyingBytes = outputStream.ToArray();
                    return this;
                }
            }
        }
    }
}

Это хорошо работает, и MemoryStream может быть легко заменен FileStream, если целью было записать первую страницу на диск.

Надеюсь, это поможет кому-то в будущем.

C #, PDF, PDFsharp,
Похожие вопросы