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