档案管理系统打印功能不好用?三步搞定精准套打

一、利用CSS媒体查询修复原生打印布局

档案管理系统打印问题的根源在于浏览器默认打印机制会破坏网页布局。要解决“打印出来全是乱码”或“背景色丢失”的问题,必须通过CSS媒体查询强制重写打印样式。这是成本最低且见效最快的基础方案。

1.1 定义打印专用CSS规则

在项目的主样式文件中,不要依赖浏览器默认的“打印背景图形”选项,而是显式定义打印样式。以下代码块可以直接复制到你的CSS文件中,它解决了最常见的页边距溢出和隐藏元素问题。

```css @media print { / 强制重置页边距,确保内容不被裁切 / @page { size: A4; margin: 0; } body { / 打印时移除背景色和阴影,节省墨水并避免渲染错误 / background: white; color: black; / 确保高度自适应A4纸张 / height: auto; width: 100%; margin: 0; padding: 0; } / 隐藏所有不需要打印的页面元素,如导航栏、按钮、页脚 / .no-print, .navbar, .sidebar, .btn, .pagination { display: none !important; } / 打印容器强制设为块级元素并占满宽度 / .print-container { display: block !important; width: 100%; margin: 0; padding: 20mm; / 设置安全边距,防止打印机物理边距裁切内容 / box-sizing: border-box; background-color: white !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; } } ```

1.2 处理分页与内容截断控制

档案表格或长文本在打印时经常出现“一行文字被切成两半”的情况。使用以下CSS属性可以智能控制分页行为。请在对应的表格行或详情卡片类中添加这些属性。

```css / 避免表格行在分页处被切断 / table tr { page-break-inside: avoid; } / 避免图片在分页处被切断 / img { page-break-inside: avoid; max-width: 100%; } / 强制在特定元素前分页(例如每个新的档案详情页) / .page-break-before { page-break-before: always; } / 强制在特定元素后分页 / .page-break-after { page-break-after: always; } ```

二、前端集成Lodop实现复杂票据套打

对于档案管理中常见的“证书打印”、“回执单打印”等需要精确对齐打印纸(如预制单)的场景,浏览器原生打印无法满足毫米级定位需求。此时必须引入专业控件。Lodop是国产档案系统中最成熟的解决方案。

2.1 部署Lodop环境与检测

首先需要获取Lodop的安装包和JS文件。请访问Lodop官网下载页面:http://www.lodop.net/demolist/Lodop6.226_CL4526.zip(包含32/64位驱动及JS接口)。解压后将安装包安装在服务器或客户端,并将`LodopFuncs.js`放入项目静态资源目录。

在HTML页面中引入该JS文件,并编写检测代码,确保用户已安装打印控件。

```html ```

2.2 编写前端打印调用逻辑

档案管理系统打印功能不好用?三步搞定精准套打

以下代码实现了精准套打的核心逻辑。假设我们需要在一张固定的档案卡片上打印姓名和编号,坐标单位为毫米。请将此函数绑定到打印按钮的点击事件上。

```javascript function printArchiveCard(name, archiveId) { LODOP = getLodop(); LODOP.PRINT_INIT("档案管理系统-卡片打印"); // 初始化打印任务名称 // 设置纸张大小,这里以自定义90mm x 60mm的卡片为例 // 1表示单位为毫米,"Custom"表示自定义纸张 LODOP.SET_PRINT_PAGESIZE(1, "90mm", "60mm", "CreateCustomPage"); // 打印背景图(如果是预制纸,这步可以省略;如果是白纸打全版,需要添加背景) // LODOP.ADD_PRINT_IMAGE(0,0,"90mm","60mm","/static/images/card_bg.jpg"); // 添加纯文本:TOP, LEFT, WIDTH, HEIGHT, CONTENT // 注意:这里的坐标是相对于纸张左上角的绝对坐标 LODOP.ADD_PRINT_TEXT(15, 10, "30mm", "5mm", "姓名:"); LODOP.SET_PRINT_STYLEA(0, "FontSize", 11); // 设置字号 LODOP.ADD_PRINT_TEXT(15, 35, "40mm", "5mm", name); LODOP.SET_PRINT_STYLEA(0, "Bold", 1); // 加粗 LODOP.ADD_PRINT_TEXT(30, 10, "30mm", "5mm", "档案编号:"); LODOP.ADD_PRINT_TEXT(30, 35, "40mm", "5mm", archiveId); // 添加条形码(档案系统常用功能) LODOP.ADD_PRINT_BARCODE(45, 10, "50mm", "10mm", "128A", archiveId); // 预览打印 LODOP.PREVIEW(); // 如果需要直接打印,使用 LODOP.PRINT(); } ```

三、后端基于OpenHtmlToPdf生成标准归档文件

为了满足电子档案永久保存的要求,前端打印生成的文件往往不具备法律效力。我们需要在后端将HTML模板渲染为标准PDF文件。这里使用Java环境下的`OpenHtmlToPdf`(基于Flying Saucer),它对CSS3的支持优于iText原生库。

3.1 配置Maven依赖

在你的Maven项目的`pom.xml`中添加以下依赖。请确保版本号一致,避免Jar包冲突。

```xml com.openhtmltopdf openhtmltopdf-pdfbox 1.0.10 com.openhtmltopdf openhtmltopdf-java2d 1.0.10 org.slf4j slf4j-simple 1.7.36 ```

3.2 实现PDF生成核心工具类

创建一个名为`PdfGeneratorUtil.java`的类。这个工具类负责接收HTML字符串,加载系统字体(解决中文乱码问题),并输出PDF字节流。请特别注意字体路径的配置,代码中假设Linux服务器字体路径为`/usr/share/fonts`。

```java import com.openhtmltopdf.pdfboxout.PdfRendererBuilder; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; public class PdfGeneratorUtil { public static byte[] generatePdfFromHtml(String htmlContent) throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); try { PdfRendererBuilder builder = new PdfRendererBuilder(); // 1. 加载HTML内容 builder.withHtmlContent(htmlContent, null); // 2. 设置输出流 builder.toStream(os); // 3. 配置字体,这是解决中文打印乱码的关键 // 必须使用.addFont()方法显式加载包含中文字符的.ttf文件 // Windows环境示例,生产环境请替换为服务器上的实际路径 builder.useFont(new File("C:/Windows/Fonts/simsun.ttc"), "SimSun"); builder.useFont(new File("C:/Windows/Fonts/simhei.ttf"), "SimHei"); // 4. 构建并运行渲染 PdfRendererBuilder PdfRendererBuilder = null; builder.run(); } catch (Exception e) { throw new IOException("PDF生成失败: " + e.getMessage(), e); } return os.toByteArray(); } } ```

3.3 编写Controller接口供前端调用

创建一个Spring Boot控制器接口,前端只需发送包含档案数据的HTML模板字符串,即可下载生成的PDF。

```java import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/archive") public class ArchivePrintController { @PostMapping("/export-pdf") public ResponseEntity exportArchivePdf(@RequestBody String htmlContent) { try { // 调用工具类生成PDF字节数组 byte[] pdfBytes = PdfGeneratorUtil.generatePdfFromHtml(htmlContent); // 设置响应头,强制浏览器下载文件 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF); headers.setContentDispositionFormData("attachment", "archive_export.pdf"); headers.setContentLength(pdfBytes.length); return ResponseEntity.ok() .headers(headers) .body(pdfBytes); } catch (IOException e) { return ResponseEntity.internalServerError().build(); } } } ```

通过以上三个步骤,你完成了从浏览器基础样式修复、前端精准套打控件集成,到后端标准PDF归档生成的全套技术闭环。直接复制上述代码即可在项目中落地,彻底解决档案管理系统打印功能不好用的问题。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统