【问题标题】:Print PDF in Website在网站上打印 PDF
【发布时间】:2013-07-16 13:12:29
【问题描述】:

我一直在寻找解决这个问题的方法。

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

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

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

【问题讨论】:

  • 如果您已经将 pdf 保存在服务器上并且看起来像您想要的那样,您可以提供一个常规链接,将用户带到 pdf。从那里打印出来很容易。但是,如果您希望“单击一下,它就会从打印机中出来”的解决方案,那么坏消息是没有。相关:stackoverflow.com/questions/5627035/…
  • 我假设您已经确定这 (javascriptkit.com/howto/newtech2.shtml) 不适合您?
  • > 是否有将 pdf 文档从服务器传递到打印对话框的选项? ...当然不是,只不过你希望其他人能够盲目地向你的机器上发送一些东西并做一些事情。
  • @lost 哲学家 - window.print 打印整个网页以及空白 iframe。

标签: pdf iframe printing dynamically-generated


【解决方案1】:

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

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

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

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

在新页面中-

    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 的情况下找到另一种解决方案,但现在必须这样做。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢你们。我最终做了类似的事情。
    • 注意:我发现几乎不可能显示嵌入在网页内 iFrame 中的 PDF 的打印对话框。我的解决方案是在用户单击“打印”按钮时打开另一个仅包含 PDF 的窗口。以下链接有帮助 - stackoverflow.com/questions/270674/…
    • @steve mais,也许你应该为你自己的问题写一个新的答案,其中包含你所做的所有细节。它可能会帮助其他面临同样问题的人。
    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多