原始打印和网络打印

大多数打印都会经过浏览器的打印对话框。还有两种方式可以跳过它:

  • 网络打印通过打印服务器(CUPS)将 PDF 直接发送到网络上的打印机。
  • 原始打印通过用户电脑上的 QZ Tray 向热敏打印机和标签打印机发送 ESC/POS 命令。

适用于 Frappe v16 及更高版本。

网络打印

开始之前

  • 一个 Frappe 服务器可以访问的 CUPS 打印服务器。
  • Frappe 服务器上的 pycups Python 包和 CUPS 系统库。使用系统的包管理器安装该库,然后在 bench 目录下运行 bench pip install pycups。

设置步骤

  1. 在打印设置中,开启启用打印服务器。
  2. 打开网络打印机设置列表,添加一台打印机,填写服务器的服务器 IP、端口和打印机名称。
  3. 在打印页面上,打开⋯ > 选择网络打印机并选择它。

现在点击打印会按照你选择的格式和样式将文档发送到该打印机。

原始打印

开始之前

  • 在每台需要打印的电脑上安装 QZ Tray。
  • 一个勾选了自定义格式和原始打印的打印格式,并在原始命令中填写打印机命令。你可以在命令中使用 Jinja。

设置步骤

  1. 在打印设置中,开启启用原始打印。
  2. 在打印页面上,选择原始格式。
  3. 打开⋯ > 原始打印设置,将该格式映射到 QZ Tray 找到的打印机。
  4. 点击打印。

原始格式的打印页面不会显示预览。

  • 打印设置
  • 打印文档

PDF生成

Frappe 使用三种引擎之一将打印格式转换为 PDF。

适用于 Frappe v16 及更高版本。

引擎 用途 说明
Chromium 在编辑器中创建的格式(默认)、标准格式,以及当打印设置中指定为 chrome 时的 HTML 格式 能正确渲染现代 HTML 和 CSS。首次需要时会自动下载到 bench 的 chromium 文件夹中,也可以提前通过 bench setup-chrome 下载。
Typst 在编辑器中创建的格式,且 PDF 渲染器 设置为 Typst(快速) 实验性功能。速度更快,适合批量打印。仅支持部分功能。
wkhtmltopdf 当打印设置中指定为 wkhtmltopdf 时的 HTML 格式 已不再维护。无法渲染多列或 flexbox 布局。仅为兼容旧版 HTML 格式而保留。

注意:wkhtmltopdf 在版本 17 中已被移除。所有 PDF 均由 Chromium 生成,设置为 wkhtmltopdf 的格式在迁移时会自动切换为 Chromium。

哪种引擎负责打印格式

  1. 在编辑器中创建的格式使用其自身的 PDF 渲染器 设置:Chromium 或 Typst。
  2. 其他格式如果设置了自身的 PDF 生成器,则使用该设置。
  3. 否则,使用打印设置中的 PDF 生成器。

Typst 无法打印的内容

在你选择 Typst 之前,编辑器会检查格式,并列出所有阻碍项:

  • 自定义 HTML 块和字段模板;
  • 格式或字段上的自定义 CSS,且使用了 Typst 无法转换的属性;
  • 除二维码以外的条形码;
  • 从网址加载的图片;
  • 非十六进制颜色值;
  • 带有自定义 CSS、HTML 或网络图片的信头。

如果使用 Typst 的格式之后出现了上述任一情况,打印会失败并给出明确的错误提示,而不会静默切换引擎。

故障排查

问题 需要检查的内容
PDF 中列堆叠在一起 该格式是用 wkhtmltopdf 打印的。请在打印设置中将 PDF 生成器 设为 chrome。
第一个 PDF 耗时很长 正在下载 Chromium。之后的 PDF 会很快。
在没有网络的服务器上 PDF 生成失败 无法下载 Chromium。请在有网络的地方运行 bench setup-chrome,或在 common_site_config.json 中将 chromium_path 设置为已安装的 Chromium。
PDF 中字体看起来不一样 在格式的 字体 中使用 Google Font 名称,以便 PDF 引擎能够加载它。
  • 打印格式编辑器
  • 打印设置

HTML打印格式

HTML 打印格式是通过 HTML 和 Jinja 手工编写的。当打印格式编辑器无法生成你需要的布局时,就可以使用它。对于大多数格式来说,用编辑器更快,也更容易维护。

适用于 Frappe v16 及更高版本。

开始之前

你需要:

  • 创建打印格式的权限;
  • 熟练使用 HTML、CSS 和 Jinja 模板。

创建 HTML 格式

  1. 打开打印格式列表,点击添加打印格式。
  2. 选择文档类型并输入名称。
  3. 将起始方式设为HTML,然后点击创建。
  4. 在 HTML 中编写模板并保存。

如果你想随应用一起发布某个格式,请开启开发者模式并勾选标准。这样该格式就会作为文件保存在应用中,并由 git 跟踪。

编写模板

文档可通过 doc 获取:

<h2>{{ doc.select_print_heading or _("Sales Invoice") }}</h2>
<p>{{ doc.customer_name }}</p>

<table class="table table-bordered">

<tr><th>{{ _("Item") }}</th>
<th class="text-right">{{ _("Amount") }}</th></tr>
    {% for row in doc.items %}

<tr>

<td>{{ row.item_name }}</td>
        <td class="text-right">{{ row.get_formatted("amount", doc) }}</td>
    </tr>
    {% endfor %}
</table>
  • _("text") 将文本翻译为打印语言。
  • doc.get_formatted("fieldname") 按照表单显示的方式格式化值,包括货币和日期格式。
  • frappe.get_doc、frappe.db.get_value 以及其他辅助函数均可使用。请参阅 Jinja API。
  • 在该格式的自定义 CSS字段中添加样式。

脚本报表和查询报表可以有自己的打印格式,使用 JavaScript 模板编写。请参阅报表的打印格式。

PDF 引擎

HTML 格式使用打印设置中设置的PDF 生成器。wkhtmltopdf 无法排版 flexbox 等现代 CSS,而且已不再维护,因此除非某个格式依赖 wkhtmltopdf,否则请使用 chrome。

  • Jinja API
  • 从其他文档获取信息
  • PDF 生成

打印标题

打印标题用于更改文档上打印的标题。例如,报价单可以打印为“提案”,或者销售发票可以打印为“形式发票”。

适用于 Frappe v16 及更高版本。

创建打印标题

  1. 打开打印标题列表,然后点击添加打印标题。
  2. 在打印标题中输入标题,例如“形式发票”。
  3. 保存。

使用它

支持该功能的文档都有一个打印标题字段,通常位于表单的打印设置部分。在那里选择标题并保存。打印输出将显示该标题,而不是文档类型的名称。

该字段会列出站点上的所有打印标题,涵盖所有文档类型。请为标题取清晰的名称,并删除没人使用的标题,以保持列表简短。

如果只想为某一次打印使用某个标题,而不更改文档,请改用 HTML 打印格式,或在编辑器中用文本块创建的格式。

信头

信头是贵公司的页眉和页脚,打印时会出现在打印稿的顶部和底部。当打印设置中开启重复页眉和页脚时,它会在每一页上重复出现。

适用于 Frappe v16 及更高版本。

创建信头

  1. 打开信头列表,点击添加信头。
  2. 输入信头名称。
  3. 设置信头基于:
    • 图片:上传页眉图片,并设置其高度、宽度和对齐方式。这是最简单的方式,适合放置徽标或设计好的横幅。
    • HTML:用 HTML 编写页眉。你可以使用 Jinja,例如 {{ doc.company }}。
  4. 在页脚基于下用同样的方式设置页脚。
  5. 勾选默认信头,以便在未选择其他信头时使用它。
  6. 保存。

信头会原样打印你放入的内容,因此在将其设为默认之前,请检查地址、电子邮件和电话号码。

对于文档,请将信头用于保持为文档类型。如果信头用于报表打印,请选择报表。

使用信头

  • 在打印页面上,在信头中选择它。留空则不使用信头打印。
  • 在打印格式编辑器中,在页面设置中设置信头,以便将其与格式一起保存。点击页面上的信头可更改其图片、对齐方式或大小。
  • 带有自己的信头字段的文档会使用该信头。

只有当打印设置中开启重复页眉和页脚时,页眉和页脚才会在每一页上重复出现。关闭时,页脚只会在末尾打印一次,并且打印页面会在信头旁边显示警告。

提示

  • 使用至少为实际打印尺寸两倍的图片,以保持清晰。
  • 在格式的上边距中为页眉留出空间。
  • 带有自定义 CSS 的 HTML 信头无法使用 Typst 渲染器打印。

打印设置

打印设置保存了全站范围的打印默认值。只有系统管理员才能修改它。

可以从打印工作区打开它,或者在打印页面上通过⋯ > 打印设置打开。

适用于 Frappe v16 及更高版本。

PDF 设置

设置项 作用
以 PDF 发送打印件 邮件会将打印件作为 PDF 附件发送。关闭时,则以 HTML 附件发送。默认开启。
每页重复页眉和页脚 在每一页上打印页眉和页脚(包括信头)。关闭时,页眉只在顶部打印一次,页脚只在末尾打印一次。默认开启。
PDF 生成器 用于非编辑器创建的格式的引擎:chrome 或 wkhtmltopdf。编辑器创建的格式始终使用 Chromium 或 Typst。参见 PDF 生成。
PDF 页面尺寸 默认纸张尺寸,除非更改否则为 A4。选择自定义可以输入以毫米为单位的高度和宽度。
批量打印文档上限 单个批量 PDF 中最多包含的文档数。默认 100。
每用户最大并发批量导出数 一个人同时可以运行的批量导出数量。默认 5。

注意:版本 17 中移除了 PDF 生成器设置,所有 PDF 都使用 Chromium 生成。

页面设置

设置项 作用
使用信头打印 选择打印页面上的默认信头
允许打印草稿 允许用户打印已保存但未提交的文档。默认开启。
始终添加”草稿”标题 在打印的草稿上添加”草稿”横幅
允许表格内分页 允许长表格行跨页拆分
允许打印已取消的文档 允许用户打印已取消的文档

应用可以在此处添加自己的设置。ERPNext 添加了紧凑物料打印、数量后打印计量单位和打印零金额税费,这些也会显示在其文档的打印页面侧边栏中。

设置项 作用
启用打印服务器 通过 CUPS 将打印任务发送到网络打印机
启用原始打印 通过 QZ Tray 向热敏打印机和标签打印机发送 ESC/POS 命令

参见原始打印和网络打印。

设置项 作用
打印样式 标准格式的默认打印样式。默认为 Redesign。
字体和字号 HTML 格式的字体。编辑器创建的格式会设置自己的字体。

打印样式

打印样式会改变标准打印格式的外观:表格、章节标题和边框。你可以在打印页面上选择一种样式,这样无需创建格式就能获得不同的外观。

适用于 Frappe v16 及更高版本。打印页面上的样式选择器是 frappe/frappe#44232 中新增的功能。

内置样式

样式 外观
默认 标准外观:标签在值上方,浅色表头,带线的章节标题
现代 开放轻盈:圆角表头,无表格边框,低调的章节标题
经典 框线风格:每个章节都是带边框的网格,标题带底纹,表格有完整边框
粗体 章节标题和表头使用深色色带
条纹 紧凑:较小的文字,交替行底纹,表头下方只有一条线。适合较长的项目列表。
单色 仅使用黑色文字和线条,无填充

默认是名为Redesign的记录。

为单次打印选择样式

  1. 打开打印页面并选择标准格式。

  2. 在样式下,点击一张卡片。预览会更新。

  3. 可选:选择字体或开启省墨模式。

  4. 打印、下载 PDF 或通过电子邮件发送。这三种方式都会使用你选择的样式。

设置默认样式

打开打印设置并设置打印样式。当未选择样式时,将使用此样式,包括定时邮件和通知。

创建你自己的样式

  1. 打开打印样式列表,然后点击添加打印样式。
  2. 输入打印样式名称。
  3. 编写 CSS。将规则限定在标准布局范围内,以免影响在编辑器中创建的格式:
.print-format-doc.print-format-doc--standard .section-label {
    color: #1f4e79;
    border-bottom: 2px solid #1f4e79;
}
  1. 保存。该样式会作为卡片显示在打印页面上。

标准布局中有用的类:

类 元素
.print-format-doc 整个文档
.print-format-doc--standard 仅出现在标准格式上
.print-heading 顶部的文档标题和编号
.section, .section-label 一个章节及其标题
.field .label, .field .value 字段的标签和值
.child-table .table th, td 子表格表头单元格和单元格

要隐藏某个样式而不删除它,请勾选已禁用。

样式和其他格式

  • 在编辑器中创建的格式有自己的设计,因此不会为它们显示样式卡片。
  • HTML 格式会获得样式的 CSS,但只有针对其类编写的规则(例如 .print-format)才会生效。
  • 打印文档
  • 打印格式编辑器

版本、代码片段和快捷方式

本页介绍三项能让打印格式编辑器的日常工作更快、更安全的功能:版本历史、可复用片段和键盘快捷键。

适用于 Frappe v16 及更高版本。

版本历史

每个格式都会保留历史记录,因此你可以放心尝试修改,不必担心丢失可用的设计。

点击工具栏中的时钟按钮即可打开。

面板中列出:

条目 说明
当前版本 你正在编辑的内容。当你有尚未应用的更改时,会显示工作草稿 · 尚未应用;没有更改时,显示与打印内容相同。
已发布版本 当前实际打印的内容。
已保存版本 之前保存的副本,最新的排在最前面。每次点击保存并应用时会自动保存一个副本,这些副本标记为保存并应用。你自己保存的副本则使用你为其指定的名称。

保存版本

在进行重大修改之前,先保留当前设计的副本:

  1. 打开版本历史。
  2. 点击面板顶部的书签按钮(保存命名版本)。
  3. 输入版本名称,例如“新税务布局之前”,然后点击保存。

查看旧版本

点击任意条目即可在页面上查看。页面会显示一条横幅,提示你正在查看旧版本,编辑已暂停。点击当前版本可返回你的草稿。

恢复到旧版本

  • 将鼠标悬停在已保存版本上,点击将此版本恢复为草稿。它会替换你的草稿。在你点击保存并应用之前,打印内容不会发生变化。
  • 如果要丢弃草稿并从当前打印内容重新开始,请使用已发布版本上的按钮。
  • 如果要删除已保存的版本,请将鼠标悬停在其上,然后点击删除此版本。

片段

片段是你保存下来以便日后复用的区块或字段,包含其所有设置。对于需要用在多个格式中的部分,可以使用片段:银行信息框、签名区块、条款部分等。

保存片段

  1. 选择区块或字段。
  2. 点击右侧面板顶部的书签按钮(保存为片段),或右键点击并选择保存为片段。
  3. 输入片段名称,然后点击保存。

使用已有片段的名称保存会替换该片段。

使用片段

打开库标签页。在已保存片段下,区块列在前面,然后是字段。将片段拖到页面上,或点击它将其添加到所选内容下方。

库中会显示为同一文档类型创建的片段,以及适用于任何文档类型的片段。要删除片段,请点击其上的垃圾桶按钮。

键盘快捷键

在 Mac 上,请使用 Cmd 代替 Ctrl。

编辑

按键 操作
Ctrl+S 保存并应用
Ctrl+Z 撤销
Ctrl+Shift+Z 或 Ctrl+Y 重做
Ctrl+C 复制所选区块或字段
Ctrl+V 粘贴
Ctrl+D 复制所选内容
Delete 或 Backspace 删除所选内容
Alt+↑ / Alt+↓ 将所选内容上移或下移

导航

按键 操作
↑ / ↓ 选择上一项或下一项
← 在区块上,折叠该区块。在字段上,选择其所在区块。
→ 在区块上,展开该区块或选择其第一项
Esc 选择父级,再按则取消选择。未选择任何内容时,右侧面板显示页面设置。
/ 跳转到搜索字段
Shift+点击 选择一组连续的字段
Ctrl+点击 将字段添加到所选内容中

缩放

按键 操作
Ctrl+= 放大
Ctrl+- 缩小
Ctrl+0 重置为 100%

当你在输入框中输入、预览打开或正在查看旧版本时,快捷键不会生效。

  • 打印格式编辑器
  • 区块

页面设置和PDF渲染器

页面设置适用于整个打印格式:字体、颜色、页边距、信头、页码,以及将格式转换为 PDF 的引擎。要查看这些设置,请点击画布的空白区域,或按 Esc 直到没有选中任何内容。

适用于 Frappe v16 及更高版本。

排版

设置 作用
字体 来自 Google Fonts 的任意字体,例如 Inter、Roboto 或 Lora。开始输入即可搜索。默认使用系统字体。
字体大小 基础文本大小,以像素为单位。默认为 14。字段和区块可以设置自己的大小。

样式

设置 作用
标签 所有字段标签的颜色。
值 所有字段值的颜色。
标签后加冒号 在每个标签后添加冒号,如 Invoice No: ACC-SINV-0001。要从某个字段中移除冒号,请打开该字段的隐藏冒号。

颜色必须是十六进制代码,例如 #1f2937。

间距(毫米)

页边距设置页面四周的空间,即上、右、下、左,单位为毫米。默认每边为 15。如果纸张上有预印的信头,请将上边距调大。

文档

设置 作用
PDF 渲染器 生成 PDF 的引擎:Chromium 或 Typst(快速)。详见下文。
信头 与此格式一起保存的信头。保留为无信头则不打印信头。参见信头。
页码 打印“第 1 页,共 3 页”的位置:隐藏、左上、顶部居中、右上、左下、底部居中或右下。

自定义 CSS

适用于整个格式的 CSS。用它来编写同时作用于多个部分的规则:

.print-format-doc .section-label {
    color: #1f4e79;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

有用的类:

类 元素
.print-format-doc 整个文档
.section 一个区块
.section-label 区块标题
.field .label 字段的标签
.field .value 字段的值
.child-table .table th 表头单元格
.child-table .table td 表格单元格

注意:在此处使用了自定义 CSS 的格式无法使用 Typst 渲染器。

选择 PDF 渲染器

两种渲染器从同一设计生成相同的布局。区别在于速度以及它们能处理的内容。

Chromium Typst(快速)
速度 正常 快得多,适合批量打印
自定义 HTML 区块 支持 不支持,请使用 Typst 区块
自定义 CSS 支持 仅支持简单的字段样式
条形码 所有格式 仅支持二维码
来自网址的图片 支持 不支持,请上传图片
状态 默认 实验性

Chromium 是默认选项,能处理编辑器支持的所有内容。除非你需要更快的速度,否则请选择它。

Typst(快速)是实验性的。当格式使用了 Typst 无法渲染的内容时,它会被置灰。将鼠标悬停在PDF 渲染器旁边的信息图标上可查看列表。你可能会看到:

原因 处理方法
样式框中有自定义 CSS 移除页面的自定义 CSS。
HTML 区块 移除自定义 HTML区块,或将其改写为 Typst 区块。
不是二维码的条形码 将条形码的格式改为QR,或将其移除。
从网址加载的图片 改为上传图片,而不是使用 URL。
包含 HTML 内容的信头 使用图片信头。
包含 HTML 内容的信头页脚 使用图片页脚,或不用页脚。
带有自定义 CSS 的信头 移除信头中的 CSS。
不是十六进制代码的颜色 将列出的颜色改为诸如 #1f2937 之类的代码。
字段上的自定义 CSS 移除所列字段的自定义 CSS。Typst 在那里仅支持少数简单样式,例如粗体以及上边框或下边框。
字段模板区块 移除该区块。

如果在选中 Typst 时添加了 Typst 无法渲染的内容,编辑器会切换回 Chromium 并告知原因。

使用 Typst 时,还要检查 PDF 预览中的分页符和空字段,因为 Typst 尚未以相同方式处理所有布局设置。

  • 节、列和页面
  • 块
  • PDF 生成

显示或隐藏内容

一个打印格式往往需要应对多种情况:已付款和未付款的发票、本地订单和出口订单、有税号和无税号的客户。与其为每种情况各做一个格式,不如给那些只在某些时候才需要打印的部分加上条件。

适用于 Frappe v16 及更高版本。

可以在哪里添加条件

对象 设置项 打印时机
一个区块 可见性 > 条件 条件为真时
一个字段或块 可见性 > 条件 条件为真时
一个表格 可见性 > 条件 条件为真时
表格的行 可见性 > 满足以下条件时显示行 该行满足条件时
表格的列 列设置 > 满足以下条件时显示列 文档满足条件时

条件留空则始终打印。

编写条件

条件是一段简短的 Python 表达式。用 doc 表示你正在打印的文档,用 doc.fieldname 表示它的字段:

doc.status == "Paid"

字段名是 字段 选项卡中的名称,而不是标签。例如“客户名称”字段是 doc.customer_name。

你可以使用比较运算符(==、!=、>、<、>=、<=)、and、or、not、in,以及函数 int、float 和 round。条件中不能使用其他 Python 函数。

示例

doc.status == "Paid"                       # only on paid invoices
doc.status != "Paid"                       # only on unpaid invoices
doc.discount_amount > 0                    # only when there is a discount
doc.currency != "USD"                      # only for foreign currency
doc.customer_group == "Export"             # only for export customers
doc.tax_id                                 # only when a tax ID is filled in
not doc.is_return                          # hide on credit notes
doc.status in ("Overdue", "Unpaid")        # one of several values
doc.grand_total >= 10000 and doc.po_no     # both must be true
doc.total_qty > 100                        # only large orders

表格行

在 满足以下条件时显示行 中,用 row 表示正在打印的行:

row.qty > 0                    # skip zero quantity rows
row.item_group == "Products"   # only products
not row.is_free_item           # hide free items

表格列

满足以下条件时显示列 是针对整个文档检查一次,而不是逐行检查,所以使用 doc:

doc.discount_amount            # show the discount column only when there is a discount
doc.currency != "USD"          # show an exchange rate column for foreign currency

print_settings 保存了站点的打印设置,因此条件可以跟随站点范围的开关:

print_settings.print_taxes_with_zero_amount or doc.total_taxes_and_charges

实时查看

在预览中选定一个文档后,编辑器会在你输入时检查条件,并在下方显示以下之一:

标记 含义
当前可见 该文档满足条件。它将被打印。
当前隐藏 条件为假。该文档不会打印它。
无法检查此条件 条件有错误。将鼠标悬停在标记上可查看。
加载文档以查看实时状态 尚未选择预览文档。

在页面上,隐藏的部分会显示为灰色。在 图层 选项卡中,任何带条件的部分都有一个眼睛图标,将鼠标悬停在其上会显示条件。

条件出错时

  • 如果条件不是有效的 Python,例如缺少引号,保存并应用 会停止并显示哪个条件有误。
  • 如果条件有效但在打印时失败,例如使用了不存在的字段,该部分仍会 照常打印,以免信息丢失。错误会记录一次到 错误日志 中,标题为“打印格式条件失败”,并附上格式名称。
  • 字段
  • 表格