首页 > 其他分享 >使用docx-preview打印文档时,页数超出和页面元素样式问题

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

时间:2024-06-18 15:29:54浏览次数:19  
标签:docx printer 样式 打印 页数 padding important 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 元素。

标签:docx,printer,样式,打印,页数,padding,important,preview,页面
From: https://blog.csdn.net/weixin_45408984/article/details/139774548

相关文章

  • 强大的网页数据库管理工具Adminer
    老苏折腾过的项目,数据库主要是MySQL,其次是MongoDB、PostgreSQL和SQLite,最近还用到了Elasticsearch,但是数据库管理软件phpMyAdmin只能管理MySQL,老苏一直在找一个全能的数据库管理器,似乎Adminer可以满足要求。什么是Adminer?Adminer(原phpMinAdmin)是一个用PHP编......
  • x.thumbnailer 修复psd缩略图/nemo-preview 自定义预览
    缩略图https://askubuntu.com/questions/1368910/how-to-create-custom-thumbnailers-for-nautilus-nemo-and-caja安装imagemagicksudoaptinstallimagemagick-6.q16/usr/share/thumbnailers/psd.thumbnailerhttps://moritzmolch.com/blog/1749.htmlcd/usr/share/thumbn......
  • 达梦数据库专用机报错会话读取数据页数超过资源限制设置值
    应用报错:专用机报错会话读取数据页数超过资源限制设置值 1、问题描述某单位程序中某个账户连接操作达梦数据库,日志中报错“会话读取数据页数超出超过资源限制值”,程序抛出异常处理并回退事务。此类问题一般出现在安全版ZYJ数据库上,像通用机的企业版数据库所有新建用户的资源......
  • Preview failedUnable to start the previewer. openPreviewerLog to check for detai
    DevEcostudio预览器报错 PreviewfailedUnabletostartthepreviewer.openPreviewerLogtocheckfordetails.有两种原因1.main_page.json     src下的路径是否重复        2.struct关键字声明自定义组件名称是否重复我自己排查出来的......
  • 新建 DOCX 文档
    三元运算符packagestep4;importjava.util.Scanner;publicclassTestYear{ publicstaticvoidmain(String[]args){ Scannersc=newScanner(System.in);intyear=sc.nextInt();booleanresult;/********start********/result=(year%400==......
  • Python神技:pd.read_excel怎样读取多sheet页数据
    哈喽,大家好,我是木头左!今天,我要分享的是一个非常实用的Python技能,那就是如何在Python的pandas库中使用pd.read_excel函数来读取Excel文件的多个sheet页数据。一、为什么要读取Excel的多个sheet页数据?在数据分析和处理的过程中,经常需要处理包含多个sheet页的Excel文件。比如,你......
  • feapder通过selenium爬取网页数据-用到yield关键字可循环爬取
    importrandomimporttimeimportfeapderfromfeapder.utils.webdriverimportWebDriverfromparselimportSelectorfromfeapder.db.mysqldbimportMysqlDBfromselenium.webdriver.common.byimportByclassTestRender(feapder.AirSpider):db=MysqlDB()__cust......
  • VS2022和VS2022 Preview的主要区别
    原文链接:https://tieba.baidu.com/p/8678521627VS2022和VS2022Preview的主要区别在于功能和稳定性。VS2022是微软官方出品的最新版本的开发工具包系列产品,是一个完整的开发工具集,包含了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。而......
  • PreviewMouseLeftButtonDown与MouseLeftButtonDown的撕烤
    在WPF(WindowsPresentationFoundation)中,PreviewMouseLeftButtonDown和MouseLeftButtonDown是两个常用的鼠标事件,它们在事件路由策略和处理时机上有所不同。了解这两个事件的区别以及如何在实际应用中使用它们,可以帮助开发者更好地处理用户交互。事件的基本区别PreviewMouseL......
  • .NET快速实现网页数据抓取
    前言今天我们来讲讲如何使用.NET开源(MITLicense)的轻量、灵活、高性能、跨平台的分布式网络爬虫框架DotnetSpider来快速实现网页数据抓取功能。注意:为了自身安全请在国家法律允许范围内开发网页爬虫功能。网页数据抓取需求本文我们以抓取博客园10天推荐排行榜第一页的文章标......