1 个不稳定版本

0.3.0 2024年7月22日

#2009 in 文本处理

Download history 122/week @ 2024-07-20 46/week @ 2024-07-27

每月 168 次下载
用于 pdf_composer

MIT/Apache

94KB
910

PDF Composer

使用Rust从Yaml Front Matter文档生成PDF

概述

此包从YAML Front Matter源文档创建PDF文档。YAML值可以用作PDF字典条目或用于替换YAML Front Matter文档Markdown部分的占位符引用。

特性

PDF输出目的地

生成的PDF保存到相对于项目根目录的输出目的地目录。

例如,my_pdf_instance.set_output_directory("output_pdfs")。如果没有设置输出目的地,则PDF将保存到名为pdf_composer_pdfs的目录中。这样可以避免在项目的根目录中到处都是生成的PDF文件。既整洁又方便。

PDF版本

目前仅支持PDF规范的最新两个版本(并鼓励使用),即版本1.72.0

例如,my_pdf_instance.set_pdf_version(PDFVersion::V2_0)。如果没有设置PDF版本,则默认使用版本1.7

注意: 这不是指PDF本身的版本/版本。这是由您自己决定的(也许可以将其设置为YAML值作为PDF字典条目的一部分,以下将提供更多信息)。

要设置版本,请查看显示与版本号对应的枚举值的表格。

枚举 PDF版本
PDFVersion::V1_7 1.7
PDFVersion::V2_0 2.0

纸张大小

支持纸张大小的列表。例如,my_pdf_instance.set_paper_size(PaperSize::A5)。如果未设置纸张大小,默认纸张大小为 A4

ISO 216 A系列纸张大小

尺寸 宽 x 高(毫米) 宽 x 高(英寸)
A0 841mm x 1189mm 33.1" x 46.8"
A1 594mm x 841mm 23.4" x 33.1"
A2 420mm x 594mm 16.5" x 23.4"
A3 297mm x 420mm 11.7" x 16.5"
A4 210mm x 297mm 8.3" x 11.7"
A5 148mm x 210mm 5.8" x 8.3"
A6 105mm x 148mm 4.1" x 5.8"
A7 74mm x 105mm 2.9" x 4.1"
A8 52mm x 74mm 2.0" x 2.9"
A9 37mm x 52mm 1.5" x 2.0"
A10 26mm x 37mm 1.0" x 1.5"

ISO 216 B系列纸张大小

尺寸 宽 x 高(毫米) 宽 x 高(英寸)
B0 1000mm x 1414mm 39.4" x 55.7"
B1 707mm x 1000mm 27.8" x 39.4"
B2 500mm x 707mm 19.7" x 27.8"
B3 353mm x 500mm 13.9" x 19.7"
B4 250mm x 353mm 9.8" x 13.9"
B5 176mm x 250mm 6.9" x 9.8"
B6 125mm x 176mm 4.9" x 6.9"
B7 88mm x 125mm 3.5" x 4.9"
B8 62mm x 88mm 2.4" x 3.5"
B9 44mm x 62mm 1.7" x 2.4"
B10 31mm x 44mm 1.2" x 1.7"

美国纸张大小

尺寸 宽 x 高(毫米) 宽 x 高(英寸)
半信封 140mm x 216mm 5.5" x 8.5"
信封 216mm x 279mm 8.5" x 11"
法定 216mm x 356mm 8.5" x 14"
小法定 203mm x 127mm 8" x 5"
账簿 432mm x 279mm 17" x 11"
小报 279mm x 432mm 11" x 17"

JIS纸张大小

尺寸 宽 x 高(毫米) 宽 x 高(英寸)
B0 1030 x 1456 mm 40.6 x 57.3 in
B1 728 x 1030 mm 28.7 x 40.6 in
B2 515 x 728 mm 20.3 x 28.7 in
B3 364 x 515 mm 14.3 x 20.3 in
B4 257 x 364 mm 10.1 x 14.3 in
B5 182 x 257 mm 7.2 x 10.1 in
B6 128 x 182 mm 5.0 x 7.2 in
B7 91 x 128 mm 3.6 x 5.0 in
B8 64 x 91 mm 2.5 x 3.6 in
B9 45 x 64 mm 1.8 x 2.5 in
B10 32 x 45 mm 1.3 x 1.8 in

纸张方向

这允许将PDF文档页面保存为横向或纵向方向。例如,my_pdf_instance.set_orientation(PaperOrientation::Landscape)。如果没有设置方向,默认为 Portrait

页面边距

边距使用的单位是毫米(mm)。如果没有设置边距,默认边距大小为 10

使用CSS缩写符号设置页面边距(上 右 下 左)。这意味着

设置一个值,四个边距都将获得该值。例如,my_pdf_instance.set_margins("20") 将导致以下结果

  • margin-top: 20,
  • margin-right: 20,
  • margin-bottom: 20,
  • margin-left: 20

设置两个值,则顶部和底部边距将获取第一个值,右侧和左侧边距将获取第二个值。例如,my_pdf_instance.set_margins("20 15") 将导致以下结果

  • margin-top: 20,
  • margin-right: 15,
  • margin-bottom: 20,
  • margin-left: 15

设置三个值,则顶部边距将获取第一个值,右侧和左侧边距将获取第二个值,底部边距将获取第三个值。例如,my_pdf_instance.set_margins("20 15 30") 将导致以下结果

  • margin-top: 20,
  • margin-right: 15,
  • margin-bottom: 30,
  • margin-left: 15

设置四个值,则顶部边距将获取第一个值,右侧边距将获取第二个值,底部边距将获取第三个值,左侧边距将获取第四个值。例如,my_pdf_instance.set_margins("20 15 30 5") 将导致以下结果

  • margin-top: 20,
  • margin-right: 15,
  • margin-bottom: 30,
  • margin-left: 5

如果设置了其他值(或非整数、字母、字符等),则每个边距将使用默认值 10

页面字体

可以用于PDF文档的14种标准字体之一。这些是

枚举 字体名称 字体粗细 字体样式
Courier Courier 正常 正常
CourierBold Courier 粗体 正常
CourierBoldOblique Courier 粗体 斜体
CourierOblique Courier 正常 斜体
Helvetica Helvetica 正常 正常
HelveticaBold Helvetica 粗体 正常
HelveticaBoldOblique Helvetica 粗体 斜体
HelveticaOblique Helvetica 正常 斜体
Symbol Symbol 正常 正常
TimesBold Times 粗体 正常
TimesBoldItalic Times 粗体 斜体
TimesItalic Times 正常 斜体
TimesRoman Times 正常 正常
ZapfDingbats Zapf Dingbats 正常 正常

例如,my_pdf_instance.set_font(FontsStandard::TimesRoman)。如果没有设置字体,默认字体为 Helvetica

PDF字典条目

PDF字典条目是您在PDF文档中选择“文档属性”时可以看到的名称和值对。字典条目区分大小写,有一些保留名称。

保留字典条目

  • 标题
  • 作者
  • 主题
  • 关键词

这些 必须 大写。 PDF Composer 自动将保留的名称大写。所有其他名称将保持不变。

PDF Composer 中,标题条目是一个特殊情况。作为PDF生成过程的一部分,YAML文档中的 title 值将自动插入到用于HTML模板的 <title> 标签中。因此,字典条目将被填充。如果没有找到YAML值,则使用源文件的文件名代替。

不允许空条目。如果没有找到相应的YAML条目,则不会将空条目添加到PDF文档中。

例如,如果您想设置一个名为 Language 的字典条目,并将其设置为一个在 YAML 文档中不存在的 YAML 条目,PDF Composer 将不会创建一个空条目。

设置字典条目的示例

PDFDocInfoEntry {
    doc_info_entry: "Subject",
    yaml_entry: "description",
}

doc_info_entry 是 PDF 字典条目。

yaml_entry 是将分配给字典条目的 YAML 值。

YAML Markdown 占位符替换

在 YAML 文档的 markdown 部分中可以进行简单的替换。这可以通过在 markdown 部分中使用 {{my_yaml_value}} 来实现。

示例

---

# Front Matter (YAML)

author: "Richard"

---

The author of this document is {{author}}.

结果将是: 这份文档的作者是 Richard

如果 YAML 值找不到,则替换占位符将保留在生成的输出中。

示例

---

# Front Matter (YAML)

author: "Richard"

---

The author of this document is {{name}}.

结果将是: 这份文档的作者是 {{name}}

示例用法

假设您已经安装并运行了 Rust(使用 rust 版本 1.77+ 进行测试)并且您已经运行 cargo add pdf_composer 来安装 PDF Composer 包,那么您就可以开始了。

use pdf_composer::{FontsStandard, PaperOrientation, PaperSize, PDFComposer, PDFDocInfoEntry, PDFVersion};

// Create a new PDFComposer instance
let mut my_pdf_instance = PDFComposer::new();

// Add some paths. Relative paths
let paths = vec![
    PathBuf::from("source_mds/file_01.md"),
    PathBuf::from("source_mds/file_02.md")
];
my_pdf_instance.add_source_files(paths);

// PDF version (not the version of the document, but the Adobe (formerly) PDF format version)
my_pdf_instance.set_pdf_version(PDFVersion::V2_0);

// Output directory for the generated PDFs
my_pdf_instance.set_output_directory("example_pdfs");

// Set the paper size
my_pdf_instance.set_paper_size(PaperSize::A5);

// Set the paper orientation
my_pdf_instance.set_orientation(PaperOrientation::Landscape);

// Set the page margins
my_pdf_instance.set_margins("20");

// Set font
my_pdf_instance.set_font(FontsStandard::TimesRoman);

// Metadata for the PDFs
let author_entry = PDFDocInfoEntry {
    doc_info_entry: "Author",
    yaml_entry: "author",
};
let keywords_entry = PDFDocInfoEntry {
    doc_info_entry: "Keywords",
    yaml_entry: "keywords",
};
let subject_entry = PDFDocInfoEntry {
    doc_info_entry: "Subject",
    yaml_entry: "description",
};
let language_entry = PDFDocInfoEntry {
    doc_info_entry: "Language",
    yaml_entry: "language",
};
my_pdf_instance.set_doc_info_entry(author_entry);
my_pdf_instance.set_doc_info_entry(keywords_entry);
my_pdf_instance.set_doc_info_entry(subject_entry);
my_pdf_instance.set_doc_info_entry(language_entry);

// Generate the PDF(s)
my_pdf_instance.generate_pdfs();

许可证

该项目受 MIT 许可证和 Apache 许可证(版本 2.0)条款的约束。

未来计划

一些想法,但不限于

  • HTML 模板
  • 漂亮的默认打印样式表
  • 允许直接使用字符串值作为 PDF 字典条目,而无需首先有 YAML 值
  • 将多个 YAML Front Matter 文档合并为一个生成的 PDF 文档
  • 分页和页码

依赖关系

~32–50MB
~768K SLoC