首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ITextSharp -使用PdfStamper生成的MemoryStream关闭

ITextSharp -使用PdfStamper生成的MemoryStream关闭
EN

Stack Overflow用户
提问于 2015-08-17 10:46:05
回答 1查看 6.9K关注 0票数 2

我使用ITextSharp将多页PDF文件拆分为单个页面文件。我还设法使用MemoryStream将这些单页PDF添加到压缩文件中。

现在,我需要使用PdfStamper向那些PDF添加密码保护,然后再将它们添加到zip文件中。但是,每当我尝试这样做时,就会抛出一个ObjectDisposedException - Cannot access a closed Stream.

代码语言:javascript
复制
Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile();

        int cnt = 0;
        try
        {
            iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdfPath), new ASCIIEncoding().GetBytes(""));

            for (cnt = 1; cnt <= reader.NumberOfPages; cnt++)
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    using (iTextSharp.text.Document document = new iTextSharp.text.Document())
                    {
                        iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, memoryStream);

                        using (PdfStamper stamper = new PdfStamper(reader, memoryStream))
                        {
                            stamper.SetEncryption(
                                null,
                                Encoding.ASCII.GetBytes("password_here"),
                                PdfWriter.ALLOW_PRINTING,
                                PdfWriter.ENCRYPTION_AES_128);
                        }

                        memoryStreamForZipFile = new MemoryStream(memoryStream.ToArray());
                        memoryStreamForZipFile.Seek(0, SeekOrigin.Begin);
                    }
                }
            }

            zipFile.Save(destinationFolder + "/" + fileName.Replace(".pdf", ".zip"));

            reader.Close();
            reader.Dispose();
        }
        catch
        {
        }
        finally
        {
            GC.Collect();
        }
        return cnt - 1;

为了清晰起见,我删除了上面的一些代码。

如果我要删除“使用”块的PdfStamper,代码就可以正常工作。我还试图篡改PdfStamper的位置,看看是否在错误的地方使用它。

我是不是没有正确地使用using块?或者我必须在这里修复一些代码序列?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-17 12:01:51

您删除了一些必不可少的行是错误的;例如:我假设您在向PdfImportedPagePdfContentByte of PdfWriter中添加一个PdfWriter。如果是这样的话,您就忽略了正式文档中的所有警告。

您应该将代码替换为如下所示:

代码语言:javascript
复制
PdfReader reader = new PdfReader(pathToFile);
int n = reader.NumberOfPages;
int cnt;
for (cnt = 1; cnt <= reader.NumberOfPages; cnt++)
{
    reader = new PdfReader(pathToFile);
    reader.SelectPages(cnt.ToString());
    MemoryStream memoryStream = new MemoryStream();
    using (PdfStamper stamper = new PdfStamper(reader, memoryStream))
    {
        stamper.SetEncryption(
            null,
            Encoding.ASCII.GetBytes("password_here"),
            PdfWriter.ALLOW_PRINTING,
            PdfWriter.ENCRYPTION_AES_128);
    }
    reader.Close();
    // now do something with the memoryStream.ToArray()
}

如您所见,不需要引入DocumentPdfWriter对象。如果使用这些类,则会丢弃原始页中存在的所有交互活动。如果原始页面的页面大小与A4不同,您也会遇到麻烦。

注意,在使用PdfReader时不能重用PdfStamper实例。一旦将PdfReader实例传递给PdfStamper,该实例就会被篡改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32048421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档