当前位置: 首页 > 知识库问答 >
问题:

MemoryStream-合并PDF时无法访问关闭的流

李法
2023-03-14

你能告诉我,我的代码出了什么问题吗?我用它来合并PDF,我创建一个内存流,然后将其输出到PDF。它对我来说很好,但一些用户无法在IE中下载文件,或者在Chrome中出现网络错误:

public static MemoryStream MergePdfForms(List<byte[]> files)
    {
        if (files.Count > 1)
        {
            PdfReader pdfFile;
            Document doc;
            PdfWriter pCopy;
            MemoryStream msOutput = new MemoryStream();

            pdfFile = new PdfReader(files[0]);

            doc = new Document();
            pCopy = new PdfSmartCopy(doc, msOutput);

            doc.Open();

            for (int k = 0; k < files.Count; k++)
            {
                pdfFile = new PdfReader(files[k]);
                for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
                {
                    ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
                }
                pCopy.FreeReader(pdfFile);
            }

            pdfFile.Close();
            pCopy.Close();
            doc.Close();

            return msOutput;
        }
        else if (files.Count == 1)
        {
            return new MemoryStream(files[0]);
        }

        return null;
    }

调试后,我注意到内存流msOutput有一些错误:

是什么导致了它,以及如何避免它?

谢谢你。

共有1个答案

陶鸿畴
2023-03-14

CloseStream设置为false,否则当您调用pCopy时输出流将被关闭。关闭()

pCopy = new PdfSmartCopy(doc, msOutput) { CloseStream = false };

我在互联网上没有发现留档,所以我不得不直接查看源代码。

这是PdfSmartCopy类的声明:

public class PdfSmartCopy : PdfCopy
{
    // ...

    public PdfSmartCopy(Document document, Stream os) : base(document, os) {
        // ...
    }

    // ...
}

以下是PdfCopy类的声明:

public class PdfCopy : PdfWriter
{
    // ...

    public PdfCopy(Document document, Stream os) : base(new PdfDocument(), os)     {
        // ...
    }

    // ...
}

PdfWriter类的声明:

public class PdfWriter : DocWriter, 
    IPdfViewerPreferences,
    IPdfEncryptionSettings,
    IPdfVersion,
    IPdfDocumentActions,
    IPdfPageActions,
    IPdfIsoConformance,
    IPdfRunDirection,
    IPdfAnnotations
{
    // ...

    protected PdfWriter(PdfDocument document, Stream os) : base(document, os) {
        // ...
    }

    // ...
}

最后,DocWriter类的声明:

public abstract class DocWriter : IDocListener
{
    // ...

    // default value is true
    protected bool closeStream = true;

    public virtual bool CloseStream {
        get {
            return closeStream;
        }
        set {
            closeStream = value;
        }
    }

     protected DocWriter(Document document, Stream os)  
     {
        this.document = document;
        this.os = new OutputStreamCounter(os);
     }

     public virtual void Close() {
        open = false;
        os.Flush();
        if (closeStream) // <-- Take a look at this line
            os.Close();
     }

     // ...
}
 类似资料:
  • 我试图通过文件上传合并来自JSP页面的两个PDF文档。我正在获取文件,将它们放入列表中,但当我试图读取它们以进行合并时,我收到了一条“流已关闭”的消息。我搜索了很多关于这个例外的回复,但没有一个有帮助。所以,再说一遍,不确定它在哪里失败。 以下是Java代码: 我在线路上遇到了一个例外: 例外情况: 确切的问题是什么?正在关闭的inputStream在哪里? ===================

  • 我没有设置密码。我该如何解决这件事?

  • 我想让具有多个内部类的抽象类对其进行扩展,并可以通过静态方法创建其内部类的实例,但我得到编译器错误“无法访问ITask类型的封闭实例。必须使用ITask类型的封闭实例限定分配(例如,x.new A(),其中x是ITask的实例)。” 我发现内部类应该由外部类的实例创建,但是我的外部类有抽象方法,我不能创建它的实例。我创建了扩展父类的内部类,因为我习惯于控制它们的创建。那么有没有办法让我的模式发挥作

  • 我正在做一个实验2D物理的个人项目。现在,我正在尝试设置JFrame,以便它每秒更新60次。但是,当我调用方法开始更新JFrame时,我不能关闭JFrame。但是如果我省略了调用方法的部分,我可以关闭JFrame。这是主要代码: 这是Frame的代码: 如果我不在start()中调用updater(),我可以关闭JFrame。我知道我离开running=true,但它仍然应该关闭,因为这在我的旧计

  • 我有一个叫做GreenhouseControls的类,它有很多 内置于其中的类,例如: 我从文本文件中提取值以获取事件名称(如“ThermostatNight”)和时间值(如“2000”)。为了用这些值实例化一个新对象,我构建了一个EventFactory,它接受这些值作为参数。 这是我构建的类,用于从文本文件值创建新的事件对象: 当我运行这个程序时,一切都运行得很好,直到我将EventFacto

  • 给出这段代码,其中包含一个类及其方法.这是我们的主要关注点: 在IntelliJ IDEA中运行此代码不会返回任何编译错误,但会成功返回输出。我的问题是:为什么这不是一个不可达的语句? 删除语句后运行循环(但保留如下所示: (...)会返回这样的错误,因为最后的< code>sout永远不会被打印出来。为什么第一种情况也不会出现这种情况?我确信这不是运行时的问题,因为编译器肯定看到整数< code