При создании pdf в asp. net возникает проблема - PullRequest
0 голосов
/ 13 июля 2020

Я использую Visual Studio 2019 с C#. Когда я пытаюсь создать PDF-документ, он успешно создается, но когда он открывается методом Response, отображается сообщение об ошибке «Acrobat Reader не может открыть файл, потому что это не так. поддерживаемый тип файла ".

enter code here

введите описание изображения здесь

Я использую следующий код.

 protected void Exportpdf()
        {
 string path = System.IO.Path.GetTempPath();
            PdfWriter writer = new PdfWriter(path+ "\\Appointments" + DateTime.Now.ToString("ddMMyyyy") + ".pdf");
            PdfDocument pdf = new PdfDocument(writer);
            Document document = new Document(pdf, PageSize.A4);
  Paragraph header = new Paragraph("MyTurns.in")
               .SetTextAlignment(TextAlignment.CENTER)
               .SetFontSize(20);

            // New line
            Paragraph newline = new Paragraph(new Text("\n"));

            document.Add(newline);
            document.Add(header);

            // Add sub-header
            Paragraph subheader = new Paragraph("Appointment List Date : " + DateTime.Now.ToString("dd/mm/yyyy"))
               .SetTextAlignment(TextAlignment.CENTER)
               .SetFontSize(15);
            document.Add(subheader);
 document.Close();
            Response.Buffer = false;
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment;filename=Appointments" + DateTime.Now.ToString("dd/MM/yyyy") + ".pdf");
            Response.Write(document);
           
            Response.End();
}

1 Ответ

0 голосов
/ 14 июля 2020

Вы пытаетесь вернуть сгенерированный PDF-файл, написав объект document:

Response.Write(document);

Это неверно, потому что iText 7 Document является просто фасадом для добавления содержимого в PdfDocument ( ваш объект pdf), который, в свою очередь, также не содержит PDF, но записывает его через свой PdfWriter в вашем коде в файл по адресу

path+ "\\Appointments" + DateTime.Now.ToString("ddMMyyyy") + ".pdf"

Таким образом, что вы должны написать в ответ является содержимым этого файла.

Поскольку DateTime.Now тем временем был изменен, вы должны сначала сгенерировать этот путь в переменной и использовать эту переменную в обоих местах.

Кроме того, как сказал Альберт Д. Каллал уже прокомментирован, он должен быть записан как двоичный, используя BinaryWrite.

В качестве альтернативы, если вам действительно не нужны результаты pdf в файловой системе, вы можете использовать MemoryStream вместо фактического файла системный файл.

В комментариях и ответах вы указали, что файл в файловой системе вас действительно совсем не интересует. Таким образом, вы должны использовать MemoryStream. Вы уже нашли пример кода для использования MemoryStream с iText 5. Соответствующий пример для iText 7 будет выглядеть так:

using (MemoryStream stream = new MemoryStream())
{
    using (PdfWriter writer = new PdfWriter(stream))
    using (PdfDocument pdf = new PdfDocument(writer))
    using (Document document = new Document(pdf, PageSize.A4))
    {
        Paragraph header = new Paragraph("MyTurns.in")
           .SetTextAlignment(TextAlignment.CENTER)
           .SetFontSize(20);

        // New line
        Paragraph newline = new Paragraph(new Text("\n"));

        document.Add(newline);
        document.Add(header);

        // Add sub-header
        Paragraph subheader = new Paragraph("Appointment List Date : " + DateTime.Now.ToString("dd/mm/yyyy"))
           .SetTextAlignment(TextAlignment.CENTER)
           .SetFontSize(15);
        document.Add(subheader);
    }

    Response.Buffer = false;
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=Appointments" + DateTime.Now.ToString("dd/MM/yyyy") + ".pdf");
    Response.BinaryWrite(stream.ToArray());
}

Кстати, что касается вашей строки

Response.End();

, вам, вероятно, следует прочитать ASP. NET документацию по нему

Это Метод предоставляется только для совместимости с ASP, то есть для совместимости с технологией веб-программирования на основе COM, которая предшествовала ASP. NET. Если вы хотите перейти к событию EndRequest и отправить ответ клиенту, обычно предпочтительнее вместо этого позвонить CompleteRequest.

и пересмотреть его использование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...