md 打印器
通过 Svelte 模板将 Markdown 或 YAML 文件变成 PDF 或 HTML 文档。 PDF由本地安装的Chromium浏览器打印出,因此没有捆绑的Chrome下载.
安装
npm i -g @cenk1cenk2/md-printer
所需资源
- 节点.js >= 24.15.
- 基于铬的浏览器. md-打印机的使用
puppeteer-core永远不要下载.
浏览器可执行文件按此顺序解决:
--browser <path>。如果此路径无法执行,则 md-printer 将失败,而不是掉回.PUPPETEER_EXECUTABLE_PATHCHROME_PATH- 勇敢克洛姆克洛姆克洛姆克洛姆克洛姆克洛姆克洛姆克洛姆克洛德克洛德克洛德克洛德克洛德克洛德克洛德克洛德克洛德克
PATH。仅支持 Linux .
当运行为根或当 CI 设置环境变量, 浏览器以 --no-sandbox,因为Chromium拒绝启动它的沙盒作为根,这是CI容器中的默认.
使用量
# render to document.pdf in the current directory
md-printer document.md
# choose the output file
md-printer document.md out/document.pdf
# write to stdout, logs go to stderr
md-printer document.md -O > document.pdf
# read from stdin, the only argument is then the output
cat document.md | md-printer --stdin out.pdf
# template by built-in name or by path to a template directory
md-printer document.md -t kilic.dev
md-printer document.md -t ./my-template
# language for template translations
md-printer invoice.yaml -t invoice -l de
# one single page without page breaks
md-printer document.md --continuous
# HTML output instead of PDF
md-printer document.md -F html
- 从扩展中检测到输入类型( E)
.md, (中文(简体) ),.yaml, (中文(简体) ),.yml和标记下 Stdin。 用它来代替它-f, --input-filetype。 。 。 . - YAML 输入没有正文,整个文档是
data的模板。 发票用这个. - 输出默认为
<input name>.<pdf|html>在当前目录中。 没有输入文件(stdin)没有默认,通过输出参数,dest前题或-O。 。 。 . - 输出在原子上被写入:旁边的临时文件被重新命名为正位,保留了已有文件的模式和所有者.
dest在前置事项和输出参数中解决当前目录,而本地资产则解决输入文件目录(当前 stdin目录)的问题.- 只装入输入目录内的文件,用于PDF和HTML。 共通链接先被跟踪,所以目录外的链接指针也没有被加载. 远程图像按原样装入.
- HTML 输出本地图像作为数据 URI: 图像属性(
src, (中文(简体) ),srcset, (中文(简体) ),poster, (中文(简体) ),style属性和<style>块。 文本和代码样本从未被重写. -T, --title设置文档标题,参见 优先级。 。 。 .
标记
标记为 统一: GitHub flavored markdown (表格,任务列表,脚注,自动链接),标题 ids,语法加亮与所选的加亮. js 主题和原始 HTML 也进行了解析,所以用 HTML 书写的标题或代码块也会得到其ID并突出显示.
::pagebreak 在自己的线路上开始一个新的页面。 它在任何地方工作,同样在弹性或网格布局内部,在连续模式下,每个部分都成为自己高度的一页. <div class="page-break"></div> 在 HTML 中和 PageBreak 构成部分::page-break)作同为相.
构成部分
将 Svelte 组件标记为 指令模板的组件和 共享组件 由kebab案的档案名称提供, PaymentInfo.svelte 作为 payment-info数字 :
::payment-info{iban="AT00 0000" due="14"}
:::callout{type="warning"}
Inner markdown, **bold** included, is rendered and passed as `children`.
:::
Total :items[3 items]{count="3"} so far.
::name{...}在它自己的线上是一个没有孩子的叶子部分.:::name{...}直至结束:::是一个容器。 其内容被渲染为下调和通过children片断.:name[label]{...}内部文本是内在的。 标签作为children。 。 。 .- 属性作为道具传递,始终作为字符串:
{count="3"}给count: '3'。 。 。 .{.note #intro flag}给class, (中文(简体) ),id财务报告和审定财务报表flag: ''。 。 。 . - 没有组件的名称保留着它写成的文字,所以
10:30am, (中文(简体) ),note:here或者说::unknown打印时间不变.
前题和设置
Markdown文件取YAML前题. 对于 YAML 输入,相同的密钥是文件的顶级密钥. 所有其他密钥都以 data。 。 。 .
| 密钥 | 说明 |
|---|---|
template | 内建模板名称或模板目录路径. |
dest | 输出文件,相对于当前目录,而不是输入文件. |
outputFiletype | pdf (违约)或 html。 。 。 . |
language | 模板翻译语言. |
continuous | true 使每个部分各有一页,每页与内容一样高,只在分页时分开. |
documentTitle | 文件标题. |
pdfOptions | 傀儡 PDF 选项,在默认情况下合并. |
sign | 签名选项,参见 签名。 。 。 . |
模板可携带 settings.json 其文档默认值 :
| 密钥 | 说明 |
|---|---|
pdfOptions | 傀儡PDF选项. |
i18n | { "language": "en", "fallback": "en" },默认和倒置的翻译语言. |
sign | 签名选项. |
continuous | 默认持续渲染. |
media | CSS 用于打印的介质类型, screen (违约)或 print。 。 。 . |
highlightStyle | 突出显示.j 主题名称来自 highlight.js/styles,默认为 atom-one-dark。 。 。 . |
默认 pdfOptions 为: format: A4, (中文(简体) ), printBackground: true 和比值 30mm 40mm 30mm 20mm (上,右,下,左). pdfOptions 被递归合并,所以文档可以覆盖单个密钥. margin 可能是 CSS 的短手字符串, 例如 "18mm 12mm",而平面数字是像素,在连续模式中也是如此.
---
template: kilic.dev
dest: ./out/report.pdf
language: de
documentTitle: Quarterly Report
pdfOptions:
format: A4
margin: 20mm
---
优先发言
- 常规:旗帜 > 前事 > 模板
settings.json> 默认值.pdfOptions按默认顺序按密钥合并,settings.json前题. - 语言是
--language,则language,则settings.jsoni18n.language,则en。 。 。 . continuous当任何--continuous前题或settings.json允许它.- 文档标题是
--title,则documentTitle,然后是<title>,然后输入文件名称.
发展
md-printer document.md --preview
md-printer document.md out.pdf --preview --no-open
-p, --preview当输入文件、模板(组件、导入、,settings.json,翻译)或页面修改所使用的本地资产. 每个构建重写输出文件, 和正常运行所写的相同; 从 stdin 读取, 没有输出参数只预览 .-O不被支持.- 它启动本地预览服务器,并在被发现浏览器的应用窗口中打开,使用丢弃的配置文件. 该页面有 HTML, Split 和 PDF 标签. 构建错误,例如斯维尔特编译错误,在覆盖中显示,并由下个成功构建清除. 关闭窗口结束会话 。 Ctrl+C 在关闭浏览器、预览服务器和监视器后也结束它, 并用 130 退出; 第二 Ctrl+ C出口马上.
--host设置回路主机, 默认127.0.0.1。 。 。 .--port设置端口, 默认0(放纵. 正在使用的端口以出错失败运行 .- 它服务于输入旁边的文件, 除了点文件, 如
.env。 。 。 . --no-open不打开窗口: md-printer 持续重建并写入,直到 Ctrl+C,并且打印的 URL 可以手动打开.
- 预览时会跳过签名 。 运行无
--preview签字.
模板
内建模板
| 名称 | 说明 |
|---|---|
default | 与蒙特塞拉特的Markdown风格。 这是默认. |
kilic.dev | 相同的样式,头部有标志,脚有标题和页码. |
invoice | YAML 数据的发票(company, (中文(简体) ), client, (中文(简体) ), payment, (中文(简体) ), items, (中文(简体) ), currency, (中文(简体) ), date, (中文(简体) ), id和马克德笔记。 翻译 en 财务报告和审定财务报表 de,签名时的签名块。 见 test/invoice.md。 。 。 . |
mail | 无边距的平地内容和Tailwind打字,意为 HTML 输出. |
正在撰写模板
模板是一个目录。 传过来 -t ./path 或者说 template: ./path。没有路径分隔符的值是一个内置名称,任何带有 / 或从 . 或者说 ~ 是一个路径.
my-template/
Template.svelte required
settings.json optional
i18n/ optional, en.yaml, de.json, ...
components/ optional, *.svelte placed from markdown, see Markdown components
Template.svelte 是一个Svelte 5组件,接收这些道具:
| Prop | 说明 |
|---|---|
data | 前题(或YAML文件)为对象. |
content | Markdown正文提供给了HTML,其指令的组成部分已经到位. YAML 输入为空 . |
t | i18next 翻译函数,从 i18n/<language>.(yaml|yml|json)。 。 。 . |
language | 决断语言. |
signature | { date, name?, issuer?, serial? } 在启用签名时, 否则 undefined。 。 。 . |
设定文档标题为 <svelte:head><title>...</title></svelte:head>。 。 。 .
需要 Tailwind CSS v4 或软件包导入到 <style lang="postcss"> 块中 Template.svelte 或进口的任何部件。 这些块是一起收集和编译的,这样它们就可以 @import 'tailwindcss' 和使用情况 @plugin, (中文(简体) ), @theme 和公用事业类。 平面 <style> 块保留范围为斯维尔特样式. @import 软件包(例如 @fontsource/*, (中文(简体) ), github-markdown-css)首先从模板目录中解析,同时也从md-printer自身的依赖性解析,所以模板不需要一个 node_modules。选定的突出显示.js主题总是包含在内。 当地 url() 而图像引用则被内含为数据 URI.
图像是导入的, 将图像内含为数据 URI :
<script>
import logo from './logo.png'
</script>
<img src={logo} alt="logo" />
共享组件
从 @cenk1cenk2/md-printer/components数字 :
| 构成部分 | 说明 |
|---|---|
Page | 布局包装器。 儿童是身体,是 header 财务报告和审定财务报表 footer 片段是每页的打印页头和页脚. |
Markdown | 将马克倒地的身体放入 <article class="markdown-body">,样式由 github-markdown-css 如果模板导入它。 指令作为活性成分. |
PageBreak | 以连续模式在任何地方启动新页面。 在降级时, ::page-break 或者说 ::pagebreak 做同样的. |
PageNumber | 目前页码,由Chrome填充. 仅收页脚. |
TotalPages | 总页数,由克罗姆填充. 仅收页脚. |
Title | 文件标题由Chrome填入. 仅收页脚. |
Date | 印刷日期,由克罗姆填充. 仅收页脚. |
SignatureBlock | 可见签名块 signature 道具 (英语). 需要尾风在一个 <style lang="postcss"> 块。 可选 labels prop 覆盖它的文本. |
<script>
import { Markdown, Page, PageNumber, TotalPages, Title } from '@cenk1cenk2/md-printer/components'
let { data } = $props()
</script>
<svelte:head>
<title>{data.documentTitle ?? 'Document'}</title>
</svelte:head>
<Page>
{#snippet footer()}
<div style="width: 100%; text-align: center; font-size: 8px">
<Title /> - <PageNumber />/<TotalPages />
</div>
{/snippet}
<Markdown />
</Page>
下沉组件
每个 *.svelte 模板中的文件 components/ 目录可以从标记下放置, 参见 构成部分。共享组件可以同样放置,例如 ::page-break 或者说 ::signature-block时,除 Markdown。一个与共享名称相同的模板组件取代了它.
<!-- components/Callout.svelte -->
<script>
import { getContext } from 'svelte'
let { type = 'note', children } = $props()
const { data, t, language, signature } = getContext('md-printer:document')
</script>
<aside class="callout callout-{type}">
<strong>{t(type)}</strong>
{@render children?.()}
</aside>
- 道具是指令的属性,总是字符串,和
children集装箱和内含指令. getContext('md-printer:document')给{ data, t, language, signature },模板的道具, 所以一个组件不需要通过什么.<Markdown />使组件到位。 放置模板{@html content}换成他们的标记,没有范围<style>块,所以用 Tailwind 类或一个<style lang="postcss">块.- 一个组件可以启动新页面
PageBreak或带有page-break课. --preview抓取添加并删除组件文件 .
页眉和页脚
这个 header 财务报告和审定财务报表 footer 片段被制成克罗姆的平面头和脚印,从页面中被隔离出. md-printer将CSS及其图像自动内入,包括远程图像,默认字体大小为10px. Chrome没有为他们预留空间,所以设置 pdfOptions.margin 内 settings.json 或前题大到足以让你做出什么 两者均以连续模式省略.
模板是代码: 当文档被渲染时, Svelte 组件运行在您的机器上. 只使用您信任的模板 .
签名
PDF输出可以通过ID奥地利,使用A-Trust以合格的电子签名签名.
md-printer invoice.yaml -t invoice --sign --sign-certificate ~/id-austria.pem
--sign允许签名 .--sign-provider选择提供者,a-trust是唯一的和默认的.--sign-certificate是您签名证书的 DER 或 PEM 文件 .- 相同的密钥可以设置为
sign前题或settings.json数字 :enabled, (中文(简体) ),provider, (中文(简体) ),certificate, (中文(简体) ),reason, (中文(简体) ),location, (中文(简体) ),contact. 旗帜胜利.reason, (中文(简体) ),location财务报告和审定财务报表contact被存储在签名中. - 只为 PDF 输出签名并被跳过
--preview。 。 。 . - 签名会话必须在您的浏览器中运行 。 md-printer在已发现浏览器的应用窗口中打开临时本地页面,使用您正常的配置文件(或带有
xdg-open当找不到时, 您可以在 A- Trust 页面中登录 ID Austria, 并粘贴所产生的签名( 开始于MII)回到本地页面. 剪短的贴纸在页面上被拒绝,因此可以再复制. 它等待签名到达,按 Ctrl+C 中止. - 返回的签名在嵌入前总是被验证:其文摘必须与此文档相匹配并必须具有加密有效性. 结果被印出签名人名称,序列和发行人. 失败的校验失败运行, 并带有
--log-level debug返回的签名写在输出旁边为<output>.cms.der。 。 。 . - 持有证书后,签名人名称、发行人和序列将传递到模板中作为
signature这样SignatureBlock可以显示谁签了名,什么时候签了名。 证书在签署时必须有效,未与该证书一起制作的回执被拒. 没有证书,只有日期. - 验证结果于 https://www.signaturpruefung.gv.at 互联网档案馆的存檔,存档日期2011-12-21。 。 。 .
从 2.x 移动
- 纳尼亚克人
template.html.j2, (中文(简体) ),header.html, (中文(简体) ),footer.html, (中文(简体) ),main.css财务报告和审定财务报表tailwind.css改为:Template.svelte,带有样式<style lang="postcss">块. - 删除
settings.json和前题 :body_class, (中文(简体) ),css, (中文(简体) ),stylesheet, (中文(简体) ),script, (中文(简体) ),marked_options, (中文(简体) ),launch_options, (中文(简体) ),gray_matter_options。 。 。 .documentTitle内settings.json在模板中设置标题. - 前题 Stdout 已消失, 使用
-O。 。 。 . --title现在胜过前题--template现在胜过前题.- 相对于输入文件目录而不是当前目录的资产解决.
- 连续模式没有页眉和页脚.
puppeteer改为:puppeteer-core,没有捆绑的 Chrome,需要基于Chrome的本地浏览器.--dev改为:--preview,它也重建并重写每个变化的输出;没有单独的--watch。 。 。 .- 默认突出显示主题为
atom-one-dark。 。 。 . - 扩展名未知的文件与以前一样读作减号;
-f仍然强迫一种类型. - 更新通知符和给错误打字命令的D-you-mean建议被删除,md-printer是一个单一的命令.
命令参考
Renders a markdown or yaml file through a Svelte template into a PDF or HTML document.
USAGE
$ md-printer [FILE] [OUTPUT] [--log-level
silent|direct|fatal|error|warn|info|verbose|debug|trace] [-I] [-f
md|yaml|yml] [-F pdf|html] [-O] [-t <value>] [-T <value>] [-l <value>] [-b
<value>] [--continuous] [-p] [--host 127.0.0.1|localhost|::1] [--port
<value>] [--open] [--sign] [--sign-provider a-trust] [--sign-certificate
<value>]
ARGUMENTS
[FILE] Markdown or yaml file to render.
[OUTPUT] Output file. Overwrites the one defined in front-matter.
FLAGS
-F, --output-filetype=<option> Output file type, defaults to pdf. Overwrites
the one defined in front-matter.
<options: pdf|html>
-I, --stdin Read the input from stdin.
-O, --stdout Write the output to stdout instead of a file.
-T, --title=<value> Document title. Overwrites the one defined in
front-matter or the template.
-b, --browser=<value> Browser executable used for printing.
Discovered automatically when omitted (Brave,
Chrome, Chromium, Edge).
-f, --input-filetype=<option> Input file type. Detected from the file
extension, markdown for stdin and unknown
extensions.
<options: md|yaml|yml>
-l, --language=<value> Language for template translations. Overwrites
the one defined in front-matter and template
settings.
-p, --preview Rebuild whenever the input, the template or
its assets change, show the HTML and the PDF
in a live preview and rewrite the output file
when there is one.
-t, --template=<value> Built-in template name or path to a template
directory, defaults to "default". Overwrites
the one defined in front-matter.
--continuous Render the PDF as a single continuous page
without page breaks.
--host=<option> [default: 127.0.0.1] Loopback host for the
preview server, it serves the files next to
the input and is never exposed to the network.
<options: 127.0.0.1|localhost|::1>
--[no-]open Open the preview window, --no-open keeps
rebuilding and writing without one.
--port=<value> Port for the preview server, random when 0.
--sign Sign the PDF with a qualified electronic
signature through ID Austria (A-Trust).
--sign-certificate=<value> Signer certificate (DER or PEM) used for the
visible signature block and to verify the
returned signature.
--sign-provider=<option> Signature provider, defaults to a-trust.
Overwrites the one defined in front-matter and
template settings.
<options: a-trust>
CLI FLAGS
--log-level=<option> [default: INFO, env: LOG_LEVEL] Set the log level of the
application.
<options:
silent|direct|fatal|error|warn|info|verbose|debug|trace>
DESCRIPTION
Renders a markdown or yaml file through a Svelte template into a PDF or HTML
document.