使用docx-preview打印文档时,页数超出和页面元素样式问题

# 在打印时调整内容边距及隐藏 Header 的问题和解决方案

## 问题描述

在使用 JavaScript 代码唤起打印窗口时,生成的文档中 `<section>` 标签自带 `padding` 样式,这导致内容无法铺满整个 A4 页面。此外,页面中还有一个 `header` 元素会占据头部的一部分高度,需要在打印时去掉。

## 示例代码

以下是初始代码示例,用于唤起打印窗口并渲染文档内容:

```javascript
const docxOptions = {
  inWrapper: false, // 启用围绕文档内容的包装器渲染
  ignoreWidth: false, // 禁用页面的渲染宽度
  ignoreHeight: false, // 禁止渲染页面高度
  ignoreFonts: false, // 禁用字体渲染
  breakPages: true, // 在分页符上启用分页
  ignoreLastRenderedPageBreak: true, // 在 lastRenderedPageBreak 元素上禁用分页
}

const blob = new Blob([res]);
const printer = window.open('', 'printwindow');

renderAsync(blob, printer.document.body, null, docxOptions).then(() => {
  printer.print();
  // printer.close();
});

问题原因

在打印时,<section> 标签的内联样式 padding: 72pt 90pt; width: 612pt; min-height: 792pt; column-count: 1; column-gap: 36pt; 会导致内容未能铺满页面。同时,<header> 元素会占据顶部空间,影响打印布局。

解决方案

为了解决上述问题,我们需要:

  1. 使用更高优先级的 CSS 选择器重置 <section> 标签的内边距 (padding)。
  2. 隐藏所有 header 元素。
  3. 确保内容铺满整个 A4 页面。

解决方案代码

以下是更新后的代码,通过添加打印样式来覆盖默认样式和内联样式:

const docxOptions = {
  inWrapper: false, // 启用围绕文档内容的包装器渲染
  ignoreWidth: false, // 禁用页面的渲染宽度
  ignoreHeight: false, // 禁止渲染页面高度
  ignoreFonts: false, // 禁用字体渲染
  breakPages: true, // 在分页符上启用分页
  ignoreLastRenderedPageBreak: true, // 在 lastRenderedPageBreak 元素上禁用分页
}

const blob = new Blob([res]);
const printer = window.open('', 'printwindow');

renderAsync(blob, printer.document.body, null, docxOptions).then(() => {
  // 创建样式元素
  const style = printer.document.createElement('style');
  style.type = 'text/css';

  // 添加打印样式
  style.innerHTML = `
    @media print {
      @page {
        size: A4; /* 设置页面尺寸为A4 */
        margin: 0; /* 设置页面边距为0 */
      }

      body {
        margin: 0; /* 设置内容边距为0 */
        padding: 0; /* 设置内容内边距为0 */
      }

      /* 确保内容铺满页面 */
      .docx {
        width: 100vw !important; /* 设置内容宽度为视窗宽度 */
        height: 100vh !important; /* 设置内容高度为视窗高度 */
        padding: 0 !important; /* 重置内边距 */
      }

      /* 更加具体的选择器 */
      section.docx {
        padding: 0 !important;
        width: 100vw !important;
        min-height: 100vh !important;
        column-count: 1 !important;
        column-gap: 0 !important;
      }

      /* 隐藏所有 header 元素 */
      header {
        display: none;
      }
    }
  `;

  // 将样式元素添加到打印窗口的文档头部
  printer.document.head.appendChild(style);

  // 调用打印功能
  printer.print();
  // 关闭打印窗口
  // printer.close();
});

解释

  1. 使用 !important:在 .docxsection.docx 选择器中添加 !important,确保这些样式具有最高优先级,覆盖任何内联样式。
  2. 更具体的选择器:使用 section.docx 选择器,以提高优先级覆盖内联样式。
  3. 设置页面尺寸和边距:确保页面尺寸为 A4,并且页面边距为 0。
  4. 隐藏 header 元素:确保 header 元素在打印时被隐藏。

调试和验证

  1. 打印预览:通过浏览器的打印预览功能检查效果,确保 <section> 标签的 padding 被重置,内容铺满 A4 页面。
  2. 进一步调整样式:如有需要,进一步调整或隐藏其他带有不必要样式的元素。

通过这种方法,可以确保在打印时 <section> 标签的 padding 被重置,并且内容能够完全铺满 A4 页面,同时隐藏 header 元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饿死了

三连和打赏总要留一个吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值