1

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

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

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

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

4

2 回答 2

2

描述:我有一个通过 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 的情况下找到另一种解决方案,但现在必须这样做。

于 2013-08-01T10:34:39.167 回答
1

我不确定这是否可行,但您可以尝试使用特殊版本的 PDF 文件启动一个弹出窗口,该窗口在打开时会打开打印对话框。然后关闭弹出窗口。最后一部分可能很棘手,因为我认为没有干净的方法可以知道打印对话框是否已关闭。

于 2013-07-23T18:21:07.577 回答