Web应用程序中的“静默”打印

47

我正在开发一个需要无需用户干预即可静默打印的Web应用程序。怎样才能最好地实现这一目标呢?严格使用JavaScript、Flash和/或AIR似乎都不行。我发现最接近的方法是使用Java applet。

我理解为什么任何网站随意执行此操作都是一个坏主意。但是,对于一个内部应用程序来说并不是问题。如果用户需要将该URL添加到信任站点列表、安装插件等,则完全可以接受。


你是怎么解决的? - noamtm
4
我们最终采用了Java小程序。这是一场噩梦。通常情况下,这已经很糟糕了,但由于是为2008年北京奥运会设计的,加上距离和语言差异,使得情况更为糟糕。最终,它“够用”了。但再次强调,真的很糟糕。我不建议采用这种方案。 - Bill
如果你来到这里只是发现Java小程序路线不再很好用,这里有一个关于它的好讨论:https://dev59.com/WF8d5IYBdhLWcg3wNAKy - tresf
我需要在浏览器中打开PDF时自动打印,有什么想法吗? - shareef
11个回答

36

以下是启用 Firefox 立即打印而不显示打印偏好设置对话框的步骤:

  1. 在 Firefox 的地址栏中键入 about:config 并按 Enter。

  2. 右键单击页面上的任何位置,然后选择“新建 > 布尔值”。

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


我在某处找到了这个,它帮助了我


1
这个可行!谢谢。有人知道在其他浏览器中是否也可以这样做吗? - aron
3
IE 和 Chrome 呢? - user3830198
在我的Firefox浏览器中,现在不显示打印对话框。非常感谢。但是,在“另存为”对话框中,它要求我输入“文件名”。有什么办法可以解决吗? :) - Simant
如何在Microsoft Edge浏览器上实现这个? - Simant

11

正如@Axel所写,Firefox有print.always_print_silent选项。

对于Chrome,使用--kiosk-printing选项跳过打印预览对话框:

编辑您用于启动Chrome的快捷方式并添加“--kiosk-printing”,然后重新启动Chrome。

注意:如果不起作用,则很可能是因为您没有完全停止Chrome,注销并重新登录肯定会奏效。


1
你需要确保关闭所有Chrome进程(如Hangouts等)。当我无法弄清楚为什么我的启动标志没有被识别时,这个问题总是困扰着我。--disable-print-preview是绕过Chrome预览窗口并默认获取系统打印对话框选项的另一种方法。 - timbrown
开发者.chrome.com/extensions/printerProvider 是否提供了在 Chrome 中静默打印的解决方案? - mmu36478
4
要重新启动 Chrome,请在网址栏中输入 chrome://restart,然后按回车键。 - pmiguelpinto

6

Here are two code samples you can try:

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();
} 

您可能需要将您正在测试的站点/页面添加到本地内部网络区域。

6
我们曾经遇到过类似的问题。我们需要将支票打印到支票打印机,标签打印到标签打印机,客户发票打印到发票打印机,用于零售店embrasse-moi。我们有虚拟计算机、书角、ipad、iphone等没有打印功能的设备。发票打印功能基本上是一个静默打印。将pdf写入服务器,并在本地使用shell脚本检索并打印。
我们使用以下方法得到了完美的解决方案,只使用了最少量的库:
  1. 使用PHP中的TCPDF创建PDF。将PDF存储在服务器上。将其放入“打印队列”文件夹中。赞TCPDF,有点难学,但非常非常好用。请注意,我们使用avery 5167每页打印80个带有条形码的标签,准确度非常高。我们有标签、支票和发票打印队列。不同的文件夹基本上是为了不同的打印机。

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

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

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

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

如果您想查看输出结果,请保留该应用程序和自动化脚本。 选择“运行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

3
我知道这是一个较旧的帖子,但它仍然是“静默打印”的谷歌搜索结果中排名最高的,所以我会为那些现在遇到此问题的人分享我的发现。
我们在库存系统中使用各种类型的标签打印到不同的打印机时也遇到了类似的问题。经过一些试验和错误,我们通过让系统创建标签的pdf文件并将打印机名称和页面数量编码进去来解决了这个问题。然后你只需要做以下操作:
在IE中,转到Internet选项>>安全>>受信任的站点>>站点 取消选中“要求在此区域中的所有站点上使用 https: 进行服务器验证” 添加 "http://[yoururl]" pdf文件将自动打印出来。
当我们最初设置这个功能时,我们使用的是Chrome作为默认浏览器,但在2015年9月,Chrome停止支持运行NPAPI插件。这意味着您不能再选择Adobe pdf插件作为默认的pdf处理程序,而内置的pdf插件也无法进行静默打印 :-( 它仍然可以在Internet Explorer(在撰写本文时为IE11)中工作,但我没有尝试其他浏览器。
希望对您有所帮助。 谢谢, Nige

2
我编写了一个Python TSR程序,定期轮询服务器(从服务器获取其轮询频率),并将结果打印到标签打印机上。相对而言还不错。
一旦用Python编写完成,我使用py2exe对其进行编译,然后使用Inno Setup Compiler,在内部网络上发布,并要求用户安装。
虽然它并不是非常出色,但它能够正常工作。用户会在早上启动它,程序会在晚上收到来自服务器的关闭信号。

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

0
你应该看看 PrintNode。他们为 Web 应用程序提供无声远程打印服务。您需要在桌面安装一些软件,它会与他们的服务器同步。然后,您可以使用 JSON 请求发送打印作业,它们会立即打印出来。

0

说实话,我在这里有些想法.. 但是可以通过 applet 或某种形式(无论是 Java 还是其他)来完成,该应用程序被授予受信任的权限(例如 Intranet 区域内)或类似权限?

可能值得研究每个区域可以获得什么权限?

根据谷歌的搜索结果,我认为你肯定面临着挑战,目前我看到的大多数文章都涉及打印到 连接到服务器的打印机

如果是内部的,是否可以将打印从服务器传输到部门/用户打印机或其他设备上?


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

不,它是一种内部应用程序,意味着它对普通公众可用,但它将出现在各种零售连锁店等地方。 - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接