Открыть сгенерированный файл PDF через код напрямую, не сохраняя его на диск - PullRequest
3 голосов
/ 14 октября 2011

Я использую 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:\Directory\Test.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. Может кто-нибудь помочь мне, пожалуйста.

Ответы [ 3 ]

4 голосов
/ 14 октября 2011

Почти каждый раз, когда что-то принимает 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-like" для работы с вами.

2 голосов
/ 14 октября 2011

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

  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();
      } 
0 голосов
/ 18 января 2016

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

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

  }
...