Bar*_*eck 2 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");
}
Run Code Online (Sandbox Code Playgroud)
在过去,iText在您创建文档并"忘记"添加任何内容时没有抛出异常.这导致文档具有单个空白页面.这被认为是一个错误:人们不喜欢单页空文档.因此设计决定抛出异常.
做了类似的事情newPage().可以显式触发新页面(当您添加document.newPage()代码时)或隐式触发(当到达页面末尾时).在过去,这往往导致不需要的空白页.因此,newPage()在当前页面为空的情况下决定忽略.
假设你有这个:
document.newPage();
document.newPage();
Run Code Online (Sandbox Code Playgroud)
可以预期会创建两个新页面.这不是真的.我们做出了一个设计决定,忽略了第二个,document.newPage()因为在第一个之后没有添加任何内容document.newPage().
这给我们带来了一个问题:如果我们要插入空白页怎么办?或者,在您的情况下:如果可以创建一个只有一个空白页的文档,该怎么办?
在这种情况下,我们必须告诉iText当前页面不应被视为空页面.您可以通过引入以下行来实现:
writer.setPageEmpty(false);
Run Code Online (Sandbox Code Playgroud)
现在,当前页面会被愚弄,认为它有一些内容,即使它可能是空白的.
将此行添加到代码中将避免文档没有页面异常并解决您的流未被关闭的问题.
如果要试验该方法,请查看NewPage示例setPageEmpty().