【问题标题】:How to unlock files for Deletion after merging PDFs together如何在合并 PDF 后解锁文件以进行删除
【发布时间】:2016-06-25 07:31:29
【问题描述】:

更新

查看完整解决方案的答案。


我现在更新了代码,最后几行如下:

       reader.Close();
        f++;
        if (f >= orderedList.Count) continue;
        reader = new PdfReader(targetFolder + orderedList[f]);
        // we retrieve the total number of pages
        n = reader.NumberOfPages;
        pdfNewPageFlag = true;
       reader.Close();
    }
}

并且文档已成功完成,但最终的 PDF 已损坏(我假设是因为它没有正确关闭)


作为 Word 到 PDF 转换和合并过程的一部分,我正在运行以下方法将所有 PDF 合并为 1 个超级 PDF(使用 iTextSharp.text.pdf):

    public void Pdfs(string targetPdf, List<string> orderedList, string targetFolder, string spSite)
    {
        var f = 0;
        // we create a reader for a certain document
        var reader = new PdfReader(targetFolder + orderedList[f]);
        // we retrieve the total number of pages
        var n = reader.NumberOfPages;
        // step 1: creation of a document-object
        var document = new iTextSharp.text.Document(reader.GetPageSizeWithRotation(1));
        
        // step 2: we create a writer that listens to the document
        var writer = PdfWriter.GetInstance(document, new FileStream(targetPdf, FileMode.Create));
        // step 3: we open the document
        document.Open();
        var cb = writer.DirectContent;
        PdfImportedPage page;
        int rotation;
        // step 4: we add content
        var pdfPageName = 0;
        var pdfNewPageFlag = true;
        while (f < orderedList.Count)
        {
            var i = 0;
            while (i < n)
            {
                i++;
                document.SetPageSize(reader.GetPageSizeWithRotation(i));
                document.NewPage();
                if (pdfNewPageFlag)
                {
                    var chapter = new iTextSharp.text.Chapter(orderedList[pdfPageName], pdfPageName + 1);
                    document.Add(chapter);
                    pdfNewPageFlag = false;
                    pdfPageName++;
                }

                page = writer.GetImportedPage(reader, i);
                rotation = reader.GetPageRotation(i);

                if (rotation == 90 || rotation == 270)
                {
                    cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
                }
                else
                {
                    cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                }
            }
            f++;
            if (f >= orderedList.Count) continue;
            reader = new PdfReader(targetFolder + orderedList[f]);
            // we retrieve the total number of pages
            n = reader.NumberOfPages;
            pdfNewPageFlag = true;
        }

        // step 5: we close the document
        document.Close();
    }

此方法还在每个原始文档的开头创建一个书签。文档全部合并后,我将调用此方法删除文件:

    private static void DeletePdfs()
    {
        // Delete the files
        foreach (var file in orderedListPdfFileNames)
        {
            var newFileName = tempfolder + file;
            File.Delete(newFileName);
        }
    }

但是在尝试实际删除文件时,我看到了这个异常:

在 mscorlib.dll 中发生了“System.IO.IOException”类型的未处理异常

附加信息:该进程无法访问文件“\file\IT\SK\test\HrDocs\Cover.pdf”,因为它正被另一个进程使用。

PDFs 方法中,我尝试在document.Close() 之前和之后调用writer.Close()reader.Close(),但随后收到消息Cannot close a document which is already closed

有没有人能帮忙解决这个问题或为我指明正确的方向?我似乎无法弄清楚合并过程的哪一部分正在锁定文件!

【问题讨论】:

  • 考虑关闭所有PdfReader 实例。
  • @mkl 我在pdfNewPageFlag = true;之后直接添加了reader.Close();,但是随后document.Close();返回错误(文件已经关闭)!如果我删除 document.Close(); 则删除时出错!
  • @mkl 似乎按照我在回答中所做的更改代码后,最终的 PDF 似乎已损坏,我无法打开它!这里面还是有一些不足的地方
  • 是的,您必须关闭 document 以及所有 PdfReader 实例。如果在文档之前关闭阅读器不起作用,您将不得不在之后关闭它们。收集您为此在列表中打开的所有读者。

标签: c# pdf itextsharp


【解决方案1】:

这只是没有在正确的地方关闭阅读器的情况。

正如mkl在cmets中提到的,如果document.Close()在关闭阅读器后失败,那么我需要在之后关闭阅读器。

在下面的修改中,我在创建后将每个阅读器添加到一个列表中,它们最后都关闭了:

    public void Pdfs(string targetPdf, List<string> orderedList, string targetFolder, string spSite)
    {
        var readerlist = new List<PdfReader>();

        var f = 0;
        // we create a reader for a certain document
        var reader = new PdfReader(targetFolder + orderedList[f]);
        readerlist.Add(reader);

        // we retrieve the total number of pages
        var n = reader.NumberOfPages;
        // step 1: creation of a document-object
        var document = new iTextSharp.text.Document(reader.GetPageSizeWithRotation(1));

        // step 2: we create a writer that listens to the document
        var writer = PdfWriter.GetInstance(document, new FileStream(targetPdf, FileMode.Create));
        // step 3: we open the document
        document.Open();
        var cb = writer.DirectContent;
        PdfImportedPage page;
        int rotation;
        // step 4: we add content
        var pdfPageName = 0;
        var pdfNewPageFlag = true;
        while (f < orderedList.Count)
        {
            var i = 0;
            while (i < n)
            {
                i++;
                document.SetPageSize(reader.GetPageSizeWithRotation(i));
                document.NewPage();
                if (pdfNewPageFlag)
                {
                    var chapter = new iTextSharp.text.Chapter(orderedList[pdfPageName], pdfPageName + 1);
                    document.Add(chapter);
                    pdfNewPageFlag = false;
                    pdfPageName++;
                }

                page = writer.GetImportedPage(reader, i);
                rotation = reader.GetPageRotation(i);

                if (rotation == 90 || rotation == 270)
                {
                    cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
                }
                else
                {
                    cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                }
            }

            f++;
            if (f >= orderedList.Count) continue;
            reader = new PdfReader(targetFolder + orderedList[f]);
            readerlist.Add(reader);

            // we retrieve the total number of pages
            n = reader.NumberOfPages;
            pdfNewPageFlag = true;
        }

        // step 5: we close the document
        document.Close();

        foreach (var rdr in readerlist)
        {
            rdr.Close();
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2010-09-26
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多