J'ai ce code de démonstration pour 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();
Comment puis-je demander au contrôleur de renvoyer le document PDF au navigateur?
ÉDITER:
L'exécution de ce code ouvre Acrobat mais j'obtiens un message d'erreur "Le fichier est endommagé et n'a pas pu être réparé"
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");
}
Des idées pourquoi cela ne fonctionne pas?
c#
asp.net
asp.net-mvc
pdf
itextsharp
Tony Borf
la source
la source
Réponses:
Retourner un
FileContentResult
. La dernière ligne de votre action de contrôleur serait quelque chose comme:Si vous générez ce PDF dynamiquement, il peut être préférable d'utiliser a
MemoryStream
et de créer le document en mémoire au lieu de l'enregistrer dans un fichier. Le code serait quelque chose comme:la source
Je l'ai fait fonctionner avec ce code.
la source
using
déclaration dans aucun exemple que je puisse trouver ... N'est-ce pas nécessaire ici? Je pense que vous avez au moins 3 objets jetables ...Vous devez spécifier:
Pour que le fichier soit ouvert directement dans le navigateur au lieu d'être téléchargé
la source
Si vous retournez un
FileResult
de votre méthode d'action et utilisez laFile()
méthode d'extension sur le contrôleur, faire ce que vous voulez est assez facile. Il existe des substitutions sur laFile()
méthode qui prendra le contenu binaire du fichier, le chemin d'accès au fichier ou un fichierStream
.la source
J'ai rencontré des problèmes similaires et je suis tombé sur une solution. J'ai utilisé deux articles, un de la pile qui montre la méthode à retourner pour le téléchargement et un autre qui montre une solution de travail pour ItextSharp et MVC.
la source
Vous pouvez créer une classe personnalisée pour modifier le type de contenu et ajouter le fichier à la réponse.
http://haacked.com/archive/2008/05/10/writing-a-custom-file-download-action-result-for-asp.net-mvc.aspx
la source
Je sais que cette question est ancienne mais je pensais que je la partagerais car je ne pouvais rien trouver de similaire.
Je voulais créer mes vues / modèles comme d'habitude en utilisant Razor et les rendre au format PDF .
De cette façon, j'avais le contrôle sur la présentation PDF en utilisant la sortie html standard plutôt que de comprendre comment mettre en page le document en utilisant iTextSharp.
Le projet et le code source sont disponibles ici avec les instructions d'installation de nuget:
https://github.com/andyhutch77/MvcRazorToPdf
la source
FileStreamResult
fonctionne certainement. Mais si vous regardez le Microsoft Docs , il hérite deActionResult -> FileResult
, qui a une autre classe dérivéeFileContentResult
. Il "envoie le contenu d'un fichier binaire à la réponse". Donc, si vous avez déjà lebyte[]
, vous devriez simplement l'utiliser à laFileContentResult
place.la source
Vous feriez normalement un Response.Flush suivi d'un Response.Close, mais pour une raison quelconque, la bibliothèque iTextSharp ne semble pas aimer ça. Les données ne parviennent pas à passer et Adobe pense que le PDF est corrompu. Oubliez la fonction Response.Close et voyez si vos résultats sont meilleurs:
la source
si le nom de fichier est généré dynamiquement alors comment définir le nom de fichier ici, il est généré via guid ici.
la source
Voir page:
Contrôleur de scan:
la source