C# 下载时生成空白pdf-ItextSharp

C# 下载时生成空白pdf-ItextSharp,c#,asp.net,itext,C#,Asp.net,Itext,我正在尝试生成一个简单的PDF文档,可以从asp.net网页下载。此pdf文档有一个带有标题文本的段落,其余内容通过预填充的DataTable实例填充。我在这里试图打印的所有列都是文本,只有一列是图像(缩略图) 我可以执行附加的代码,没有例外,pdf文件将生成并下载到客户端浏览器 问题:用户可以在浏览器中查看此下载的pdf(仅使用IE和Chrome进行测试),并可以查看pdf中的所有内容,包括缩略图。但是,当他们将生成的pdf保存到本地驱动器并打开它时,所有pdf页面都是空白的 我已经有一段时间

我正在尝试生成一个简单的PDF文档,可以从asp.net网页下载。此pdf文档有一个带有标题文本的段落,其余内容通过预填充的DataTable实例填充。我在这里试图打印的所有列都是文本,只有一列是图像(缩略图)

我可以执行附加的代码,没有例外,pdf文件将生成并下载到客户端浏览器

问题:用户可以在浏览器中查看此下载的pdf(仅使用IE和Chrome进行测试),并可以查看pdf中的所有内容,包括缩略图。但是,当他们将生成的pdf保存到本地驱动器并打开它时,所有pdf页面都是空白的

我已经有一段时间心烦意乱了,任何暗示都会很有帮助

在服务器端事件中生成PDF的代码

private void Download()
    {

        var document = new Document();

        try
        {
            var dataTable = GetDataTable(parameters); //this line create and fill a DataTable with some values


            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition","attachment;filename=sample.pdf");

            Response.Cache.SetCacheability(HttpCacheability.NoCache);

            PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream);//get a pdf writer instance

            document.Open();

            //Create table

            var pdfTable = DocumentManager.CreateTable(dataTable.Columns.Count, new[] { 30f, 130f, 130f, 80f, 60f, 80f, 60f, 80f, 60f, 60f, 80f, 80f, 60f });

  //Create a simple heading
                var heading = new StringBuilder();
                heading.AppendLine("Summary");


            var contentFont = DocumentManager.GetFont(5);
            var genHeadingFont = DocumentManager.GetFont(6, true);

            var image = iTextSharp.text.Image.GetInstance(HttpContext.Current.Server.MapPath("/images/some.png"));
            image.WidthPercentage = 25;
            image.Alignment = iTextSharp.text.Image.ALIGN_RIGHT;
            document.Add(image);
            document.Add(new Paragraph(heading.ToString(), contentFont));
            //Create column heading
            DocumentManager.CreateColums(pdfTable, dataTable, genHeadingFont);
            //Create cells and fill with values
            DocumentManager.CreateCellAndFillValue(pdfTable, dataTable.Select(), contentFont, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 });
            document.Add(pdfTable);
            Response.Write(document);
            document.Close();

        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {

        }
    }
引用的方法(DocumentManager类的一部分)

公共静态PdfPTable CreateTable(int columnSpan,float[]columnWidths)
{
var表格=新的PdfPTable(columnSpan);
表.设置宽度(列宽度);
表1.TotalWidth=1000f;
表1.1:百分比=100;
返回表;
}
公共静态字体GetFont(int-size,bool-isBold=false)
{
返回FontFactory.GetFont(“Calibri”,size,isBold?Font.BOLD:Font.NORMAL);
}
公共静态void createColumns(PdfPTable pdfTable、DataTable dataColumns、Font Columns、,
列表列stoexclude=null,BaseColor backGround=null)
{
columnsToExclude=columnsToExclude??新建列表();
弗雷奇(
风险值c
从dataColumns.Columns中的DataColumn c,其中!columnsToExclude.Contains(c.ColumnName)选择c)
{
var cell=new PdfPCell(新短语(c.ColumnName,columnsFont)){BackgroundColor=backGround??new BaseColor(164183210),horizontallignment=Element.ALIGN_MIDDLE};
cell.PaddingBottom=3f;
cell.PaddingTop=3f;
cell.PaddingLeft=3f;
cell.PaddingRight=3f;
pdfTable.AddCell(cell);
}
}
公共静态void CreateCellAndFillValue(PdfPTable表,DataRow[]dataRows,Font cellFont,
int[]columnIndex=null,string[]columnNames=null)
{
if(columnIndex!=null&&columnIndex.Length!=0)
{
CreateCellValueUsingIndex(表、数据行、cellFont、columnIndex);
返回;
}
if(columnNames!=null&&columnNames.Length!=0)
{
CreateCellValueUsingColumnName(表、数据行、cellFont、columnNames);
}
}
公共静态void CreateCellValueUsingIndex(PdfPTable表、IEnumerable数据行、Font cellFont、int[]columnIndex)
{
foreach(数据行中的var r)
{
foreach(列索引中的var索引)
{
if(index!=1)//值列
{
var cell=newpdfpcell(新短语(r[index].ToString(),cellFont));
cell.PaddingBottom=2f;
cell.PaddingTop=2f;
cell.PaddingLeft=2f;
cell.PaddingRight=2f;
cell.HorizontalAlignment=Element.ALIGN_CENTER;
表2.AddCell(cell);
}
else//图像列
{
iTextSharp.text.Image Image=iTextSharp.text.Image.GetInstance(r[index].ToString());
image.Alignment=iTextSharp.text.image.ALIGN\u居中;
PdfPCell imgCell=新的PdfPCell();
AddElement(新块(图像,0,0));
表2.AddCell(imgCell);
}
}
}
}
公共静态void CreateCellValueUsingColumnName(PdfPTable表、IEnumerable数据行、字体cellFont、,
字符串[]列名称)
{
foreach(数据行中的var r)
{
foreach(columnNames中的变量名)
{
table.AddCell(新短语(r[name].ToString(),cellFont));
}
}
}

你把所有东西都弄混了,所以可能会有点混乱。将您想做的事情分离到各自的功能中

此方法的唯一职责是创建PDF

private void CreatePdf(Stream output) {
    var document = new Document();

    try {
        var dataTable = GetDataTable(parameters); //this line create and fill a DataTable with some values
        //get a pdf writer instance
        PdfWriter writer = PdfWriter.GetInstance(document, output);
        //open the document
        document.Open();
        //Create table
        var pdfTable = DocumentManager.CreateTable(dataTable.Columns.Count, new[] { 30f, 130f, 130f, 80f, 60f, 80f, 60f, 80f, 60f, 60f, 80f, 80f, 60f });
        //Create a simple heading
        var heading = new StringBuilder();
        heading.AppendLine("Summary");

        var contentFont = DocumentManager.GetFont(5);
        var genHeadingFont = DocumentManager.GetFont(6, true);

        var image = iTextSharp.text.Image.GetInstance(HttpContext.Current.Server.MapPath("/images/some.png"));
        image.WidthPercentage = 25;
        image.Alignment = iTextSharp.text.Image.ALIGN_RIGHT;
        document.Add(image);
        document.Add(new Paragraph(heading.ToString(), contentFont));
        //Create column heading
        DocumentManager.CreateColums(pdfTable, dataTable, genHeadingFont);
        //Create cells and fill with values
        DocumentManager.CreateCellAndFillValue(pdfTable, dataTable.Select(), contentFont, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 });
        document.Add(pdfTable);

        // make sure any data in the buffer is written to the output stream
        writer.Flush();
    } finally {
        document.Close();
    }
}
这将使您的
下载更加精简

private void Download() {
    Response.ContentType = "application/pdf;";
    Response.AddHeader("content-disposition","attachment;filename=sample.pdf");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    // stream to store generated document
    var output = new MemoryStream();
    // generate document
    CreatePdf(output);
    // pass the generated data to the response output stream
    Response.OutputStream.Write(output.GetBuffer(), 0, output.Length);
}

通过将责任分开,你会注意到你的错误在原来的岗位上。文档在发送到响应中之前已刷新并完全关闭。当您试图保存文档时,它应该具有保存完整文档所需的所有数据。

Oops,从该屏幕截图中,我看到版权年份没有更新。将在5.5.10中固定。这是一个很好的观点。谢谢我。我会检查一下并让你知道的。谢谢你的时间。首先,我真的很喜欢逻辑的分离,并且完全同意这一点。但是,我没有在内容类型中获得
utf-8
部分。PDF是二进制文件(尽管您有时可以在记事本中读取它们),因此字符编码在传输级别没有意义。PDF内部可能有或可能没有不同的规则,但这不应影响传输。即使这是有意义的(事实并非如此),就我所知,零件应该是
charset=utf-8
@ChrisHaas,请检查一下,您是ab
private void Download() {
    Response.ContentType = "application/pdf;";
    Response.AddHeader("content-disposition","attachment;filename=sample.pdf");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    // stream to store generated document
    var output = new MemoryStream();
    // generate document
    CreatePdf(output);
    // pass the generated data to the response output stream
    Response.OutputStream.Write(output.GetBuffer(), 0, output.Length);
}