Открыть сгенерированный PDF-файл с помощью кода напрямую, не сохраняя его на диске

#asp.net #sharepoint #pdf-generation #itextsharp

#asp.net #sharepoint #pdf-генерация #itext

Вопрос:

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

  protected void Button1_OnClick(object sender, EventArgs e)
    {
        Document myDoc = new Document(PageSize.A4.Rotate());
        try
        {
            PdfWriter.GetInstance(myDoc, new FileStream(@"C:DirectoryTest.pdf", FileMode.Create));
            myDoc.Open();
            myDoc.Add(new Paragraph("Hello World"));
        }
        catch (DocumentException ex)
        {
            Console.Error.WriteLine(ex.Message);
        }
        myDoc.Close();
    }
  

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

   Document document = new Document(PageSize.A4);
        PdfWriter.GetInstance(document, new FileStream(HttpContext.Current.Server.MapPath("~/Test.pdf"), FileMode.Create));
        document.Open();
        var WelcomePara = new Paragraph("Hello World");
        document.Add(WelcomePara);
        document.Close();
  

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

Ответ №1:

Почти каждый раз, когда что-то принимает a FileStream , на самом деле действительно принимает универсальный System.IO.Stream объект, который FileStream является подклассом. Это означает, что вместо этого вы можете использовать его двоюродного System.IO.MemoryStream брата, который вам нужен:

         byte[] bytes;
        using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) {
            using (iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4.Rotate())) {
                using (iTextSharp.text.pdf.PdfWriter w = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, ms)) {
                    doc.Open();
                    doc.NewPage();
                    doc.Add(new iTextSharp.text.Paragraph("Hello world"));
                    doc.Close();
                    bytes = ms.ToArray();
                }
            }
        }
        //Do whatever you want with the byte array here
  

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

Комментарии:

1. Спасибо за ваш ответ. Я попробовал приведенный выше код, при нажатии кнопки он по-прежнему не открывает PDF-файл «Hello World». Нужно ли что-то еще сделать? Пожалуйста, помогите мне…

Ответ №2:

Наконец-то я смог заставить его работать.

   using (var ms = new MemoryStream())
      {
          using (var document = new Document(PageSize.A4,50,50,15,15))
          {
              PdfWriter.GetInstance(document, ms); 
              document.Open();
              document.Add(new Paragraph("HelloWorld"));
              document.Close();
          }
          Response.Clear();
          //Response.ContentType = "application/pdf";
          Response.ContentType = "application/octet-stream";
          Response.AddHeader("content-disposition", "attachment;filename= Test.pdf");
          Response.Buffer = true; 
          Response.Clear();
          var bytes = ms.ToArray();
          Response.OutputStream.Write(bytes, 0, bytes.Length);
          Response.OutputStream.Flush();
      } 
  

Комментарии:

1. откуда вы берете свой Response ?

2. @Tomo Я могу рассказать это для своего примера: у меня есть приложение MVC5, и я унаследовал его от System.Web.Mvc.Controller

Ответ №3:

Это работает для меня.

 using (var ms = new MemoryStream())
  {

      using (var document = new Document(PageSize.A4,50,50,15,15))
      {

        // step 2
        PdfWriter writer = PdfWriter.GetInstance(document, ms);


        // step 3
        document.Open();

        // XML Worker
        XMLWorker worker = new XMLWorker(css, true);
        XMLParser p = new XMLParser(worker);
        p.Parse(new StringReader(--Your HTML--));


        // step 5
        document.Close();
      }  
      Byte[] FileBuffer = ms.ToArray();
      if (FileBuffer != null)
      {
          Response.ContentType = "application/pdf";
          Response.AddHeader("content-length", FileBuffer.Length.ToString());
          Response.BinaryWrite(FileBuffer);
      }

  }