iTextSharp PDF généré: Comment faire pour envoyer le fichier pdf pour le client et ajouter une invite?
J'ai généré un fichier pdf à l'aide iTextSharp, lors de son créé il enregistre automatiquement dans l'emplacement prévu dans mon code sur le serveur, pas sur le côté client, et bien sûr sans dire quelque chose à l'utilisateur.
J'ai besoin de l'envoyer au client et j'ai besoin de invite une boîte de dialogue pour demander à l'utilisateur où il veut sauver son pdf..
comment puis-je faire s'il vous plaît?
c'est mon code pdf:
using (MemoryStream myMemoryStream = new MemoryStream())
{
Document document = new Document();
PdfWriter PDFWriter = PdfWriter.GetInstance(document, myMemoryStream);
document.AddHeader("header1", "HEADER1");
document.Open();
//..........
document.Close();
byte[] content = myMemoryStream.ToArray();
//Write out PDF from memory stream.
using (FileStream fs = File.Create(HttpContext.Current.Server.MapPath("~\\report.pdf")))
{
fs.Write(content, 0, (int)content.Length);
}
MODIFIER
ceci est un exemple du résultat que je souhaite
http://examples.extjs.eu/?ex=download
merci pour vos réponses ,j'ai modifié mon code pour ce:
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AppendHeader( "Content-Disposition", "attachment; filename=test.pdf");
using (MemoryStream myMemoryStream = new MemoryStream())
{
Document document = new Document();
PdfWriter PDFWriter = PdfWriter.GetInstance(document, myMemoryStream);
document.AddHeader("Content-Disposition", "attachment; filename=wissalReport.pdf");
document.Open();
//..........
document.Close();
byte[] content = myMemoryStream.ToArray();
HttpContext.Current.Response.Buffer = false;
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.AppendHeader("content-disposition","attachment;filename=" + "my_report.pdf");
HttpContext.Current.Response.ContentType = "Application/pdf";
//Write the file content directly to the HTTP content output stream.
HttpContext.Current.Response.BinaryWrite(content);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
mais j'obtiens cette erreur:
Uncaught Ext.Error: You're trying to decode an invalid JSON String:
%PDF-1.4 %���� 3 0 obj <</Type/XObject/Subtype/Image/Width 994/Height 185/Length 13339/ColorSpace/DeviceGray/BitsPerComponent 8/Filter/FlateDecode>>stream x���|E�
...........
im absolument sûr que mon itextsharp pour créer un fichier pdf est correct parce que je peux l'enregistrer sur le serveur, mais ce n'est pas ce que je dois faire ,quand j'ai essayer de l'envoyer au client, j'ai obtenu l'erreur ci-dessus
merci d'avance
- est pour WebApp/WinForm/programme de Console? Vous pouvez toujours demander un emplacement avant de procéder à la génération de pdf.
- ses une application web..comment faire? (désolé im nouveau à c# et iTextSharp)
Vous devez vous connecter pour publier un commentaire.
Dans le cas d'une application web, vous voudrez probablement pour diffuser le fichier pdf en binaire à l'utilisateur, soit d'ouvrir le fichier pdf ou inviter l'utilisateur à enregistrer le fichier.
Souvenez-vous de la génération des pdf qui se passe sur le serveur, même si l'utilisateur fournit le chemin d'accès, il ne sera pas de toute utilisation sur le serveur. Voir les liens suivants -
Dans votre cas, vous générez le fichier et donc sera déjà avoir un flux binaire au lieu de fichier, par conséquent, vous pouvez utiliser directement Réponse.BinaryWrite au lieu de Réponse.WriteFile.
Modifié échantillon:
Response.BinaryWrite(content)
.content
est correcte (essayez de l'enregistrer dans un fichier binaire) et essayez d'ajouterResponse.Flush()
avantResponse.End()
//..........
code entredocument.Open();
etdocument.Close();
. Essayez de déboguer ce qui est de la question est, donner des détails précis, une nouvelle question et certains on peut être en mesure de les aider.Vous devez envoyer une disposition du contenu de l'en-tête pour les utilisateurs du navigateur. De mémoire le code est quelque chose comme ceci:
Actuellement, vous enregistrez votre fichier sur le serveur de fichiers, remplaçant ainsi le même pdf avec chaque demande. Et probablement à l'origine des erreurs si vous obtenez deux demandes pour un PDF en même temps.
Utilisation
Response
pour revenir au format PDF (à partir de la memorystream) à l'utilisateur, et de passer l'écriture de la PDF à un fichier localement sur votre serveur.Le navigateur demande à l'utilisateur où le fichier doit être enregistré. Quelque chose comme:
Aussi regarder la réponse de l'Alun, à l'aide de
content-disposition
vous pouvez proposer un nom de fichier à l'utilisateur.message=Cannot access a closed Stream.
Response.BinaryWrite(content)
de Encore de réponse, et ajouter unResponse.Clear()
.RÉSOLU
L'erreur est de l'opération d'envoi en essayant d'interpréter la réponse qu'il ne peut pas car il n'est pas dans un format connu.
Je viens de mettre la fenêtre.emplacement de télécharger des fichiers et cela fonctionne bien.
Au lieu de la définition de l'emplacement, vous pouvez aussi faire de la fenêtre.open().
Si le fichier va être téléchargé ou ouvrir dépend des paramètres du navigateur.
Vous n'avez pas besoin d'utiliser
MemoryStream
. UtilisationResponse.OutputStream
à la place. Qu'est ce que ça existe. Pas besoin d'utiliserResponse.BinaryWrite()
ou tout autre appel d'écrire explicitement le document soit; iTextSharp prend soin de l'écriture dans le flux lorsque vous utilisezResponse.OutputStream
.Voici un simple exemple:
Voici comment ajouter les en-têtes appropriés. (obtenir l'invite à enregistrer le fichier) Et si votre code est dans un
web form
, (cliquez sur le bouton gestionnaire), ajouterResponse.End()
à l'exemple de code ci-dessus après leusing
déclaration ainsi que le formulaire web HTML de sortie n'est pas ajoutée au document PDF.fiddler
. Comment essayez-vous de transmettre le PDF dans le navigateur? Est-ce une application Ajax?