js 连接打印机打印文件流 并跳过预览
时间: 2023-07-30 10:05:08 浏览: 90
要连接并打印文件流,您可以使用JavaScript的WebAPI中的Printer API。以下是一个例子:
```javascript
const printFile = async (file) => {
const printer = window.parent.document.getElementById('printer-frame').contentWindow
// Convert file to base64 string
const reader = new FileReader()
reader.readAsDataURL(file)
await new Promise((resolve) => {
reader.onload = () => {
resolve()
}
})
const base64File = reader.result.split(',')[1]
// Send print command to printer
printer.postMessage({
type: 'print',
data: base64File
})
}
// Usage
const file = new File(['file content'], 'test.txt', { type: 'text/plain' })
printFile(file)
```
这个例子假设你有一个 iframe 嵌入到页面中,它的 ID 是 `printer-frame`,并且该 iframe 中包含以下代码:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Printer Frame</title>
</head>
<body>
<script>
// Listen for print message from parent window
window.addEventListener('message', (event) => {
if (event.data.type === 'print') {
// Convert base64 string to binary
const binaryFile = atob(event.data.data)
const arrayBuffer = new ArrayBuffer(binaryFile.length)
const uint8Array = new Uint8Array(arrayBuffer)
for (let i = 0; i < binaryFile.length; i++) {
uint8Array[i] = binaryFile.charCodeAt(i)
}
// Create blob from binary data
const blob = new Blob([arrayBuffer], { type: 'application/octet-stream' })
// Print blob
const printPromise = window.print(blob)
// Wait for printing to finish
printPromise.then(() => {
// Send print complete message to parent window
window.parent.postMessage({
type: 'printComplete'
})
})
}
})
</script>
</body>
</html>
```
这个 iframe 监听来自父窗口的名为 `print` 的消息,该消息包含要打印的文件的 base64 编码字符串。它将该字符串转换为二进制数据,然后创建一个 Blob 对象。最后,它使用 `window.print()` 方法打印该 Blob 对象,并在打印完成时发送名为 `printComplete` 的消息到父窗口。
阅读全文