如何实现网站的自动打印?

时间:2014-02-07 10:55:00

标签: java html css browser printing

上下文:网站用户必须打印一些生成客户端(HTML / CSS)的页面(报告)。现在,他们需要一种功能,允许他们自动打印每份报告。

浏览器和服务器(Java)都可以访问打印机。

我的选择

1 / 让浏览器打印报告而无需用户操作(使用window.print())

- >我认为不可能,会打开一个窗口,用户必须验证

2 / 在服务器上启动浏览器,打印报告并关闭浏览器

- >似乎相当复杂。有没有办法在不打开浏览器的情况下从Java生成HTML / CSS / javascript内容?

3 / 使用Java生成和打印报告

- >很容易,但我必须生成客户端和服务器端的报告......我想避免这种情况。如果它是唯一的解决方案,我可以在使用java生成PDF时使用我的CSS吗?

其他? / 还有其他我没想过的选择吗?

仅供参考:我们可以强制用户使用特定版本的特定浏览器

1 个答案:

答案 0 :(得分:0)

我写了一个Java servlet,它针对基于Intranet的web应用程序执行此操作,看来您正在使用给定的打印机要求。

该servlet可能会被清除,但是从本质上讲,它使用a Java library built on wkhtmltopdf来解析请求正文中的HTML,然后根据请求选项/方法执行以下三种操作之一:

  1. 以pdf格式下载到客户端
  2. 将pdf内容打印到其中一台网络打印机
  3. 将pdf预呈现到服务器上的文件中,以供以后打印/ 下载

最近我还可以进行装订,双面打印,选择纸盘等打印,请参见# -*-coding:utf-8 -* import io import socket import struct import time import picamera from threading import Thread import gc class ControleurStreamingVideo(): def __init__(self): self.adresse='0.0.0.0' self.port=8000 self._serveur_socket = socket.socket() self._serveur_socket.bind((self.adresse, self.port)) self._connection = None self._thread=None self._fermer_serveur=False self._output=None def ouvrir_serveur(self): self._thread = Thread(target=self._connection_avec_client) self._thread.start() def _connection_avec_client(self): try: print("Serveur en attente d'une connection... port={} adresse={}".format(self.port, self.adresse)) self._serveur_socket.listen(5) self._connection = self._serveur_socket.accept()[0].makefile('wb') print("Connection réussi, début de la vidéo") except Exception as e: repr(e) self._envoit_image() def _envoit_image(self): camera=picamera.PiCamera() camera.resolution='VGA' camera.framerate=30 try: self._output = SplitFrames(self._connection, self) time.sleep(2) #warmup la caméra camera.start_recording(self._output, format='mjpeg', quality=30) while self._fermer_serveur==False: camera.wait_recording(1) camera.stop_recording() camera.close() self._serveur_socket.close() self._connection.close() except Exception as e: self._serveur_socket.close() del camera del self._output del self._connection del self._thread print("Connection avec le client perdu...") gc.collect() self.ouvrir_serveur() def fermer_serveur(self): self._fermer_serveur=True print("Serveur fermer") def _reouvrir_serveur(self): print("reouverture du serveur...") self.ouvrir_serveur() class SplitFrames(object): def __init__(self, connection, controleur_vid): self.connection = connection self.controleur_vid=controleur_vid self.stream = io.BytesIO() self._erreur=False def write(self, buf): if buf.startswith(b'\xff\xd8'): # Start of new frame; send the old one's length # then the data size = self.stream.tell() if size > 0: self.connection.write(struct.pack('<L', size)) self.connection.flush() self.stream.seek(0) self.connection.write(self.stream.read(size)) self.stream.seek(0) self.stream.write(buf) 方法:

print