Web应用程序中的“无声”打印

时间:2008-08-22 06:59:56

标签: web-services printing

我正在开发一个需要静默打印的Web应用程序 - 没有用户参与。实现这一目标的最佳方法是什么?它不喜欢它可以严格使用Javascript,也不是Flash和/或AIR。我见过的最接近的是Java小程序。

我可以理解为什么只有任何一个网站才能做到这一点是一个坏主意。此特定实例适用于内部应用程序,如果用户需要将URL添加到受信任的站点列表,安装插件等,则完全可以接受。

11 个答案:

答案 0 :(得分:29)

您需要做的就是在不显示打印首选项对话框的情况下立即打印Firefox。

  1. 在Firefox的位置栏输入about:config并按Enter键。

  2. 右键单击页面上的任意位置,然后选择新建>布尔

  3. 输入首选项名称print.always_print_silent,然后单击“确定”。


  4. 我发现了某个地方,它帮助了我

答案 1 :(得分:6)

以下是您可以尝试的两个代码示例:

<强> 1

<script>
function Print() {
  alert ("THUD.. another tree bites the dust!")
  if (document.layers)
  {
    window.print();
  }
  else if (document.all)
  {
    WebBrowser1.ExecWB(6, 1);
    //use 6, 1 to prompt the print dialog or 6, 6 to omit it
    //some websites also indicate that 6,2 should be used to omit the box
    WebBrowser1.outerHTML = "";
  }
}
</script>
<object ID="WebBrowser1" WIDTH="0" HEIGHT="0"
CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2">
</object>

<强> 2

if (navigator.appName == "Microsoft Internet Explorer")
{ 
  var PrintCommand = '<object ID="PrintCommandObject" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>';
  document.body.insertAdjacentHTML('beforeEnd', PrintCommand); 
  PrintCommandObject.ExecWB(6, -1); PrintCommandObject.outerHTML = ""; 
} 
else { 
  window.print();
} 

您可能需要将要测试的站点/页面添加到本地Intranet区域。

答案 2 :(得分:6)

As @Axel wrote, Firefox has the print.always_print_silent option.

For Chrome, use the --kiosk-printing option to skip the Print Preview dialog:

Edit the shortcut you use to start Chrome and add "--kiosk-printing" then restart Chrome.

Note: If it doesn't work it is most likely because you did not completely stop Chrome, logging out and back in will surely do the trick.

答案 3 :(得分:5)

我们遇到了类似的问题。我们需要将支票打印到支票打印机,将标签打印到标签打印机,并将客户发票打印到零售店embrasse-moi的发票打印机。我们有虚拟计算机,角落,ipads,没有打印功能的iphone。打印发票功能基本上是一个无声的打印。将pdf写入服务器,并在本地使用shell脚本来检索并打印。

我们使用以下方法来获得具有最少库的完美解决方案:

  1. 在PHP中使用TCPDF来创建PDF。将PDF存储在服务器上。将它放在“打印队列”文件夹中。对于TCPDF的称赞,有点难学,但SICK SICK SICK。请注意,我们使用avery 5167每页打印80个标签,条形码具有完美的准确性。我们有标签,支票和发票打印队列。不同的文件夹基本上适用于不同的打印机。

  2. 使用附带的shell脚本通过FTP连接到服务器,下载PDF,从服务器上删除PDF,将PDF发送到打印机,然后再删除PDF。

  3. 使用连接到打印机的本地计算机,在终端中运行脚本。显然修改你的打印机和路径。

  4. 因为你总是希望这个运行,并且因为你使用MAC,所以使用automator创建一个'app'。启动automator,将脚本放入“运行shell脚本”并保存。然后将该应用程序粘贴在登录项中。如果要查看MAC上的“输出”窗口,请参阅shell脚本下面的脚本。

  5. BAM - 生病了。

    这是shell脚本

    #!/bin/bash
    
    # Get a remote directory Folder
    # List the contents every second
    # Copy the files to a local folder
    # delete the file from server
    # send the file to a printer
    # delete the file
    # compliments of embrasse-moi.com
    
    
    clear               # clear terminal window
    
    echo "##########################################"
    echo "Embrasse-Moi's Remote Print Queue Script"
    echo "##########################################"
    
    #Local Print Queue Directory
    COPY_TO_DIRECTORY=/volumes/DATA/test/
    echo "Local Directory: $COPY_TO_DIRECTORY"
    #Priter
    PRINTER='Brother_MFC_7820N'
    echo "Printer Name: $PRINTER"
    
    #FTP Info
    USER="user"
    PASS="pass"
    HOST="ftp.yourserver.com"
    #remote path
    COPY_REMOTE_DIRECTORY_FILES=/path
    echo "Remote Print Queue Directory: $HOST$COPY_REMOTE_DIRECTORY_FILES"
    
    echo 'Entering Repeating Loop'
    while true;  do
    
        #make the copy to directory if not exist
        echo "Making Directory If it Does Not Exist"
        mkdir -p $COPY_TO_DIRECTORY
        cd $COPY_TO_DIRECTORY
    
        ######################### WGET ATTEMPTS ############################################
        #NOTE wget will need to be installed
        echo "NOT Using wget to retrieve remote files..."
    
        # wget --tries=45 -o log --ftp-user=$USER --ftp-password=$PASS ftp://ftp.yourserver.com$COPY_REMOTE_DIRECTORY_FILES/*.pdf
    
        ######################### FTP ATTEMPTS ############################################
        echo "NOT Using ftp to retrieve and delete remote files..."
        #This seems to fail at mget, plus not sure how to delete file or loop through files
        ftp -n $HOST <<END_SCRIPT
        quote USER $USER
        quote PASS $PASS
        cd $COPY_REMOTE_DIRECTORY_FILES
        ls
        prompt
        mget *
        mdel *
    END_SCRIPT
    
    
        echo "Examining Files in $COPY_TO_DIRECTORY"
        for f in $COPY_TO_DIRECTORY/*.pdf
        do
          # take action on each file. $f store current file name      
          #print
          echo "Printing File: $f To: $PRINTER"
          lpr -P $PRINTER $f
    
          # This will remove the file.....
          echo "Deleting File: $f"
          rm "$f"
        done
        echo "Script Complete... now repeat until killed..."
        sleep 5
    done
    

    和automator脚本如果要查看输出,请使用脚本保留应用程序 选择一个运行Apple脚本选项:

    on run {input, parameters}
    
        tell application "Finder" to get folder of (path to me) as Unicode text
        set workingDir to POSIX path of result
        tell application "Terminal"
                do script "sh " & "'" & workingDir & "script1.sh" & "'"
    
        end tell
    
        return input
    end run
    

答案 4 :(得分:1)

我编写了一个python tsr,它经常轮询服务器(它从服务器中提取轮询频率)并打印出标签打印机。相对不错。

一旦用python编写,我就用py2exe,然后使用inno setup编译器,然后放在内网上并让用户安装它。

这不是很好,但它奏效了。用户将在早上启动它,程序将在晚上从服务器接收kill开关。

答案 5 :(得分:1)

我使用简单的JSP页面和Java PDF Renderer库(https://pdf-renderer.dev.java.net)整天工作。这是因为Java使用操作系统而不是浏览器进行打印。据说“静默打印”被认为是一个浏览器漏洞/漏洞利用程序,并且在IE 6之后进行了修补,因此通过Javascript或Active X将其运行起来非常好。也许它可能但是如果没有Java,我就无法工作。

答案 6 :(得分:1)

我知道这是一个较旧的主题,但它仍然是谷歌搜索“无声打印”的最佳选择。所以我现在就为了遇到这个问题的人的利益添加我的发现。

我们遇到类似的问题,各种类型的标签打印到股票系统的各种打印机。它花了一些试验和错误,但我们通过让系统创建标签的pdf来解决它,打印机名称和页面数量以pdf编码。那么你所要做的就是: 在IE中,转到Internet选项&gt;&gt;安全&gt;&gt;可信站点&gt;&gt;网站 清除&#39;要求对此区域中的所有网站进行服务器验证(https :)&#39; 添加&#34; http://[yoururl]&#34; 并且pdf将自动打印出来。

当我们最初设置时,我们使用Chrome作为默认浏览器,但在2015年9月,Chrome放弃了运行NPAPI插件的功能。这意味着您无法再选择Adobe pdf插件作为默认的pdf处理程序,并且内置的pdf插件无法处理静默打印:-( 它仍然可以在Internet Explorer(IE11编写时)中使用,但我还没有尝试过任何其他浏览器。

HTH 干杯, 的NiGe

答案 7 :(得分:0)

我必须诚实,我在这里大声思考..但是不能用applet或某种类型(无论是Java还是其他)获得可信任的权限(例如Intranet区域内的那些) )或什么?

可能值得研究可以为每个区域授予哪些权限?

关注Google之后,我认为你肯定会遇到挑战,到目前为止我看到的大多数文章都涉及到printers connected to the server的打印。

如果是内部的,是否可以将打印从服务器路由到部门/用户打印机或什么?

答案 8 :(得分:0)

如果它只是一个内部应用程序,那么您可以避免从浏览器打印,并将打印输出直接从服务器发送到最近的打印机给用户。

答案 9 :(得分:0)

我在这里遇到同样的问题,这是我到目前为止所学到的。

答:您需要设置IPP PrintServer

您可以尝试多种打印服务器实现。

  1. 硬件IPP打印服务器:与DLINK DPR-1020或类似产品一样,某些打印机内置了此功能。

  2. 带有CUPPS的Linux服务器:http://www.howtoforge.com/ipp_based_print_server_cups

  3. 带有ISS的XP-Pro服务器:http://www.michaelphipps.com/ipp-print-server-windows-xp-solution

  4. B。:您需要将WebApp作为此IPP服务器的客户端,以便您选择 - 处理 - 将每个用户的打印请求发送到PrintServer。

    PHP :: PRINT :: IPP是一个你可以尝试的php库(它在杯子服务器上经过了很好的测试)。

答案 10 :(得分:0)

你应该看看PrintNode。它们为Web应用程序提供静默远程打印服务。您在桌面上安装了一个与其服务器同步的软件。然后,您可以使用json请求发送printjobs,并立即打印出来。