2011-05-23 169 views
4

我试图创建将直接发送PDF文件到我的打印机的方法(导致出现打印对话框)。iTextSharp的PDF打印

下面是我一直在努力的代码 - 大部分在论坛here找到。如果我使用iTextSharp的创建一个新的PDF文档,但只要我尝试一些JavaScript注入到一个已经存在的文件,我调用print()方法说

对象不支持的时候得到一个例外,它工作正常属性或方法 '打印'

<script type="text/javascript"> 
    function load() { 
     try { 
      var x = document.getElementById("frame1"); 
      x.print(); 
     } 
     catch (err) { 
     } 
    } 
</script> 

<body onload="load();"> 
    <form id="form1" runat="server"> 
    <div> 
     <iframe id="frame1" src="C:/1686850_1.pdf" runat="server" frameborder="0" style="height: 0px; width: 0px;" /> 
    </div> 
    </form> 
</body> 
</html> 

.CS文件

using System.IO; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 

public partial class Print : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     SetPDF(File.ReadAllBytes("C:\\1686850.pdf"), "C:\\1686850_1.pdf"); //test files 
    } 

    private void SetPDF(byte[] file, string outputPath) 
    { 
     PdfReader reader = new PdfReader(file); 
     int pageCount = reader.NumberOfPages; 
     Rectangle pageSize = reader.GetPageSize(1); 

     Document pdf = new Document(pageSize); 
     PdfWriter writer = PdfWriter.GetInstance(pdf, new FileStream(outputPath, FileMode.Create)); 
     pdf.Open(); 

     //This action leads directly to printer dialogue 
     PdfAction jAction = PdfAction.JavaScript("this.print(true);\r", writer); 
     writer.AddJavaScript(jAction); 
     //Omitting this loop and simply adding some text to the file produces the behavior I want. 
     for (int i = 0; i < pageCount; i++) 
     { 
      pdf.NewPage(); 
      PdfImportedPage page = writer.GetImportedPage(reader, i + 1); 
      writer.DirectContent.AddTemplate(page, 0, 0); 
     } 
     pdf.Close(); 

     //Open the pdf in the frame 
     frame1.Attributes["src"] = outputPath; 
    } 
} 

回答

9

我找到了一种方法,在这里做这样的:http://wskidmore.com/2011/03/pdf-initial-view-settings-itextsharp/

此基础上,我写了这个代码:

private void PrintMenu() 
{ 
    ... 
    var notUriPath = Server.MapPath("~/" + filePathName); 

    var doc = new Document(); 
    var reader = new PdfReader(notUriPath); 
    using (var memoryStream = new MemoryStream()) 
    { 
     var writer = PdfWriter.GetInstance(doc, memoryStream); 
     doc.Open(); 

     // this action leads directly to printer dialogue 
     var jAction = PdfAction.JavaScript("this.print(true);\r", writer); 
     writer.AddJavaScript(jAction); 

     var cb = writer.DirectContent; 
     doc.AddDocListener(writer); 

     for (var p = 1; p <= reader.NumberOfPages; p++) 
     { 
      doc.SetPageSize(reader.GetPageSize(p)); 
      doc.NewPage(); 
      var page = writer.GetImportedPage(reader, p); 
      var rot = reader.GetPageRotation(p); 
      if (rot == 90 || rot == 270) 
       cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(p).Height); 
      else 
       cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0); 
     } 

     reader.Close(); 
     doc.Close(); 
     File.WriteAllBytes(notUriPath, memoryStream.ToArray()); 
    } 

    theIframeForPrint.Attributes.Add("src", fullFilePath); 
} 

我希望它能帮助!

+1

感谢的人,它的工作原理..我复制此代码'//这个动作直接导致打印机对话 VAR jAction = PdfAction.JavaScript (“this.print(true); \ r”,writer); writer.AddJavaScript(jAction);' – 2015-04-23 08:40:47

0

你想添加JavaScript到PDF打开打印d ialog,而不是网页(除非你真的想要的网页打印对话框,而不是PDF打印对话框)。我之前做过这个,但是没有使用iTextSharp;但是快速的Google搜索应该告诉你如何使用iTextSharp添加Javascript来打开打印对话框。

+0

我认为这是我在做什么? :)我的目标,真的,是打印从我的网页上的PDF文档,而无需使用PDF阅读器 – foamy 2011-05-24 06:39:50