2011-12-14 5 views
6

Я создал pdf-файл, используя iTextSharp, когда его созданный он автоматически сохраняет в местоположении, указанном в моем коде на сервере, а не на стороне клиента, и, конечно, не сообщая ничего пользователю.Созданный iTextSharp PDF: Как отправить PDF-файл клиенту и добавить подсказку?

Мне нужно отправить его клиенту, и мне нужно подсказывать диалоговое окно, чтобы спросить пользователя, где он хочет, чтобы сохранить его в формате PDF ..

как я могу это сделать, пожалуйста?

это мой 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); 
    } 

EDIT

это пример результата я хочу http://examples.extjs.eu/?ex=download

благодаря вашим ответам, я изменил мой код, чтобы это :

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(); 

, но я получаю эту ошибку:

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 абсолютно уверен, что мой itextsharp создать PDF-файл является правильным, потому что я могу сохранить его на сервере, но это еще не то, что мне нужно делать, когда я пытаюсь отправить его клиент я получил ошибку выше

заранее спасибо

+0

предназначен для программы WebApp/WinForm/Console? Вы всегда можете запросить местоположение, прежде чем приступать к созданию PDF. – YetAnotherUser

+0

его веб-приложение .. как это сделать? (извините im new для C# и iTextSharp) – Armance

ответ

3

решаемые

Ошибка от операции представить пытается интерпретировать ответ, который он не может, потому что это не в известном формате.

Я просто установил window.location для загрузки файлов, и это отлично работает.

{ 
xtype:'button',   
text: 'Generate PDF',   
handler: function() { 
    window.location = '/AddData.ashx?action=pdf';     
} 
} 

Вместо настройки местоположения вы также можете сделать window.open().

Будет ли файл загружен или открыт, зависит от настроек браузера.

+1

На третий день я борюсь с этой проблемой! Я люблю тебя! – oyaebunterkrah

5

в случае веб-приложения, вы, вероятно, хотите, чтобы поток в формате PDF в двоичном для пользователя, который будет либо открыть PDF или запрашивать пользователя, чтобы сохранить файл.

Помните, что генерация PDF-файлов происходит на сервере, даже если пользователь предоставляет путь, который он не будет использовать на сервере. См следующих ссылок -

В вашем случае вы создаете файл и, следовательно, будете уже имеющим двоичный поток вместо файла, следовательно, вы можете напрямую использовать Response.BinaryWrite вместо Response.WriteFile.

Модифицированный образец:

Response.Buffer = false; 
Response.Clear(); 
Response.ClearContent(); 
Response.ClearHeaders(); 
//Set the appropriate ContentType. 
Response.ContentType = "Application/pdf"; 
//Write the file content directly to the HTTP content output stream. 
Response.BinaryWrite(content); 
Response.Flush(); 
Response.End(); 
+0

его прекрасный я не нуждаюсь в нем onserver Мне нужно, чтобы пользователь мог сохранить его в конце .... Посмотрите на это и дайте знать, ty – Armance

+0

им не использовать Response.WriteFile! content u r, относящийся к образцу ur, тот же в моем байте кода [] content = myMemoryStream.ToArray(); ? – Armance

+0

Да - содержимое такое же, как в вашем коде. Вам нужно использовать 'Response.BinaryWrite (content)'. – YetAnotherUser

3

В настоящее время вы сохраняете файл на файловом сервере, таким образом переписывая тот же PDF с каждым запросом. И, вероятно, вызывают ошибки, если вы получаете два запроса для PDF одновременно.

Используйте Response для возврата PDF-файла (от запоминающего устройства) к пользователю и пропустите запись PDF в файл локально на вашем сервере.

Браузер запросит у пользователя, где файл должен быть сохранен. Что-то вроде:

Response.ContentType = "Application/pdf"; 
    myMemoryStream.CopyTo(Response.OutputStream); 

Также обратите внимание на the answer from Alun, используя content-disposition вы можете предложить имя файла для пользователя.

+0

thx..здесь, где я? замените мой использование filestream ...? – Armance

+0

Это правильно. – GvS

+0

У меня ошибка: 'message = Невозможно получить доступ к закрытому потоку. – Armance

3

Вам необходимо отправить заголовок содержимого в браузер пользователей. Из памяти код что-то вроде этого:

Response.ContentType = "application/pdf"; 
Response.AppendHeader("Content-Disposition","attachment; filename=nameofthefile.pdf"); 
+0

thx, попробовал, но он не имеет ни одного приглашения, и он не создает мой pdf..or по крайней мере, я не знаю, где это было. – Armance

+0

Вы уверен, что это веб-приложение? Чтение кода более внимательно, похоже, что вы сохраняете pdf-файл на сервере, а не отправляете его клиенту. – alun

+0

thats becaus ei не знает, как это сделать: ((.. но это то, что я хочу чтобы сделать..отправить PDF к клиенту – Armance

1

Вам не нужно использовать MemoryStream. Вместо этого используйте Response.OutputStream. Вот для чего это. Не нужно использовать Response.BinaryWrite() или любой другой вызов, чтобы явно записать документ; iTextSharp заботится о записи в поток, когда вы используете Response.OutputStream.

Вот простой рабочий пример:

Response.ContentType = "application/pdf"; 
Response.AppendHeader(
    "Content-Disposition", 
    "attachment; filename=test.pdf" 
); 
using (Document document = new Document()) { 
    PdfWriter.GetInstance(document, Response.OutputStream); 
    document.Open(); 
    document.Add(new Paragraph("This is a paragraph")); 
} 

Вот how to add the proper HTTP headers. (получение подсказки для сохранения файла). И если ваш код находится в web form, (обработчик щелчка кнопки), добавьте Response.End() в пример кода выше после оператора using, так что HTML-вывод веб-формы не добавляется в документ PDF.

+0

thx..when попробовал, у меня была проблема, PDF не создан, нет подсказки, но я получаю ошибку: Неожиданный токен% .и скрипт я вижу мой pdf (я полагаю, что) в странных символах:% PDF-1.4% 3 0 obj <> поток x | E r = JZM XP_ 'GDAQ – Armance

+0

" _Независимый токен% _ «звучит как ошибка JavaScript - тем более, когда вы говорите, что используете' fiddler' Как вы пытаетесь отправить PDF в браузер? Это приложение Ajax? – kuujinbo

+0

его приложение extjs. как отправить PDF в браузер? im not sure i nderstood..my код в моем вопросе .. – Armance