это моя первая публикация на 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();
Любая помощь будет принята с благодарностью.
Спасибо