Ich habe diesen Demo-Code für 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();
Wie bringe ich den Controller dazu, das PDF-Dokument an den Browser zurückzugeben?
BEARBEITEN:
Durch Ausführen dieses Codes wird Acrobat geöffnet, es wird jedoch die Fehlermeldung "Die Datei ist beschädigt und konnte nicht repariert werden" angezeigt.
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");
}
Irgendwelche Ideen, warum das nicht funktioniert?
c#
asp.net
asp.net-mvc
pdf
itextsharp
Tony Borf
quelle
quelle
Antworten:
Rückgabe a
FileContentResult
. Die letzte Zeile in Ihrer Controller-Aktion wäre ungefähr so:Wenn Sie diese PDF-Datei dynamisch generieren, ist es möglicherweise besser, a zu verwenden
MemoryStream
und das Dokument im Speicher zu erstellen, als es in einer Datei zu speichern. Der Code wäre ungefähr so:quelle
Ich habe es mit diesem Code zum Laufen gebracht.
quelle
using
in keinem Beispiel eine einzige Aussage gibt, die ich finden kann ... Wird sie hier nicht benötigt? Ich denke, Sie haben mindestens 3 Einwegobjekte ...Sie müssen angeben:
Damit die Datei direkt im Browser geöffnet wird, anstatt heruntergeladen zu werden
quelle
Wenn Sie eine
FileResult
von Ihrer Aktionsmethode zurückgeben und dieFile()
Erweiterungsmethode auf dem Controller verwenden, ist es ziemlich einfach, das zu tun, was Sie wollen. Es gibt Überschreibungen für dieFile()
Methode, die den binären Inhalt der Datei, den Pfad zur Datei oder a übernimmtStream
.quelle
Ich bin auf ähnliche Probleme gestoßen und bin auf eine Lösung gestoßen. Ich habe zwei Beiträge verwendet, einen vom Stapel , der die Methode zum Zurückgeben zum Herunterladen zeigt, und einen anderen , der eine funktionierende Lösung für ItextSharp und MVC zeigt.
quelle
Sie können eine benutzerdefinierte Klasse erstellen, um den Inhaltstyp zu ändern und die Datei zur Antwort hinzuzufügen.
http://haacked.com/archive/2008/05/10/writing-a-custom-file-download-action-result-for-asp.net-mvc.aspx
quelle
Ich weiß, dass diese Frage alt ist, aber ich dachte, ich würde sie teilen, da ich nichts Ähnliches finden konnte.
Ich wollte meine Ansichten / Modelle wie gewohnt mit Razor erstellen und sie als PDFs rendern lassen .
Auf diese Weise hatte ich die Kontrolle über die PDF-Präsentation mithilfe der Standard-HTML-Ausgabe, anstatt herauszufinden, wie das Dokument mit iTextSharp gestaltet werden soll.
Der Projekt- und Quellcode ist hier mit Anweisungen zur Nuget-Installation verfügbar:
https://github.com/andyhutch77/MvcRazorToPdf
quelle
FileStreamResult
funktioniert auf jeden Fall. Wenn Sie sich jedoch die Microsoft-Dokumente ansehen , erbt sie von einerActionResult -> FileResult
anderen abgeleiteten KlasseFileContentResult
. Es "sendet den Inhalt einer Binärdatei an die Antwort". Wenn Sie das bereits habenbyte[]
, sollten Sie esFileContentResult
stattdessen verwenden.quelle
Normalerweise würden Sie eine Response.Flush gefolgt von einer Response.Close ausführen, aber aus irgendeinem Grund scheint die iTextSharp-Bibliothek dies nicht zu mögen. Die Daten schaffen es nicht und Adobe hält das PDF für beschädigt. Lassen Sie die Response.Close-Funktion weg und prüfen Sie, ob Ihre Ergebnisse besser sind:
quelle
Wenn der Dateiname dynamisch generiert wird, wie er hier definiert wird, wird er hier durch guid generiert.
quelle
Seite anzeigen:
Scan-Controller:
quelle