2012-02-28 365 views
1

我已经开发了我的开发机器上的解决方案,它:您是否需要在服务器上安装Adobe PDF才能使用iTextSharp?

  1. 通过C#
  2. 将它们合并在一起
  3. 做了Response.BinaryWrite推到浏览器的合并打开PDF文件的文件路径服务器端PDF

对本地DEV很有效。当推送到服务器时,浏览器窗口中会出现一些“二进制乱码”。

Adob​​e或Foxit Reader未安装在服务器上,但它安装在本地开发机器上。我的理解是,iTextSharp允许你不需要安装PDF阅读器,但它呢?或者,也许这就是.PDF未列出的文件类型的IIS的事情......

下面是一些示例代码:

// First set up the response and let the browser know a PDF is coming 
      context.Response.Buffer = true; 
      context.Response.ContentType = "application/pdf"; 
      context.Response.AddHeader("Content-Disposition", "inline"); 

      List<string> PDFs = new List<string>(); 
      PDFs.Add(@"c:\users\shane\documents\visual studio 2010\Projects\PDFMultiPrintTester\PDFMultiPrintTester\TEST1.pdf"); 
      PDFs.Add(@"c:\users\shane\documents\visual studio 2010\Projects\PDFMultiPrintTester\PDFMultiPrintTester\TEST2.pdf"); 
      PDFs.Add(@"c:\users\shane\documents\visual studio 2010\Projects\PDFMultiPrintTester\PDFMultiPrintTester\TEST3.pdf"); 

      // Second, some setup stuff 
      System.IO.MemoryStream MemStream = new System.IO.MemoryStream(); 
      iTextSharp.text.Document doc = new iTextSharp.text.Document(); 
      iTextSharp.text.pdf.PdfReader reader = default(iTextSharp.text.pdf.PdfReader); 
      int numberOfPages = 0; 
      int currentPageNumber = 0; 
      iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, MemStream); 
      doc.Open(); 
      iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent; 
      iTextSharp.text.pdf.PdfImportedPage page = default(iTextSharp.text.pdf.PdfImportedPage); 
      int rotation = 0; 

      foreach (string f in PDFs) 
      { 
       // Third, append all the PDFs--THIS IS THE MAGIC PART 
       byte[] sqlbytes = null; 
       sqlbytes = ReadFile(f); 
       reader = new iTextSharp.text.pdf.PdfReader(sqlbytes); 
       numberOfPages = reader.NumberOfPages; 
       currentPageNumber = 0; 

       while ((currentPageNumber < numberOfPages)) 
       { 
        currentPageNumber += 1; 
        doc.SetPageSize(PageSize.LETTER); 
        doc.NewPage(); 
        page = writer.GetImportedPage(reader, currentPageNumber); 
        rotation = reader.GetPageRotation(currentPageNumber); 
        if ((rotation == 90) | (rotation == 270)) 
        { 
         cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(currentPageNumber).Height); 
        } 
        else 
        { 
         cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
        } 
       } 
      } 

      // Finally Spit the stream out 
      if (MemStream == null) 
      { 
       context.Response.Write("No Data is available for output"); 
      } 
      else 
      { 
       doc.Close(); 
       context.Response.BinaryWrite(MemStream.GetBuffer()); 
       context.Response.End(); 
       MemStream.Close(); 
      } 
     } 
    } 

    public static byte[] ReadFile(string filePath) 
    { 
     byte[] buffer; 
     FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
     try 
     { 
      int length = (int)fileStream.Length; // get file length 
      buffer = new byte[length];   // create buffer 
      int count;       // actual number of bytes read 
      int sum = 0;       // total number of bytes read 

      // read until Read method returns 0 (end of the stream has been reached) 
      while ((count = fileStream.Read(buffer, sum, length - sum)) > 0) 
       sum += count; // sum is a buffer offset for next reading 
     } 
     finally 
     { 
      fileStream.Close(); 
     } 
     return buffer; 
    } 
+0

服务器请求的URI是什么? – SliverNinja 2012-02-28 20:26:07

+0

我将所有这些逻辑放在一个.ashx文件中,所以我只需导航到该页面。例如,它看起来像这样:http:// localhost:13215/PDFPrint.ashx – Shane 2012-02-28 20:31:36

+0

什么浏览器+版本你看到乱码? – SliverNinja 2012-02-28 20:33:57

回答

0

终于搞明白了。您不需要在服务器上安装Adobe PDF阅读器或福昕阅读器。你只需要在服务器上安装iTextReader(通过安装,我的意思是你的解决方案中存在程序集)。你需要的是IIS中的MIME类型。我们必须添加该MIME类型,并在此之后立即开始工作。有趣的是,即使是这样,Chrome仍然能够弄清楚并正确渲染。我假设IIS将正确的标题放置在与该MIME类型关联的位置,并且没有发生。 IE8无法弄清楚。

+0

iTextSharp是否需要在服务器上安装Microsoft Office? – 2015-12-25 12:02:28

1

我的理解是,iTextSharp的允许你不需要PDF 读者安装在所有,但它呢?

iTextSharp用于生成PDF文件。它与浏览这些文件的方式无关。如果您在浏览应用程序的客户端计算机上没有安装PDF阅读器,则此响应中的PDF文件不会在此客户端计算机上获得除乱码之外的任何内容。

不幸的是,您尚未显示用于在服务器上生成此PDF文件的代码,因此很难说这个问题是否可能与此有关。重要的是将响应的ContentType设置为application/pdf并将有效的PDF文件发送到响应。在客户端上解释此响应的方式很大程度上取决于正在使用的浏览器以及此客户端计算机上安装的不同插件和PDF阅读器。

+0

是的,这个假定用浏览器的用户确实安装了pdf,只是需要在生成PDF的服务器上安装它。我在上面添加了代码示例。是的,我正在改变内容类型:context.Response.ContentType =“application/pdf”; – Shane 2012-02-28 20:30:29

+1

@Shane,不,你不需要在服务器上安装任何东西。 iTextSharp与PDF阅读器无关。 – 2012-02-28 20:39:50

+0

这也是我的理解。谢谢。 – Shane 2012-02-28 20:45:08

0

您可能需要将Response.ContentType设置为application/pdf。请参阅related SO post

当您在渲染Content-Disposition: inline时,它在IE中使用Adobe插件 - “Adobe PDF链接助手”(或FoxIt Reader)。由于您的服务器上可能没有此ActiveX插件(AcroIEHelperShim.dll),因为它没有内联解释器,所以它将只将内联字节内容呈现为text/html

+0

OP已经做到了。看他的更新。 – jrummell 2012-02-28 20:31:05

+0

那么你认为解决方案是什么? – Shane 2012-02-28 21:07:58

+0

@Shane - 如果您不想看到乱码,您需要在服务器上安装Adobe Reader或FoxIt Reader等PDF解释器。 'iTextSharp'不是内嵌浏览器PDF渲染器。 – SliverNinja 2012-02-28 22:41:46

相关问题