У меня есть этот демонстрационный код для iTextSharp
Document document = new Document();
try
{
PdfWriter.GetInstance(document, new FileStream("Chap0101.pdf", FileMode.Create));
document.Open();
document.Add(new Paragraph("Hello World"));
}
catch (DocumentException de)
{
Console.Error.WriteLine(de.Message);
}
catch (IOException ioe)
{
Console.Error.WriteLine(ioe.Message);
}
document.Close();
Как заставить контроллер вернуть PDF-документ в браузер?
РЕДАКТИРОВАТЬ:
Запуск этого кода открывает Acrobat, но я получаю сообщение об ошибке «Файл поврежден и не может быть восстановлен»
public FileStreamResult pdf()
{
MemoryStream m = new MemoryStream();
Document document = new Document();
PdfWriter.GetInstance(document, m);
document.Open();
document.Add(new Paragraph("Hello World"));
document.Add(new Paragraph(DateTime.Now.ToString()));
m.Position = 0;
return File(m, "application/pdf");
}
Есть идеи, почему это не работает?
c#
asp.net
asp.net-mvc
pdf
itextsharp
Тони Борф
источник
источник
Ответы:
Вернуть
FileContentResult
. Последняя строка в действии вашего контроллера будет примерно такой:Если вы создаете этот PDF-файл динамически, может быть лучше использовать
MemoryStream
, и создать документ в памяти, а не сохранять в файл. Код будет примерно таким:источник
Я получил работу с этим кодом.
источник
using
в одном примере, который я могу найти, нет ни одного утверждения ... Разве здесь оно не нужно? Я думаю, у вас есть как минимум 3 одноразовых предмета ...Вы должны указать:
Чтобы файл открывался прямо в браузере, а не загружался
источник
Если вы вернете
FileResult
из своего метода действия и используетеFile()
метод расширения на контроллере, сделать то, что вы хотите, довольно просто. Существуют переопределенияFile()
метода, который будет принимать двоичное содержимое файла, путь к файлу или файлStream
.источник
У меня были похожие проблемы, и я наткнулся на решение. Я использовал два сообщения, одно из стека , который показывает метод , чтобы вернуться для скачивания и еще один , который показывает рабочее решение для ItextSharp и MVC.
источник
Вы можете создать собственный класс, чтобы изменить тип контента и добавить файл в ответ.
http://haacked.com/archive/2008/05/10/writing-a-custom-file-download-action-result-for-asp.net-mvc.aspx
источник
Я знаю, что это старый вопрос, но я подумал, что поделюсь им, так как не нашел ничего похожего.
Я хотел создавать свои представления / модели как обычно, используя Razor, и отображать их как файлы PDF .
Таким образом, я мог контролировать презентацию pdf, используя стандартный вывод html, вместо того, чтобы выяснять, как разметить документ с помощью iTextSharp.
Проект и исходный код доступны здесь с инструкциями по установке nuget:
https://github.com/andyhutch77/MvcRazorToPdf
источник
FileStreamResult
конечно работает. Но если вы посмотрите на Microsoft Docs , то увидите , что он является наследником отActionResult -> FileResult
другого производного классаFileContentResult
. Он «отправляет в ответ содержимое двоичного файла». Так что, если у вас уже естьbyte[]
, просто используйтеFileContentResult
вместо него.источник
Обычно вы выполняете Response.Flush, а затем Response.Close, но по некоторым причинам библиотеке iTextSharp это не нравится. Данные не проходят, и Adobe считает, что PDF-файл поврежден. Оставьте функцию Response.Close и посмотрите, будут ли ваши результаты лучше:
источник
если имя файла генерируется динамически, то как определить имя файла здесь, оно генерируется через guid здесь.
источник
Просмотр страницы:
Контроллер сканирования:
источник