首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我使用iText 7将多个PDF合并到一个使用c#的文件夹中。在我把它们合并后,它们似乎都留在了记忆中。我怎么才能把他们清除出去?

我使用iText 7将多个PDF合并到一个使用c#的文件夹中。在我把它们合并后,它们似乎都留在了记忆中。我怎么才能把他们清除出去?
EN

Stack Overflow用户
提问于 2022-06-13 05:01:35
回答 1查看 52关注 0票数 0

单击按钮时,会弹出一个对话框。我在该文件夹中找到所有pdfs并合并它们。

即使合并后,他们都留在记忆中。

有人能帮我解决这个问题吗?我还需要帮助理解Close()在做什么。我的理解是,这将清除它的记忆。

代码语言:javascript
复制
private void button1_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1 = new FolderBrowserDialog();
            DialogResult = folderBrowserDialog1.ShowDialog();

            if(DialogResult == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog1.SelectedPath;
                Environment.SpecialFolder root = folderBrowserDialog1.RootFolder;
            }


            if(folderBrowserDialog1.SelectedPath != "")
            {
                
                IList<string> inputFiles = Directory.GetFiles(folderBrowserDialog1.SelectedPath);

                //destination to make merged file
                string dest = @"D:\PDF-merge";
                string filename = "merged.pdf";

                try
                {
                    System.IO.Directory.CreateDirectory(dest);
                }
                catch { }


                //creating merge file
                PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest + @"\" + filename));
                PdfMerger merger = new PdfMerger(pdfDoc);
                
                PdfReader reader;
                PdfDocument pdf2merge;

                
                for (int i = 0; i < inputFiles.Count; i++)
                {
                    if (Path.GetExtension(inputFiles[i]) == ".pdf")
                    {
                        reader = new PdfReader(inputFiles[i]);
                        reader.SetUnethicalReading(true);
                        pdf2merge = new PdfDocument(reader);
                        merger.Merge(pdf2merge, 1, pdf2merge.GetNumberOfPages());

                        reader.Close();
                        pdf2merge.Close();
                    }
                }
                
                merger.Close();
                
            }
        }

合并第一个文件夹后编辑

合并第二个文件夹后

任务管理器中显示的内存使用情况

EN

回答 1

Stack Overflow用户

发布于 2022-06-13 05:55:32

PdfDocumentPdfReader都实现了IDisposable,因此我总是将它们与using一起使用,以确保在使用它们之后释放所有资源。假设是当前的C#版本,您可以通过以下方法实现这一点

代码语言:javascript
复制
for (int i = 0; i < inputFiles.Count; i++)
{
    if (Path.GetExtension(inputFiles[i]) == ".pdf")
    {
        using var reader = new PdfReader(inputFiles[i]);
        reader.SetUnethicalReading(true);
        
        using var pdf2merge = new PdfDocument(reader);
        merger.Merge(pdf2merge, 1, pdf2merge.GetNumberOfPages());

        reader.Close();
        pdf2merge.Close();
    }
}

(当然,必须删除readerpdf2mergefor之前的声明。)

同样适用于pdfDoc

代码语言:javascript
复制
using PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest + @"\" + filename));

也许是PdfMerger,尽管文档没有100%清楚地说明这一点(如果编译器抱怨PdfMerger没有实现IDisposable,那么它就不会。)

此外,PdfReader.SetUnethicalReading的文档表明,如果您使用此方法,它们将不承担任何责任。你为什么要用它?这可能与你的问题有关吗?

编辑:

对于根本原因分析,您应该考虑投资于内存配置文件,特别是如果代码将来某个时候是生产代码的话。

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

https://stackoverflow.com/questions/72597949

复制
相关文章

相似问题

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