附加到其他PDF文件后无法删除PDF文件 - C# - ItextSharp

时间:2016-01-14 15:58:40

标签: c# pdf process itextsharp

我正在尝试使用iTextSharp库将PDF文件加载到一个新PDF中,并且我想在完成此操作后删除单个文件(从.DOC格式转换)。 / p>

这是附加所有文件的最后一段代码,这就是我认为问题所在:

    static void Concat(string targetPdf, string[] newPdfFiles)
    {
        using (FileStream stream = new FileStream(targetPdf, FileMode.Create))
        {
            iTextSharp.text.Document pdfDoc = new iTextSharp.text.Document(PageSize.A4);

            PdfCopy pdf = new PdfCopy(pdfDoc, stream);
            pdfDoc.Open();
            int i = 1;
            foreach (string file in orderedlist)
            {
                if (!(file.Contains("HR Policies and Procedures Guide")))
                {
                    var newFileName = "\\\\file\\IT\\SK\\test\\" + file.Split('.')[0] + ".pdf";
                    pdf.AddDocument(new PdfReader(newFileName));
                }
                i++;
            }

            pdf.Close();
            pdfDoc.Dispose();
        }
    }

在使用pdf.AddDocument(new PdfReader(newFileName));之前,我可以使用System.IO.File.Delete("\\\\Path\\To\\File.pdf");

删除任何PDF文件而不会出现任何问题

但是,如果我在运行AddDocument后尝试这样做,我会看到以下异常:

An unhandled exception of type 'System.IO.IOException' occurred in     mscorlib.dll

Additional information: The process cannot access the     file '\\file\IT\SK\test\HR Policies and Procedures Acceptance Form.pdf' because it is being used by another process.

我尝试在pdf和pdfDoc变量上调用.Close()和.Dispose(),但没有成功。

我还检查了我当前使用Process Explorer运行的进程,但有很多我不知道从哪里开始。

有没有人对如何克服这个问题有任何想法?

1 个答案:

答案 0 :(得分:1)

正如评论中提到的Skuzzbox一样,这里的实际罪魁祸首是PdfReader,我最初在调用pdf.AddDocument的同时宣布这一点(见问题)。

然而,首先声明它,调用它,然后单独处理该变量就释放了pdf文件,以便我可以自由删除它:

    static void Concat(string targetPdf, string[] newPdfFiles)
    {
        using (FileStream stream = new FileStream(targetPdf, FileMode.Create))
        {
            iTextSharp.text.Document pdfDoc = new iTextSharp.text.Document(PageSize.A4);

            PdfCopy pdf = new PdfCopy(pdfDoc, stream);
            pdfDoc.Open();
            foreach (string file in orderedlist)
            {
                if (!(file.Contains("HR Policies and Procedures Guide")))
                {
                    var newFileName = "\\\\file\\IT\\SK\\test\\" + file.Split('.')[0] + ".pdf";

                    PdfReader test = new PdfReader(newFileName);
                    pdf.AddDocument(test);
                    test.Dispose();

                    // Delete the individual pdf ..
                    System.IO.File.Delete(newFileName);
                }

                pdfDoc.Close();
                pdf.Close(); 
            }
        }
    }

这是有道理的,因为那是实际捕获文件的变量。虽然我尝试Dispose of / Close的其他进程正在操作文件,但PdfReader变量代表实际的pdf文件。

修改已添加pdf.Close();pdfDoc.Close();,因为没有这些,pdf最终文件已损坏