2012-02-28 106 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

相關問題