Сохранить PDF-файл, созданный из кода

#c# #.net #pdf #model-view-controller

#c# #.net #PDF #модель-представление-контроллер

Вопрос:

У меня есть 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();
  

Я совершенно уверен, что причина, по которой я сохраняю только шаблон, заключается в том, что я установил путь отображения сервера в местоположение шаблона, но готовый сертификат никогда не сохраняется на нашей стороне.

Как я могу сохранить PDF-файл (с текстом) вместо только шаблона, если он нигде не сохранялся ранее -вручную на моей стороне?

Спасибо.

Комментарии:

1. Почему вы отправляете png клиенту?

Ответ №1:

Вы должны записать PDF-файл в браузер, используя MemoryStream . Добавление имени PDF в заголовок с AppendHeader помощью не отправляет его в браузер.

 //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();