保存由代码创建的PDF文件

本文关键字:PDF 文件 创建 代码 保存 | 更新日期: 2023-09-27 18:13:29

我有一个用作模板的PNG文件,然后我使用PDFSharp。在图像上绘制并写入,从而生成PDF格式的证书,如下所示:

PdfDocument document = new PdfDocument();
document.Info.Title = "Created with PDFsharp";
// Create an empty page 
PdfPage page = document.AddPage();
page.Width = 419;
page.Height = 595;
page.Orientation = PdfSharp.PageOrientation.Landscape;
// Get an XGraphics object for drawing 
XGraphics gfx = XGraphics.FromPdfPage(page);
// Draw background
gfx.DrawImage(XImage.FromFile(Server.MapPath("~/Content/Images/Certificate/MyCertificate.png")), 0, 0, 595, 419);
// Create fonts
XFont font = new XFont("Verdana", 20, XFontStyle.Regular);
// Draw the text and align on page.
gfx.DrawString("Name", font, XBrushes.Black, new XRect(0, 77, page.Width, 157), XStringFormats.Center);

这可以在我的默认PDF查看器中打开它(在我的情况下是Edge),我可以从那里保存,但是当我试图从网站而不是PDF查看器中保存时,我只保存模板,而不是写在上面的任何文本。

我保存文件的代码在这里:

Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=MyCertificate.pdf");
Response.TransmitFile(Server.MapPath("~/Content/Images/Certificate/MyCertificate.png"));
Response.End();

我很确定我只保存模板的原因是因为我将Server MapPath设置为模板的位置,但是完成的证书实际上从未保存在我们这边。

我怎么能保存PDF(与文本),而不是只是模板,如果它不是保存在任何地方在手我这边?

谢谢。

保存由代码创建的PDF文件

您必须使用MemoryStream将PDF写入浏览器。使用AppendHeader将PDF名称添加到标题中不会将其发送到浏览器。

//create an empty byte array
byte[] bin;
//'using' ensures the MemoryStream will be disposed correctly
using (MemoryStream stream = new MemoryStream())
{
    //save the pdf to the stream
    document.Save(stream, false);
    //fill the byte array with the pdf bytes from stream
    bin = stream.ToArray();
}
//clear the buffer stream
Response.ClearHeaders();
Response.Clear();
Response.Buffer = true;
//set the correct ContentType
Response.ContentType = "application/pdf";
//set the correct length of the string being send
Response.AddHeader("content-length", bin.Length.ToString());
//set the filename for the pdf
Response.AddHeader("content-disposition", "attachment; filename='"MyCertificate.pdf'"");
//send the byte array to the browser
Response.OutputStream.Write(bin, 0, bin.Length);
//cleanup
Response.Flush();
Response.Close();