关闭空的iTextSharp文档时出错

时间:2015-12-12 00:17:52

标签: c# pdf merge itextsharp

我正在成功合并PDF文档;现在我正在尝试实施错误处理,以防没有选择PDF文档,它会在关闭文档时抛出错误:文档没有页面
如果没有在" foreach"中添加PDF文档 - 循环,我仍然需要关闭文件!?或不?如果你打开一个物体,那么它在某个时刻就会被关闭。那么如果没有添加页面,如何正确转义呢?

        private void MergePDFs()
    {
        DataSourceSelectArguments args = new DataSourceSelectArguments();
        DataView view = (DataView)SourceCertCockpit.Select(args);

        System.Data.DataTable table = view.ToTable();
        List<PdfReader> readerList = new List<PdfReader>();

        iTextSharp.text.Document document = new iTextSharp.text.Document();
        PdfCopy copy = new PdfCopy(document, Response.OutputStream);
        document.Open();

        int index = 0;
        foreach (DataRow myRow in table.Rows)
        {
            if (ListadoCertificadosCockpit.Rows[index].Cells[14].Text == "0")
            {
                PdfReader Reader = new PdfReader(Convert.ToString(myRow[0]));
                Chapter Chapter = new Chapter(Convert.ToString(Convert.ToInt32(myRow[1])), 0);
                Chapter.NumberDepth = 0;
                iTextSharp.text.Section Section = Chapter.AddSection(Convert.ToString(myRow[10]), 0);
                Section.NumberDepth = 0;
                iTextSharp.text.Section SubSection = Section.AddSection(Convert.ToString(myRow[7]), 0);
                SubSection.NumberDepth = 0;
                document.Add(Chapter);
                readerList.Add(Reader);
                for (int i = 1; i <= Reader.NumberOfPages; i++)
                {
                    copy.AddPage(copy.GetImportedPage(Reader, i));
                }
                Reader.Close();
            }
            index++;
        }

        if (document.PageNumber == 0)
        {
            document.Close();
            return;
        }
        document.Close();
        string SalesID = SALESID.Text;
        Response.ContentType = "application/pdf";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.AppendHeader("content-disposition", "attachment;filename=" + SalesID + ".pdf");
    }

3 个答案:

答案 0 :(得分:5)

在过去,iText在您创建文档并“忘记”添加任何内容时没有抛出异常。这导致文档具有单个空白页面。这被认为是一个错误:人们不喜欢单页空文档。因此设计决定抛出异常。

newPage()做了类似的事情。可以显式触发新页面(在代码中添加document.newPage()时)或隐式触发(当到达页面末尾时)。在过去,这往往导致不需要的空白页。因此,如果当前页面为空,则决定忽略newPage()

假设你有这个:

document.newPage();
document.newPage();

可以预期会创建两个新页面。这不是真的。我们已做出设计决定忽略第二个document.newPage(),因为在第一个document.newPage()之后没有添加任何内容。

这给我们带来了一个问题:如果我们要插入空白页怎么办?或者,在您的情况下:如果可以创建一个只有一个空白页的文档,该怎么办?

在这种情况下,我们必须告诉iText当前页面不应被视为空页面。您可以通过引入以下行来完成此操作:

writer.setPageEmpty(false);

现在,当前页面会被愚弄,认为它有一些内容,即使它可能是空白的。

将此行添加到代码中将避免文档没有页面异常,并解决您的流未被关闭的问题。

如果您想体验setPageEmpty()方法,请查看NewPage示例。

答案 1 :(得分:2)

您可以在关闭文档之前添加空白页面,或捕获异常并忽略它。

答案 2 :(得分:0)

如果您仍然对解决方案感兴趣,或者可能是其他人。 我遇到了完全相同的问题,并通过以下方法解决了问题: 声明一个布尔值以判断是否已添加至少一页,并且在关闭我引用的文档之前。 如果没有页面被复制,那么我要使用AddPages方法在文档中添加一个新页面,并以矩形作为参数。我没有找到添加页面的最简单方法。

所以代码应该像下面这样(可能有一些语法错误,因为我不熟悉C#):

private void MergePDFs()
{
    DataSourceSelectArguments args = new DataSourceSelectArguments();
    DataView view = (DataView)SourceCertCockpit.Select(args);

    System.Data.DataTable table = view.ToTable();
    List<PdfReader> readerList = new List<PdfReader>();

    iTextSharp.text.Document document = new iTextSharp.text.Document();
    PdfCopy copy = new PdfCopy(document, Response.OutputStream);
    document.Open();

    int index = 0;
    foreach (DataRow myRow in table.Rows)
    {
        if (ListadoCertificadosCockpit.Rows[index].Cells[14].Text == "0")
        {
            PdfReader Reader = new PdfReader(Convert.ToString(myRow[0]));
            Chapter Chapter = new Chapter(Convert.ToString(Convert.ToInt32(myRow[1])), 0);
            Chapter.NumberDepth = 0;
            iTextSharp.text.Section Section = Chapter.AddSection(Convert.ToString(myRow[10]), 0);
            Section.NumberDepth = 0;
            iTextSharp.text.Section SubSection = Section.AddSection(Convert.ToString(myRow[7]), 0);
            SubSection.NumberDepth = 0;
            document.Add(Chapter);
            readerList.Add(Reader);
            bool AtLeastOnePage = false;
            for (int i = 1; i <= Reader.NumberOfPages; i++)
            {
                copy.AddPage(copy.GetImportedPage(Reader, i));
                 AtLeastOnePage = true;
            }
            Reader.Close();
        }
        index++;
    }

     if (AtLeastOnePage)
        {
            document.Close();
            return true;
        }
        else
        {
            Rectangle rec = new Rectangle(10, 10, 10, 10);
            copy.AddPage(rec, 1);
            document.Close();
            return false;
        }
    string SalesID = SALESID.Text;
        Response.ContentType = "application/pdf";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.AppendHeader("content-disposition", "attachment;filename=" + SalesID + ".pdf");
}