博客
简体中文

HTML 转 PDF — 粘贴代码在线保存为 PDF

按你选择的纸张和页边距,把 HTML 代码转成 PDF

在浏览器中处理 · 不上传任何内容

粘贴片段(<div>…)或完整文档(<html>…)。完整文档只使用 <body> 里的内容和 <style> 块。

需要额外添加的样式。@media print 打印规则也会生效。

纸张
方向
页边距

出于安全和隐私考虑,不是 data: 或 blob: 地址的图片、字体和 CSS 一律不会请求,脚本也不会运行。不提供输入网址转换网页的功能。

预览(可打印宽度)

输入 HTML 后会显示预览。

在打印窗口的“目标打印机”中选择“另存为 PDF”。生成的 PDF 保留真实文字,可以搜索和复制;分页由浏览器决定。

把预览按页面高度切成图片保存。不经过打印窗口直接下载,但文字无法搜索或复制,分页也可能落在一行文字中间。

这个工具能做什么

报价单、收据、邮件模板常常是 HTML。把 HTML 和 CSS 粘贴到这里,就能按所选纸张的可打印宽度预览,并用两种方式保存为 PDF:通过打印窗口生成文字 PDF,或直接下载图片 PDF。代码只留在这个页面里,不会发送到服务器。

使用方法

  1. 粘贴 HTML。如果是完整文档(<html>…),只使用 <body> 里的内容和 <style> 块。需要的话在第二个框里添加 CSS。
  2. 选择纸张(A4、Letter、A3)、方向和页边距,以及是否打印背景。
  3. 确认预览后点击 在打印窗口中另存为 PDF,在目标打印机中选择“另存为 PDF”。
  4. 或者点击 直接下载图片 PDF,得到由页面图片组成的 PDF。

处理方式

  • 清理:用 DOMParser(惰性文档)和浏览器的 CSS 解析器解析代码,删除所有不是 data: 或 blob: 的地址(图片、@import、url()、srcset),以及 script、iframe、object、link 元素和 on* 属性。被删除的地址会列出来。
  • 预览框架:没有脚本权限的沙盒 iframe,并设置了阻止请求和脚本的 Content-Security-Policy。
  • 字体:使用设备上已安装的字体(系统界面字体,找不到时由浏览器自动替换),所以简体中文等各种文字都按浏览器里的样子输出。
  • 纸张:A4 210×297 mm、A3 297×420 mm(ISO 216),Letter 8.5×11 英寸;打印模式用 CSS @page 设定尺寸和页边距。
  • 图片 PDF:内容按可打印宽度排版(A4、15 mm 页边距时为 680 px),逐页以 2 倍分辨率截取并存为 JPEG,最多 50 页,使用 html-to-image(MIT)和 pdf-lib(MIT)。
  • 长度限制:HTML 和 CSS 合计最多 500,000 个字符。

示例

目标 操作
可搜索文字的报价单 PDF 填入示例 → A4、普通页边距 → 打印窗口 → 另存为 PDF
在手机上马上拿到文件 直接下载图片 PDF
很宽的表格 横向、窄页边距

要把 HTML 保存为 PNG 图片,请用 HTML 转图片的工具;想先在屏幕上预览 Markdown,可以用 Markdown 在线预览。

常见问题

可以输入网址转换网页吗?

不可以,只转换粘贴进来的 HTML。替你抓取别的网站,等于从你的设备向那个网站发请求,还可能带上你的登录状态。想保存网页,请直接打开它,用浏览器的“打印 → 另存为 PDF”。

两个按钮有什么区别?

“在打印窗口中另存为 PDF”使用浏览器自带的打印功能,文字可以搜索,分页也落在行与行之间。“直接下载图片 PDF”不经过打印窗口,但每页都存成图片,文字无法选中,分页也可能切在一行中间。

为什么图片或网页字体没有显示?

出于安全和隐私考虑,不是 data: 或 blob: 地址的图片、字体和样式表一律不会请求。图片请用 Base64 的 data: 地址嵌入;文字使用设备上已安装的字体。

中文能正常显示吗?

能。预览和 PDF 都由浏览器绘制,使用设备上已安装的字体,所以中文、日文、阿拉伯文等只要在浏览器里能正常显示,PDF 里也一样。

脚本会怎么处理?

script 元素和 onclick 之类的事件属性会被删除,预览框架还设置了禁止脚本的策略,粘贴的代码里没有任何东西会运行。

可以控制分页吗?

在打印模式下,`break-before: page` 之类的 CSS 会生效,CSS 框里的 `@media print` 规则只在打印时应用。

没找到想要的工具?