Созданный iTextSharp PDF: Как отправить PDF клиенту и добавить подсказку? - PullRequest
6 голосов
/ 14 декабря 2011

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

Мне нужночтобы отправить его клиенту, и мне нужно предложить диалоговое окно, чтобы спросить пользователя, где он хочет сохранить свой 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);
    }

РЕДАКТИРОВАТЬ

это пример результата, который я хочу 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�
...........

я абсолютно уверен, что мой itextsharp для создания PDF является правильным, потому что я могу сохранить его на сервере, но это не такчто мне нужно сделать, когда я пытаюсь отправить его клиенту, я получил ошибку выше

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

Ответы [ 5 ]

5 голосов
/ 14 декабря 2011

В случае веб-приложения вы, вероятно, захотите передать поток 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();
3 голосов
/ 22 декабря 2011

решено

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

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

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

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

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

3 голосов
/ 14 декабря 2011

Вам необходимо отправить заголовок размещения контента в браузер пользователей.По памяти код выглядит примерно так:

Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition","attachment; filename=nameofthefile.pdf");
3 голосов
/ 14 декабря 2011

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

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

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

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

Также посмотрите ответ от Alun , с помощью content-disposition вы можете предложить пользователю имя файла.

1 голос
/ 14 декабря 2011

Вам не нужно использовать 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"));
}

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

...