«Тихая» печать в веб-приложении - PullRequest
39 голосов
/ 22 августа 2008

Я работаю над веб-приложением, которое должно печатать без вывода сообщений - без участия пользователя. Какой лучший способ сделать это? Не нравится, когда это можно сделать строго с помощью Javascript, Flash и / или AIR. Самое близкое, что я видел, - это Java-апплет.

Я могу понять, почему для любого веб-сайта это может быть плохой идеей. Этот конкретный экземпляр предназначен для внутреннего приложения, и он вполне приемлем, если пользователю необходимо добавить URL-адрес в список доверенных сайтов, установить дополнение и т. Д.

Ответы [ 11 ]

29 голосов
/ 25 марта 2009

Вот что вам нужно сделать, чтобы включить Firefox для немедленной печати без отображения диалогового окна настроек печати. ​​

  1. Введите about: config в адресную строку Firefox и нажмите Enter.

  2. Щелкните правой кнопкой мыши в любом месте страницы и выберите New> Boolean

  3. Введите имя предпочтения как print.always_print_silent и нажмите ОК.


Я нашел это где-то, и это помогло мне

6 голосов
/ 04 мая 2015

Как писал @Axel, Firefox имеет опцию print.always_print_silent.

Для Chrome используйте параметр --kiosk-printing, чтобы пропустить диалоговое окно предварительного просмотра:

Отредактируйте ярлык, который вы используете для запуска Chrome, добавьте «--kiosk-printing» и перезапустите Chrome.

Примечание. Если это не сработает, скорее всего, потому что вы не полностью остановили Chrome, выход из системы и ее повторное выполнение обязательно помогут.

6 голосов
/ 22 августа 2008

Вот два примера кода, которые вы можете попробовать:

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

Возможно, вам потребуется добавить сайт / страницу, на которой вы тестируете, в локальную зону интрасети.

5 голосов
/ 18 февраля 2013

Мы боролись с подобной проблемой. Нам нужно было распечатать чеки на принтер чеков, этикетки на принтер этикеток и счета клиентов на принтер счетов для розничного магазина embrasse-moi . У нас есть фиктивные компьютеры, уголки, iPad, iPhone без возможности печати. Функция печати счета-фактуры была в основном тихой печатью. На сервер был записан файл PDF, а для его получения и печати использовался локальный скрипт оболочки.

Мы использовали следующее для идеального решения с минимальными библиотеками:

  1. использовать TCPDF в PHP для создания PDF. Храните PDF на сервере. Поместите его в папку «Очередь печати». Слава для TCPDF, немного трудно учиться, но SICK SICK SICK. Обратите внимание, что мы печатаем 80 этикеток на страницу, используя avery 5167 со штрих-кодом с идеальной точностью. У нас есть очереди печати этикеток, чеков и счетов. Разные папки в основном для разных принтеров.

  2. Используйте прилагаемый сценарий оболочки для подключения к серверу через FTP, загрузите PDF, удалите PDF с сервера, отправьте PDF на принтер и снова удалите PDF.

  3. Используя локальный компьютер, подключенный к принтеру, запустите скрипт в терминале. очевидно, измените ваши принтеры и пути.

  4. Поскольку вы всегда хотите, чтобы это работало, и поскольку вы используете MAC, создайте «приложение» с помощью automator. Запустите automator, поместите скрипт в «скрипт запуска оболочки» и сохраните. Затем вставьте это приложение в элемент входа. Посмотрите скрипт ниже скрипта оболочки, если вы хотите увидеть окно «output» на MAC.

БАМ - работает больной.

Вот скрипт оболочки

#!/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
1 голос
/ 02 августа 2016

Я знаю, что это старая ветка, но она по-прежнему является наиболее популярной поисковой системой Google для "тихой печати", поэтому я добавлю свои выводы в пользу любого, кто столкнется с этим сейчас.

У нас была похожая проблема с печатью этикеток различных типов на различных принтерах для системы хранения. Потребовалось несколько проб и ошибок, но мы обошли это, заставив систему создать PDF-файл с этикетками, с именем принтера и кол-во страниц, закодированных в формате PDF. Все, что вам нужно сделать, это: В IE перейдите в Свойства обозревателя >> Безопасность >> Надежные сайты >> Сайты Снимите флажок «Требовать подтверждение сервера (https :) для всех сайтов в этой зоне» добавить "http://[yoururl]" и PDF будет распечатан автоматически.

Когда мы изначально это настраивали, мы использовали Chrome в качестве браузера по умолчанию, но в сентябре 2015 года Chrome отказался от запуска плагинов NPAPI. Это означало, что вы больше не можете выбирать плагин Adobe PDF в качестве обработчика PDF по умолчанию, а встроенный плагин PDF не поддерживает автоматическую печать :-( Он все еще работает в Internet Explorer (IE11 на момент написания статьи), но я не пробовал другие браузеры.

НТН Ура, Nige

1 голос
/ 19 ноября 2010

Я работаю весь день, используя простую страницу JSP и библиотеку Java PDF Renderer (https://pdf -renderer.dev.java.net). Это работает, потому что Java печатает с использованием ОС, а не браузера. Предположительно, «тихая печать» считается уязвимостью / уязвимостью браузера и была исправлена ​​после IE 6, так что удачи в ее работе через Javascript или Active X. Возможно, это возможно, но я не смог заставить ее работать без Java.

1 голос
/ 22 августа 2008

Я написал python tsr, который опрашивал сервер очень часто (он извлекал частоту опроса с сервера) и распечатывал на принтер этикеток. Было относительно приятно.

Однажды написав на python, я использовал для него py2exe, затем компилятор inno setup, затем включил интранет и попросил пользователя установить его.

Это было не здорово, но это работало. Пользователи запускали его утром, а программа получала переключатель kill с сервера ночью.

0 голосов
/ 28 октября 2014

Вы должны взглянуть на PrintNode . Они предоставляют услуги удаленной печати для веб-приложений. Вы устанавливаете программное обеспечение на рабочем столе, которое синхронизируется с их серверами. Затем вы можете отправлять задания на печать с помощью запроса json, и они мгновенно распечатываются.

0 голосов
/ 18 февраля 2012

У меня здесь одна и та же проблема, это то, чему я учусь до сих пор.

A .: Вам необходимо настроить IPP PrintServer

У вас есть несколько реализаций сервера печати, которые вы можете попробовать.

  1. Аппаратный сервер печати IPP: например, DLINK DPR-1020 или аналогичный, некоторые принтеры имеют эту встроенную функцию.

  2. Сервер Linux с CUPPS: http://www.howtoforge.com/ipp_based_print_server_cups

  3. Сервер XP-Pro с МКС: http://www.michaelphipps.com/ipp-print-server-windows-xp-solution

B .: Вам нужно сделать свое WebApp клиентом этого IPP-сервера, чтобы вы могли обрабатывать и отправлять запросы на печать каждого пользователя на сервер печати. ​​

PHP :: PRINT :: IPP - это PHP-библиотека, которую вы можете попробовать (она хорошо протестирована на чашечных серверах).

0 голосов
/ 22 августа 2008

Если это только внутреннее приложение, вы можете избежать печати из браузера и отправить распечатку непосредственно с сервера на ближайший принтер пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...