上下文:网站用户必须打印一些生成客户端(HTML / CSS)的页面(报告)。现在,他们需要一种功能,允许他们自动打印每份报告。
浏览器和服务器(Java)都可以访问打印机。
我的选择:
1 / 让浏览器打印报告而无需用户操作(使用window.print())
- >我认为不可能,会打开一个窗口,用户必须验证
2 / 在服务器上启动浏览器,打印报告并关闭浏览器
- >似乎相当复杂。有没有办法在不打开浏览器的情况下从Java生成HTML / CSS / javascript内容?
3 / 使用Java生成和打印报告
- >很容易,但我必须生成客户端和服务器端的报告......我想避免这种情况。如果它是唯一的解决方案,我可以在使用java生成PDF时使用我的CSS吗?
其他? / 还有其他我没想过的选择吗?
仅供参考:我们可以强制用户使用特定版本的特定浏览器
答案 0 :(得分:0)
我写了一个Java servlet,它针对基于Intranet的web应用程序执行此操作,看来您正在使用给定的打印机要求。
该servlet可能会被清除,但是从本质上讲,它使用a Java library built on wkhtmltopdf来解析请求正文中的HTML,然后根据请求选项/方法执行以下三种操作之一:
最近我还可以进行装订,双面打印,选择纸盘等打印,请参见# -*-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