在网站上打印PDF

时间:2013-07-17 19:53:04

标签: pdf iframe printing dynamically-generated

我一直在寻找解决这个问题的日子。

描述:我有一个网站通过iFrame动态加载PDF。 PDF保存在服务器上,网站用户可以在网站上查看pdf。

问题:在网站上引入一个打印按钮,打印动态创建并保存在服务器上的PDF。

这甚至可能吗?我正在考虑跨浏览器实现以使事情变得更糟。我已经从网上尝试了n个JS选项,但它们似乎都没有用。我似乎无法以与它看起来相同的方式打印PDF。简而言之,我试图模拟加载时出现在PDF上的打印按钮。是否可以选择将pdf文档从服务器传递到打印对话框?

2 个答案:

答案 0 :(得分:2)

描述:我有一个网站通过iFrame动态加载PDF。 PDF保存在服务器上,网站用户可以在网站上查看pdf。

问题:在网站上引入一个打印按钮,打印动态创建并保存在服务器上的PDF。

解决方案:我找不到这个问题的确切解决方案,但这是我如何解决问题 -

  1. 根据要求创建“打印”并将其重定向到另一个只有PDF的页面。
  2. 复制之前的PDF&使用JS创建新的PDF - this.print(),这样当它打开时,打印对话框会直接弹出给用户。
  3. 在新页面中

        if ("Location of PDF " != null)
            {
                sPdf = "Location of PDF ";
                PdfReader pReader = new PdfReader(sPdf);
                Document document = new Document
                    (pReader.GetPageSizeWithRotation(ApplicationConstants.INDEX_ONE));
                int n = pReader.NumberOfPages;
                FileStream fs = new FileStream
                    ("New PDF location",
                    FileMode.Create, FileAccess.Write);
                PdfCopy copy = new PdfCopy(document, fs);
                // Write to pdf 
                document.Open();
                for (int i = ApplicationConstants.INDEX_ONE; i <= n; i++)
                {
                    PdfImportedPage page = copy.GetImportedPage(pReader, i);
                    copy.AddPage(page);
                }
                copy.AddJavaScript("this.print(true);", true);
                document.Close();
                pReader.Close();
    
                inStr = File.OpenRead("New PDF location");
                while ((bytecnt = inStr.Read
                    (buffer, ApplicationConstants.INDEX_ZERO, buffer.Length))
                    > ApplicationConstants.INDEX_ZERO)
                {
                    if (Context.Response.IsClientConnected)
                    {
                        Context.Response.ContentType = "application/PDF";
                        Context.Response.OutputStream.Write(buffer, 
                            ApplicationConstants.INDEX_ZERO, buffer.Length);
                        Context.Response.Flush();
                    }
                } 
            }
    

    请注意,我使用itextsharp将JS脚本注入新PDF。希望这有助于其他人。我试图在不使用itextsharp或任何其他dll的情况下找到另一种解决方案,但现在必须这样做。

答案 1 :(得分:1)

我不确定这是否有效,但您可以尝试使用special version of your PDF file that opens the print dialog when opened启动弹出窗口。然后关闭弹出窗口。最后一部分可能很棘手,因为我认为没有干净的方法可以知道打印对话框是否已经关闭。