Отправляйте PDF в браузер вместо сохранения на сервер - ASP. NET iText 7 C# Веб-формы - PullRequest
1 голос
/ 09 июля 2020

это моя первая публикация на SO

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

Я бы хотел, чтобы документ был отправлен по адресу браузер, чтобы он либо сохранялся в папке "Загрузки", либо пользователь мог выбрать, где сохранить его, в диалоговом окне сохранения браузера.

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

Я изучаю это в течение нескольких дней и барахтаюсь с решениями, вот что у меня есть:

public void mtdCreatePDF()
{
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=print.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
var stream = new MemoryStream();
var writer = new PdfWriter(stream);
var pdf = new PdfDocument(writer);
var document = new Document(pdf);

document.Add(new Paragraph("Hello world!"));
document.Close();

Response.Write(document);
Response.End();

}

Это создает файл print.pdf в папке загрузок браузера, но файл поврежден.

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

Я нашел одно возможное решение, которое выглядит хорошо, но, к сожалению, он находится в Java. Я целую вечность бродил вокруг, пытаясь преобразовать его в C#, но я не знаю ни одного Java, поэтому он превратился в завтрак для свиней. Это решение Java:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(baos));
Document doc = new Document(pdfDoc);
doc.add(new Paragraph("Hello world!"));
doc.close();

// setting some response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
// setting the content type
response.setContentType("application/pdf");
// the contentlength
response.setContentLength(baos.size());
// write ByteArrayOutputStream to the ServletOutputStream
OutputStream os = response.getOutputStream();
baos.writeTo(os);
os.flush();
os.close();

Любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

1 голос
/ 09 июля 2020

Кажется, это решение работает отлично.

public void mtdCreatePDF()
        {
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment;filename=print.pdf");
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            var stream = new MemoryStream();
            var writer = new PdfWriter(stream);
            var pdf = new PdfDocument(writer);
            var document = new Document(pdf);
            document.Add(new Paragraph("Hello world!"));
            document.Close();
            Response.BinaryWrite(stream.ToArray());
            Response.End();
        }
...