1 个不稳定版本

0.3.0 2024年7月22日

#732文本处理

Download history 137/week @ 2024-07-21 17/week @ 2024-07-28

154 每月下载量
2 个库中使用了

MIT/Apache

30KB
361

PDF Composer

使用Yaml Front Matter文档生成PDF的Rust库

概述

此库可以从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}}.

结果将是: The author of this document is Richard.

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

示例

---

# Front Matter (YAML)

author: "Richard"

---

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

结果将是: The author of this document is {{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 前置文档合并为一个生成的 PDF 文档
  • 分页和页码

无运行时依赖