sharpsharp . sharpziplib . sharpzipbaseexception -报头校验和非法

本文关键字:校验和 非法 报头 sharpziplib sharpzipbaseexception sharpsharp | 更新日期: 2023-09-27 18:13:10

我真的卡住了,试图抓住没有密码保护的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();
}

sharpsharp . sharpziplib . sharpzipbaseexception -报头校验和非法

嗯,我没有设法得到这个工作使用PDFSharp,但我终于设法使用ITextSharp。他们公开了一个静态属性"unethicalreading",它允许你打开受密码保护的PDF -如果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取代。