Mam ten kod demonstracyjny dla 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();
Jak sprawić, by kontroler zwrócił dokument pdf do przeglądarki?
EDYTOWAĆ:
Uruchomienie tego kodu powoduje otwarcie programu Acrobat, ale pojawia się komunikat o błędzie „Plik jest uszkodzony i nie można go naprawić”
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");
}
Jakieś pomysły, dlaczego to nie działa?
c#
asp.net
asp.net-mvc
pdf
itextsharp
Tony Borf
źródło
źródło
Odpowiedzi:
Zwróć
FileContentResult
. Ostatni wiersz akcji kontrolera wyglądałby tak:Jeśli generujesz ten plik PDF dynamicznie, może lepiej jest użyć a
MemoryStream
i utworzyć dokument w pamięci zamiast zapisywać do pliku. Kod wyglądałby tak:źródło
Mam to działające z tym kodem.
źródło
using
w żadnym przykładzie nie ma ani jednego stwierdzenia, które mogę znaleźć ... Czy nie jest to tutaj potrzebne? Myślę, że masz co najmniej 3 przedmioty jednorazowego użytku ...Musisz określić:
Aby plik mógł zostać otwarty bezpośrednio w przeglądarce zamiast pobierania
źródło
Jeśli zwrócisz a
FileResult
ze swojej metody akcji i użyjeszFile()
metody rozszerzenia na kontrolerze, robienie tego, co chcesz, jest dość łatwe. Istnieją przesłonięciaFile()
metody, która pobierze binarną zawartość pliku, ścieżkę do pliku lub plikStream
.źródło
Napotkałem podobne problemy i znalazłem rozwiązanie. Użyłem dwóch stanowisk, jeden od stosu , który przedstawia sposób, aby powrócić do pobrania i innego jeden , który pokazuje roztwór roboczy dla iTextSharp i MVC.
źródło
Możesz utworzyć klasę niestandardową, aby zmodyfikować typ zawartości i dodać plik do odpowiedzi.
http://haacked.com/archive/2008/05/10/writing-a-custom-file-download-action-result-for-asp.net-mvc.aspx
źródło
Wiem, że to pytanie jest stare, ale pomyślałem, że podzielę się nim, ponieważ nie mogłem znaleźć niczego podobnego.
Chciałem normalnie tworzyć widoki / modele przy użyciu Razor i renderować je jako pliki PDF .
W ten sposób miałem kontrolę nad prezentacją pdf, używając standardowego wyjścia HTML, zamiast zastanawiać się, jak ułożyć dokument za pomocą iTextSharp.
Projekt i kod źródłowy są dostępne tutaj wraz z instrukcjami instalacji nuget:
https://github.com/andyhutch77/MvcRazorToPdf
źródło
FileStreamResult
z pewnością działa. Ale jeśli spojrzysz na Microsoft Docs , dziedziczy on zActionResult -> FileResult
, który ma inną klasę pochodnąFileContentResult
. „Wysyła zawartość pliku binarnego do odpowiedzi”. Więc jeśli już maszbyte[]
, po prostu użyjFileContentResult
zamiast tego.źródło
Zwykle zrobiłbyś Response.Flush, po którym następuje Response.Close, ale z jakiegoś powodu biblioteka iTextSharp nie wydaje się to lubić. Dane się nie przedostają, a Adobe uważa, że plik PDF jest uszkodzony. Pomiń funkcję Response.Close i sprawdź, czy wyniki są lepsze:
źródło
jeśli nazwa pliku jest generowana dynamicznie, to jak zdefiniować tutaj nazwę pliku, jest generowana przez guid tutaj.
źródło
Obejrzyj stronę:
Kontroler skanowania:
źródło