PDF Maker 是一个用 JavaScript 生成 PDF 文档的库。
该项目受到 pdfmake 的启发,并基于 pdf-lib 和 fontkit 构建。如果没有这些项目的作者所贡献的伟大工作和渊博知识,它就不会存在。
makePdf()
函数根据给定的文档定义创建 PDF 数据。这个定义是一个普通的对象。
定义中最重要的属性名为content
。该属性接受块列表。有不同类型的块,例如文本块、图像块、列和行布局块。
const fontData = await readFile ( 'Roboto-Regular.ttf' ) ;
const fontDataItalic = await readFile ( 'Roboto-Italic.ttf' ) ;
const pdfData = await makePdf ( {
// Fonts must be registered (see below)
fonts : {
Roboto : [ { data : fontData } , { data : fontDataItalic , italic : true } ] ,
} ,
// Content as an array of blocks
content : [
// Blocks can contain text and text properties
{ text : 'Lorem ipsum' , fontStyle : 'italic' , textAlign : 'center' , fontSize : 24 } ,
// Text can also be an array of text spans with different properties
{
text : [
'dolor sit amet, consectetur adipiscing elit ' ,
{ text : 'sed do eiusmod' , fontStyle : 'italic' } ,
' tempor, incididunt ut labore et dolore magna aliqua.' ,
] ,
} ,
] ,
} ) ;
await writeFile ( `hello.pdf` , pdfData ) ;
example/ 文件夹中有更多示例。
所有字体都嵌入在 PDF 中,并且必须使用fonts
属性进行注册。接受.ttf
或.otf
格式的字体数据,如 ArrayBuffer 或 Uint8Array。每个字体系列可以包含不同的变体,这些变体是根据bold
和italic
属性选择的。首先注册的字体系列将成为默认字体系列。
const documentDefinition = {
fonts : {
'DejaVu-Sans' : [
// Different font versions for fontFamily "DejaVu-Sans"
// TTF / OTF font data as ArrayBuffer or Uin8Array
{ data : fontDataDejaVuSansNormal } ,
{ data : fontDataDejaVuSansBold , bold : true } ,
{ data : fontDataDejaVuSansItalic , italic : true } ,
{ data : fontDataDejaVuSansBoldItalic , bold : true , italic : true } ,
] ,
Roboto : [
// Different font versions for fontFamily "Roboto"
{ data : fontDataRobotoNormal } ,
{ data : fontDataRobotoMedium , bold : true } ,
] ,
} ,
content : [
{ text : 'lorem ipsum' , fontFamily : 'Roboto' , fontWeight : 'bold' } , // will use Roboto Medium
{ text : 'dolor sit amet' } , // will use DejaVu-Sans (the font registered first), normal
] ,
} ;
支持 JPG 和 PNG 图像。当同一图像多次使用时,图像数据仅在 PDF 中包含一次。可以使用width
和height
属性来限制图像的大小。
// An image block
{ image : 'images/logo.png' , width : 200 , height : 100 } ,
要水平排列块,可以将它们包含在具有columns
属性的块中。当列具有width
属性时,它会受到尊重。剩余空间 ID 均匀分布在所有列上。
{
columns : [
{ text : 'Column 1' , width : 100 } , // 100 pt wide
{ text : 'Column 2' } , // gets half of the remaining width
{ text : 'Column 3' } , // gets half of the remaining width
] ,
}
行布局可用于将多行分组为单个块,例如应用公共属性或将行包围在周围的列布局中。
{
rows : [
{ text : 'Row 1' } ,
{ text : 'Row 2' } ,
{ text : 'Row 3' } ,
] ,
textAlign : 'right' ,
}
每个块都可以有一个graphics
属性,该属性接受要绘制到该块中的形状列表或返回形状列表的函数。该函数将使用块的宽度和高度来调用。这可用于绘制取决于块大小的形状。
形状可以是直线、矩形、圆形或 SVG 路径。在以下示例中,图形属性用于在文本后面绘制黄色背景,并在左边缘绘制蓝色边框。
{
text : 'Lorem ipsum' ,
graphics : ( { width , height } ) => [
{ type : 'rect' , x : 0 , y : 0 , width , height , fillColor : 'yellow' } ,
{ type : 'line' , x1 : 0 , y1 : 0 , x2 : 0 , y2 : height , lineColor : 'blue' , lineWidth : 2 } ,
] ,
padding : { left : 5 } ,
}
另请参阅图形示例。
margin
属性可用于在块周围添加空间。它接受单个值(适用于所有四个边)、具有任何属性top
、 right
、 bottom
、 left
、 x
和y
的对象。属性x
和y
可以用作同时设置left
和right
或top
和bottom
简写。值可以以数字(以 pt 为单位)或带单位的字符串形式给出。如果给定一个字符串,它必须包含单位pt
、 in
、 mm
或cm
之一;
{
margin : { x : 5 , top : 10 } ,
content : [
{ text : 'Lorem ipsum' } ,
{ text : 'dolor sit amet' } ,
] ,
}
相邻块的top
和bottom
边距被折叠成单个边距,其大小为两个边距中的最大值。列边距不会折叠。
padding
属性可用于在内容和块边缘之间添加空间。
顶级pageSize
属性可用于设置页面大小。支持各种标准尺寸,例如A4
、 Letter
和Legal
。默认为 A4。自定义页面大小可以指定为具有width
和height
属性的对象。值可以以数字(以 pt 为单位)或带单位的字符串形式给出。
{
pageSize : { width : '20cm' , height : '20cm' }
}
pageOrientation
属性可用于设置页面方向。该值可以是portrait
或landscape
。默认为纵向。
{
pageSize : 'A5' ,
pageOrientation : 'landscape' ,
content : [
{ text : 'Lorem ipsum' } ,
{ text : 'dolor sit amet' } ,
] ,
}
可以使用可选的header
和footer
属性来定义在每个页面上重复的页眉和页脚。两者都接受单个块或返回块的函数。将使用页码和总页数调用该函数。页码从 1 开始。
{
footer : ( { pageNumber , pageCount } ) => ( {
text : `Page ${ pageNumber } of ${ pageCount } ` ,
textAlign : 'right' ,
margin : { x : '20mm' , bottom : '1cm' } ,
} ) ,
content : [
{ text : 'Lorem ipsum' } ,
{ text : 'dolor sit amet' } ,
] ,
}
自动包含分页符。当当前页面无法容纳某个块时,将向文档添加新页面。要在块之前或之后插入分页符,请将块的breakBefore
或breakAfter
属性设置为always
。要防止分页,请将此属性设置为avoid
。
分页符也会自动插入文本块的行之间。要防止文本块内出现分页符,请将breakInside
属性设置为avoid
。
{
content : [
{ text : 'Lorem ipsum' } ,
{ text : 'This text will go on a new page' , breakBefore : 'always' } ,
] ,
}
虽然尚未生成文档,但您可以参考 api 文件夹以获取文档定义中所有支持的属性的规范。
另请查看示例/文件夹中的示例。
麻省理工学院