├── test ├── .gitignore ├── pdfs │ ├── cell │ │ ├── xy.pdf │ │ ├── border.pdf │ │ ├── nested.pdf │ │ ├── simple.pdf │ │ ├── border-left.pdf │ │ ├── border-top.pdf │ │ ├── min-height.pdf │ │ ├── border-bottom.pdf │ │ ├── border-mixed.pdf │ │ ├── border-right.pdf │ │ ├── break-multiple.pdf │ │ ├── break-nested.pdf │ │ ├── break-single.pdf │ │ ├── retrospective.pdf │ │ ├── border-break-long.pdf │ │ ├── border-break-single.pdf │ │ ├── retrospective-long.pdf │ │ ├── border-retrospective.pdf │ │ ├── simple.js │ │ ├── break-single.js │ │ ├── border-break-single.js │ │ ├── break-multiple.js │ │ ├── xy.js │ │ ├── border-break-long.js │ │ ├── retrospective.js │ │ ├── border.js │ │ ├── nested.js │ │ ├── retrospective-long.js │ │ ├── border-top.js │ │ ├── break-nested.js │ │ ├── border-left.js │ │ ├── border-right.js │ │ ├── border-bottom.js │ │ ├── border-mixed.js │ │ ├── border-retrospective.js │ │ └── min-height.js │ ├── image │ │ ├── pdf.pdf │ │ ├── jpeg.pdf │ │ ├── nowrap.pdf │ │ ├── pagebreak.pdf │ │ ├── pdf-complex.pdf │ │ ├── pdf-complex.js │ │ ├── pagebreak.js │ │ ├── nowrap.js │ │ ├── pdf.js │ │ └── jpeg.js │ ├── parser │ │ ├── word.pdf │ │ ├── google.pdf │ │ ├── itext2.pdf │ │ ├── itext5.pdf │ │ ├── itext7.pdf │ │ ├── objstream.pdf │ │ ├── photoshop.pdf │ │ ├── illustrator.pdf │ │ ├── pixelmator.pdf │ │ ├── fixtures │ │ │ ├── word.pdf │ │ │ ├── google.pdf │ │ │ ├── itext2.pdf │ │ │ ├── itext5.pdf │ │ │ ├── itext7.pdf │ │ │ ├── objstream.pdf │ │ │ ├── photoshop.pdf │ │ │ ├── pixelmator.pdf │ │ │ ├── illustrator.pdf │ │ │ ├── indesign-print.pdf │ │ │ ├── ms-print-to-pdf.pdf │ │ │ └── indesign-interactive.pdf │ │ ├── indesign-print.pdf │ │ ├── ms-print-to-pdf.pdf │ │ ├── indesign-interactive.pdf │ │ ├── objstream.js │ │ ├── google.js │ │ ├── illustrator.js │ │ ├── ms-print-to-pdf.js │ │ ├── itext2.js │ │ ├── itext5.js │ │ ├── itext7.js │ │ ├── word.js │ │ ├── photoshop.js │ │ ├── pixelmator.js │ │ ├── indesign-print.js │ │ └── indesign-interactive.js │ ├── text │ │ ├── append.pdf │ │ ├── simple.pdf │ │ ├── kerning.pdf │ │ ├── pagebreak.pdf │ │ ├── styling.pdf │ │ ├── underline.pdf │ │ ├── winansi.pdf │ │ ├── wordbreak.pdf │ │ ├── alignment-afm.pdf │ │ ├── alignment-otf.pdf │ │ ├── append-style.pdf │ │ ├── simple.js │ │ ├── strikethrough.pdf │ │ ├── winansi.js │ │ ├── pagebreak.js │ │ ├── wordbreak.js │ │ ├── append.js │ │ ├── alignment-afm.js │ │ ├── append-style.js │ │ ├── styling.js │ │ ├── alignment-otf.js │ │ ├── kerning.js │ │ ├── underline.js │ │ └── strikethrough.js │ ├── external │ │ ├── self.pdf │ │ ├── firstpage.pdf │ │ ├── otherpage.pdf │ │ ├── pagesize.pdf │ │ ├── template.pdf │ │ ├── addallpages.pdf │ │ ├── addinbetween.pdf │ │ ├── fixtures │ │ │ └── 200x200.pdf │ │ ├── collision-prevention.pdf │ │ ├── templatefirstpageonly.pdf │ │ ├── addallpages.js │ │ ├── firstpage.js │ │ ├── otherpage.js │ │ ├── template.js │ │ ├── addinbetween.js │ │ ├── collision-prevention.js │ │ ├── self.js │ │ ├── pagesize.js │ │ └── templatefirstpageonly.js │ ├── issue │ │ ├── issue-41.pdf │ │ ├── issue-6.pdf │ │ ├── issue-68.pdf │ │ ├── issue-81.pdf │ │ ├── issue-112.pdf │ │ ├── issue-133.pdf │ │ ├── issue-159-br.pdf │ │ ├── fixtures │ │ │ ├── issue-117.pdf │ │ │ ├── issue-260.pdf │ │ │ └── msoffice-toc.pdf │ │ ├── issue-113-even-pages.pdf │ │ ├── issue-191-row-breaks.pdf │ │ ├── issue-260-empty-name.pdf │ │ ├── issue-117-nested-pages.pdf │ │ ├── issue-202-page-vs-table-header.pdf │ │ ├── issue-41.js │ │ ├── issue-150-nested-pages-in-templates.pdf │ │ ├── issue-175-cell-text-opts-inheritance.pdf │ │ ├── issue-81.js │ │ ├── issue-202-page-vs-table-header.js │ │ ├── issue-133.js │ │ ├── issue-68.js │ │ ├── issue-260-empty-name.js │ │ ├── issue-6.js │ │ ├── issue-112.js │ │ ├── issue-150-nested-pages-in-templates.js │ │ ├── issue-117-nested-pages.js │ │ ├── issue-175-cell-text-opts-inheritance.js │ │ ├── issue-113-even-pages.js │ │ ├── issue-191-row-breaks.js │ │ └── issue-159-br.js │ ├── ops │ │ ├── absolute.pdf │ │ ├── relative.pdf │ │ ├── absolute.js │ │ └── relative.js │ ├── table │ │ ├── border.pdf │ │ ├── colspan.pdf │ │ ├── header.pdf │ │ ├── header2.pdf │ │ ├── header3.pdf │ │ ├── header4.pdf │ │ ├── header5.pdf │ │ ├── simple.pdf │ │ ├── min-height.pdf │ │ ├── pagebreak1.pdf │ │ ├── pagebreak2.pdf │ │ ├── pagebreak3.pdf │ │ ├── pagebreak4.pdf │ │ ├── pagebreak5.pdf │ │ ├── pagebreak6.pdf │ │ ├── pagebreak7.pdf │ │ ├── pagebreak8.pdf │ │ ├── border-color.pdf │ │ ├── break-nested.pdf │ │ ├── header-border.pdf │ │ ├── header-only.pdf │ │ ├── missing-cells.pdf │ │ ├── retrospective.pdf │ │ ├── border-colorful.pdf │ │ ├── border-vertical.pdf │ │ ├── border-break-long.pdf │ │ ├── border-horizontal.pdf │ │ ├── border-horizontal2.pdf │ │ ├── break-empty-cells.pdf │ │ ├── break-pagefooter.pdf │ │ ├── break-pageheader.pdf │ │ ├── header-pagebreak.pdf │ │ ├── border-break-single.pdf │ │ ├── border-retrospective.pdf │ │ ├── retrospective-uneven.pdf │ │ ├── large-rows-with-headers.pdf │ │ ├── multiple-headers-only.pdf │ │ ├── simple-multiple-headers.pdf │ │ ├── retrospective-pagefooter.pdf │ │ ├── header-only.js │ │ ├── border.js │ │ ├── border-horizontal2.js │ │ ├── pagebreak5.js │ │ ├── border-color.js │ │ ├── missing-cells.js │ │ ├── pagebreak6.js │ │ ├── pagebreak7.js │ │ ├── pagebreak4.js │ │ ├── pagebreak3.js │ │ ├── pagebreak8.js │ │ ├── border-break-long.js │ │ ├── break-empty-cells.js │ │ ├── pagebreak2.js │ │ ├── border-break-single.js │ │ ├── simple.js │ │ ├── header2.js │ │ ├── retrospective-uneven.js │ │ ├── break-nested.js │ │ ├── pagebreak1.js │ │ ├── header-pagebreak.js │ │ ├── retrospective.js │ │ ├── border-retrospective.js │ │ ├── border-horizontal.js │ │ ├── header3.js │ │ ├── header4.js │ │ ├── header5.js │ │ ├── break-pageheader.js │ │ ├── simple-multiple-headers.js │ │ ├── border-vertical.js │ │ ├── break-pagefooter.js │ │ ├── retrospective-pagefooter.js │ │ ├── min-height.js │ │ ├── header.js │ │ ├── border-colorful.js │ │ ├── header-border.js │ │ ├── multiple-headers-only.js │ │ ├── large-rows-with-headers.js │ │ └── colspan.js │ ├── doc │ │ ├── padding-zero.pdf │ │ └── padding-zero.js │ ├── headerfooter │ │ ├── both.pdf │ │ ├── footer.pdf │ │ ├── header.pdf │ │ ├── pagecount.pdf │ │ ├── pagenumber.pdf │ │ ├── footer-change.pdf │ │ ├── header-change.pdf │ │ ├── header-change.js │ │ ├── footer-change.js │ │ ├── footer.js │ │ ├── header.js │ │ ├── pagenumber.js │ │ ├── pagecount.js │ │ └── both.js │ ├── outlines │ │ ├── outlines.pdf │ │ └── outlines.js │ └── annotations │ │ ├── img-goto.pdf │ │ ├── img-link.pdf │ │ ├── text-link.pdf │ │ ├── doc-destination.pdf │ │ ├── img-destination.pdf │ │ ├── text-destination.pdf │ │ ├── img-link.js │ │ ├── text-link.js │ │ ├── doc-destination.js │ │ ├── img-goto.js │ │ ├── img-destination.js │ │ └── text-destination.js ├── others │ ├── asBuffer.pdf │ ├── multiple-table-headers.js │ └── asBuffer.js ├── fixtures │ ├── image │ │ ├── pdfjs.jpg │ │ ├── pdfjs.pdf │ │ └── complex.pdf │ ├── document │ │ ├── test.pdf │ │ └── pdfjs-created.pdf │ ├── font │ │ └── opensans │ │ │ ├── bold.ttf │ │ │ └── regular.ttf │ └── index.js ├── README.md └── index.js ├── .gitattributes ├── lib ├── errors │ └── already-ended.js ├── object │ ├── number.js │ ├── null.js │ ├── boolean.js │ ├── index.js │ ├── value.js │ ├── array.js │ ├── trailer.js │ ├── nametree.js │ ├── stream.js │ ├── dictionary.js │ ├── name.js │ ├── object.js │ └── reference.js ├── index.js ├── content.js ├── image │ ├── image.js │ ├── pdf.js │ ├── jpeg.js │ └── render.js ├── font │ ├── base.js │ ├── subset.js │ └── afm.js ├── footer.js ├── cursor.js ├── tableheader.js ├── util.js ├── ops.js └── parser │ └── parser.js ├── .npmignore ├── font ├── Courier.js ├── Symbol.js ├── Helvetica.js ├── Times-Bold.js ├── Courier-Bold.js ├── Times-Italic.js ├── Times-Roman.js ├── ZapfDingbats.js ├── Courier-Oblique.js ├── Helvetica-Bold.js ├── Helvetica-Oblique.js ├── Times-BoldItalic.js ├── Courier-BoldOblique.js ├── Helvetica-BoldOblique.js ├── afm │ ├── MustRead.html │ ├── winansi_characters.txt │ └── convert.js ├── Courier.json ├── Courier-Bold.json ├── Courier-Oblique.json ├── Courier-BoldOblique.json ├── Symbol.json └── ZapfDingbats.json ├── .gitignore ├── .github └── workflows │ └── ci.yml ├── docs ├── text.md ├── table.md ├── row.md └── header.md ├── types └── tsconfig.json ├── README.md ├── LICENSE ├── package.json └── logo.svg /test/.gitignore: -------------------------------------------------------------------------------- 1 | *.result.pdf 2 | preflight* -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pdf binary 2 | *.pdf diff 3 | -------------------------------------------------------------------------------- /lib/errors/already-ended.js: -------------------------------------------------------------------------------- 1 | module.exports = class AlreadyEndedError extends Error {}; 2 | -------------------------------------------------------------------------------- /test/pdfs/cell/xy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/xy.pdf -------------------------------------------------------------------------------- /test/pdfs/image/pdf.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/image/pdf.pdf -------------------------------------------------------------------------------- /test/others/asBuffer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/others/asBuffer.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/border.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/nested.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/nested.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/simple.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/simple.pdf -------------------------------------------------------------------------------- /test/pdfs/image/jpeg.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/image/jpeg.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/word.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/word.pdf -------------------------------------------------------------------------------- /test/pdfs/text/append.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/append.pdf -------------------------------------------------------------------------------- /test/pdfs/text/simple.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/simple.pdf -------------------------------------------------------------------------------- /test/pdfs/external/self.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/self.pdf -------------------------------------------------------------------------------- /test/pdfs/image/nowrap.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/image/nowrap.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-41.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-41.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-6.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-68.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-68.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-81.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-81.pdf -------------------------------------------------------------------------------- /test/pdfs/ops/absolute.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/ops/absolute.pdf -------------------------------------------------------------------------------- /test/pdfs/ops/relative.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/ops/relative.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/google.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/google.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/itext2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/itext2.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/itext5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/itext5.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/itext7.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/itext7.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border.pdf -------------------------------------------------------------------------------- /test/pdfs/table/colspan.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/colspan.pdf -------------------------------------------------------------------------------- /test/pdfs/table/header.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/header.pdf -------------------------------------------------------------------------------- /test/pdfs/table/header2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/header2.pdf -------------------------------------------------------------------------------- /test/pdfs/table/header3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/header3.pdf -------------------------------------------------------------------------------- /test/pdfs/table/header4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/header4.pdf -------------------------------------------------------------------------------- /test/pdfs/table/header5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/header5.pdf -------------------------------------------------------------------------------- /test/pdfs/table/simple.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/simple.pdf -------------------------------------------------------------------------------- /test/pdfs/text/kerning.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/kerning.pdf -------------------------------------------------------------------------------- /test/pdfs/text/pagebreak.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/pagebreak.pdf -------------------------------------------------------------------------------- /test/pdfs/text/styling.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/styling.pdf -------------------------------------------------------------------------------- /test/pdfs/text/underline.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/underline.pdf -------------------------------------------------------------------------------- /test/pdfs/text/winansi.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/winansi.pdf -------------------------------------------------------------------------------- /test/pdfs/text/wordbreak.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/wordbreak.pdf -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | docs 2 | font/afm 3 | test 4 | logo.svg 5 | .* 6 | yarn.lock 7 | test.* 8 | /*.pdf 9 | playground -------------------------------------------------------------------------------- /test/fixtures/image/pdfjs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/fixtures/image/pdfjs.jpg -------------------------------------------------------------------------------- /test/fixtures/image/pdfjs.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/fixtures/image/pdfjs.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/border-left.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border-left.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/border-top.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border-top.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/min-height.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/min-height.pdf -------------------------------------------------------------------------------- /test/pdfs/doc/padding-zero.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/doc/padding-zero.pdf -------------------------------------------------------------------------------- /test/pdfs/image/pagebreak.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/image/pagebreak.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-112.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-112.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-133.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-133.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/objstream.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/objstream.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/photoshop.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/photoshop.pdf -------------------------------------------------------------------------------- /test/pdfs/table/min-height.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/min-height.pdf -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/pagebreak1.pdf -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/pagebreak2.pdf -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/pagebreak3.pdf -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/pagebreak4.pdf -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/pagebreak5.pdf -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/pagebreak6.pdf -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak7.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/pagebreak7.pdf -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak8.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/pagebreak8.pdf -------------------------------------------------------------------------------- /test/fixtures/document/test.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/fixtures/document/test.pdf -------------------------------------------------------------------------------- /test/fixtures/image/complex.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/fixtures/image/complex.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/border-bottom.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border-bottom.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/border-mixed.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border-mixed.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/border-right.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border-right.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/break-multiple.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/break-multiple.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/break-nested.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/break-nested.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/break-single.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/break-single.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/retrospective.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/retrospective.pdf -------------------------------------------------------------------------------- /test/pdfs/external/firstpage.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/firstpage.pdf -------------------------------------------------------------------------------- /test/pdfs/external/otherpage.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/otherpage.pdf -------------------------------------------------------------------------------- /test/pdfs/external/pagesize.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/pagesize.pdf -------------------------------------------------------------------------------- /test/pdfs/external/template.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/template.pdf -------------------------------------------------------------------------------- /test/pdfs/headerfooter/both.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/headerfooter/both.pdf -------------------------------------------------------------------------------- /test/pdfs/headerfooter/footer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/headerfooter/footer.pdf -------------------------------------------------------------------------------- /test/pdfs/headerfooter/header.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/headerfooter/header.pdf -------------------------------------------------------------------------------- /test/pdfs/image/pdf-complex.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/image/pdf-complex.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-159-br.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-159-br.pdf -------------------------------------------------------------------------------- /test/pdfs/outlines/outlines.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/outlines/outlines.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/illustrator.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/illustrator.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/pixelmator.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/pixelmator.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border-color.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border-color.pdf -------------------------------------------------------------------------------- /test/pdfs/table/break-nested.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/break-nested.pdf -------------------------------------------------------------------------------- /test/pdfs/table/header-border.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/header-border.pdf -------------------------------------------------------------------------------- /test/pdfs/table/header-only.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/header-only.pdf -------------------------------------------------------------------------------- /test/pdfs/table/missing-cells.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/missing-cells.pdf -------------------------------------------------------------------------------- /test/pdfs/table/retrospective.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/retrospective.pdf -------------------------------------------------------------------------------- /test/pdfs/text/alignment-afm.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/alignment-afm.pdf -------------------------------------------------------------------------------- /test/pdfs/text/alignment-otf.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/alignment-otf.pdf -------------------------------------------------------------------------------- /test/pdfs/text/append-style.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/append-style.pdf -------------------------------------------------------------------------------- /test/pdfs/text/simple.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc.text("Hello World"); 3 | }; 4 | -------------------------------------------------------------------------------- /test/pdfs/text/strikethrough.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/text/strikethrough.pdf -------------------------------------------------------------------------------- /test/pdfs/text/winansi.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc.text("Hællo, 1000€"); 3 | }; 4 | -------------------------------------------------------------------------------- /font/Courier.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Courier.json')) -------------------------------------------------------------------------------- /font/Symbol.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Symbol.json')) -------------------------------------------------------------------------------- /test/pdfs/annotations/img-goto.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/annotations/img-goto.pdf -------------------------------------------------------------------------------- /test/pdfs/annotations/img-link.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/annotations/img-link.pdf -------------------------------------------------------------------------------- /test/pdfs/annotations/text-link.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/annotations/text-link.pdf -------------------------------------------------------------------------------- /test/pdfs/external/addallpages.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/addallpages.pdf -------------------------------------------------------------------------------- /test/pdfs/external/addinbetween.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/addinbetween.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/word.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/word.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/indesign-print.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/indesign-print.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border-colorful.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border-colorful.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border-vertical.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border-vertical.pdf -------------------------------------------------------------------------------- /font/Helvetica.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Helvetica.json')) -------------------------------------------------------------------------------- /font/Times-Bold.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Times-Bold.json')) -------------------------------------------------------------------------------- /test/fixtures/font/opensans/bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/fixtures/font/opensans/bold.ttf -------------------------------------------------------------------------------- /test/pdfs/cell/border-break-long.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border-break-long.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/border-break-single.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border-break-single.pdf -------------------------------------------------------------------------------- /test/pdfs/cell/retrospective-long.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/retrospective-long.pdf -------------------------------------------------------------------------------- /test/pdfs/headerfooter/pagecount.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/headerfooter/pagecount.pdf -------------------------------------------------------------------------------- /test/pdfs/headerfooter/pagenumber.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/headerfooter/pagenumber.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/fixtures/issue-117.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/fixtures/issue-117.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/fixtures/issue-260.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/fixtures/issue-260.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/google.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/google.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/itext2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/itext2.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/itext5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/itext5.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/itext7.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/itext7.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/ms-print-to-pdf.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/ms-print-to-pdf.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border-break-long.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border-break-long.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border-horizontal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border-horizontal.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border-horizontal2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border-horizontal2.pdf -------------------------------------------------------------------------------- /test/pdfs/table/break-empty-cells.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/break-empty-cells.pdf -------------------------------------------------------------------------------- /test/pdfs/table/break-pagefooter.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/break-pagefooter.pdf -------------------------------------------------------------------------------- /test/pdfs/table/break-pageheader.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/break-pageheader.pdf -------------------------------------------------------------------------------- /test/pdfs/table/header-pagebreak.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/header-pagebreak.pdf -------------------------------------------------------------------------------- /font/Courier-Bold.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Courier-Bold.json')) -------------------------------------------------------------------------------- /font/Times-Italic.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Times-Italic.json')) -------------------------------------------------------------------------------- /font/Times-Roman.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Times-Roman.json')) -------------------------------------------------------------------------------- /font/ZapfDingbats.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./ZapfDingbats.json')) -------------------------------------------------------------------------------- /test/fixtures/document/pdfjs-created.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/fixtures/document/pdfjs-created.pdf -------------------------------------------------------------------------------- /test/fixtures/font/opensans/regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/fixtures/font/opensans/regular.ttf -------------------------------------------------------------------------------- /test/pdfs/cell/border-retrospective.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/cell/border-retrospective.pdf -------------------------------------------------------------------------------- /test/pdfs/external/fixtures/200x200.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/fixtures/200x200.pdf -------------------------------------------------------------------------------- /test/pdfs/headerfooter/footer-change.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/headerfooter/footer-change.pdf -------------------------------------------------------------------------------- /test/pdfs/headerfooter/header-change.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/headerfooter/header-change.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-113-even-pages.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-113-even-pages.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-191-row-breaks.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-191-row-breaks.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-260-empty-name.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-260-empty-name.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/objstream.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/objstream.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/photoshop.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/photoshop.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/pixelmator.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/pixelmator.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border-break-single.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border-break-single.pdf -------------------------------------------------------------------------------- /test/pdfs/table/border-retrospective.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/border-retrospective.pdf -------------------------------------------------------------------------------- /test/pdfs/table/retrospective-uneven.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/retrospective-uneven.pdf -------------------------------------------------------------------------------- /font/Courier-Oblique.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Courier-Oblique.json')) -------------------------------------------------------------------------------- /font/Helvetica-Bold.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Helvetica-Bold.json')) -------------------------------------------------------------------------------- /test/pdfs/annotations/doc-destination.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/annotations/doc-destination.pdf -------------------------------------------------------------------------------- /test/pdfs/annotations/img-destination.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/annotations/img-destination.pdf -------------------------------------------------------------------------------- /test/pdfs/annotations/text-destination.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/annotations/text-destination.pdf -------------------------------------------------------------------------------- /test/pdfs/external/collision-prevention.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/collision-prevention.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/fixtures/msoffice-toc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/fixtures/msoffice-toc.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-117-nested-pages.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-117-nested-pages.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/illustrator.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/illustrator.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/indesign-interactive.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/indesign-interactive.pdf -------------------------------------------------------------------------------- /test/pdfs/table/large-rows-with-headers.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/large-rows-with-headers.pdf -------------------------------------------------------------------------------- /test/pdfs/table/multiple-headers-only.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/multiple-headers-only.pdf -------------------------------------------------------------------------------- /test/pdfs/table/simple-multiple-headers.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/simple-multiple-headers.pdf -------------------------------------------------------------------------------- /font/Helvetica-Oblique.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Helvetica-Oblique.json')) -------------------------------------------------------------------------------- /font/Times-BoldItalic.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Times-BoldItalic.json')) -------------------------------------------------------------------------------- /test/pdfs/external/templatefirstpageonly.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/external/templatefirstpageonly.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/indesign-print.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/indesign-print.pdf -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/ms-print-to-pdf.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/ms-print-to-pdf.pdf -------------------------------------------------------------------------------- /test/pdfs/table/retrospective-pagefooter.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/table/retrospective-pagefooter.pdf -------------------------------------------------------------------------------- /font/Courier-BoldOblique.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Courier-BoldOblique.json')) -------------------------------------------------------------------------------- /font/Helvetica-BoldOblique.js: -------------------------------------------------------------------------------- 1 | const AFMFont = require('../lib/font/afm') 2 | module.exports = new AFMFont(require('./Helvetica-BoldOblique.json')) -------------------------------------------------------------------------------- /test/pdfs/issue/issue-202-page-vs-table-header.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-202-page-vs-table-header.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-41.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc.text("https://github.com/rkusa/pdfjs << click me"); 3 | }; 4 | -------------------------------------------------------------------------------- /test/pdfs/parser/fixtures/indesign-interactive.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/parser/fixtures/indesign-interactive.pdf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dotfiles 2 | .* 3 | !.git* 4 | !.travis.yml 5 | 6 | # dependencies 7 | node_modules 8 | 9 | # local files 10 | test.* 11 | /*.pdf 12 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-150-nested-pages-in-templates.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-150-nested-pages-in-templates.pdf -------------------------------------------------------------------------------- /test/pdfs/issue/issue-175-cell-text-opts-inheritance.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkusa/pdfjs/HEAD/test/pdfs/issue/issue-175-cell-text-opts-inheritance.pdf -------------------------------------------------------------------------------- /test/pdfs/text/pagebreak.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.long, { fontSize: 20 }); 3 | doc.text(lorem.long, { fontSize: 20 }); 4 | }; 5 | -------------------------------------------------------------------------------- /test/pdfs/annotations/img-link.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { image, lorem }) { 2 | doc.image(image.jpeg, { 3 | link: "https://github.com/rkusa/pdfjs", 4 | }); 5 | }; 6 | -------------------------------------------------------------------------------- /test/pdfs/image/pdf-complex.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { image, lorem }) { 2 | doc.text(lorem.shorter); 3 | 4 | doc.image(image.complexPdf); 5 | 6 | doc.text(lorem.shorter); 7 | }; 8 | -------------------------------------------------------------------------------- /test/pdfs/cell/simple.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc.cell(fixtures.lorem.short, { 3 | width: 200, 4 | padding: 20, 5 | backgroundColor: 0xeeeeee, 6 | }); 7 | }; 8 | -------------------------------------------------------------------------------- /test/pdfs/text/wordbreak.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | const cell = doc.cell({ padding: 10, width: 50, backgroundColor: 0xeeeeee }); 3 | cell.text("abcdefghijklmnopqrstuvw abcd"); 4 | }; 5 | -------------------------------------------------------------------------------- /test/pdfs/external/addallpages.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { document }) { 2 | const external = document.test; 3 | 4 | doc.addPagesOf(external); 5 | 6 | doc.text("Should be on third page ..."); 7 | }; 8 | -------------------------------------------------------------------------------- /test/pdfs/external/firstpage.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { document }) { 2 | const external = document.test; 3 | 4 | doc.addPageOf(1, external); 5 | 6 | doc.text("Should be on second page ..."); 7 | }; 8 | -------------------------------------------------------------------------------- /test/pdfs/external/otherpage.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { document }) { 2 | const external = document.test; 3 | 4 | doc.addPageOf(2, external); 5 | 6 | doc.text("Should be on second page ..."); 7 | }; 8 | -------------------------------------------------------------------------------- /test/pdfs/image/pagebreak.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { image, lorem }) { 2 | doc.cell("a cell to move the image down", { paddingTop: 770 }); 3 | doc.image(image.jpeg); 4 | doc.text("after image"); 5 | }; 6 | -------------------------------------------------------------------------------- /test/pdfs/ops/absolute.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | // absolute 3 | doc.op(0, 0, 1, "sc"); 4 | doc.op(0, 830, 297.6648, 11.896, "re"); 5 | doc.op("f"); 6 | 7 | doc.text(lorem.short); 8 | }; 9 | -------------------------------------------------------------------------------- /test/pdfs/image/nowrap.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem, image }) { 2 | doc.image(image.pdf, { 3 | wrap: false, 4 | y: 831.896, 5 | x: 10, 6 | }); 7 | 8 | doc.text(lorem.shorter); 9 | }; 10 | -------------------------------------------------------------------------------- /test/pdfs/annotations/text-link.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc 3 | .text("pdfjs", { link: "https://github.com/rkusa/pdfjs" }) 4 | .add("issues", { link: "https://github.com/rkusa/pdfjs/issues" }); 5 | }; 6 | -------------------------------------------------------------------------------- /test/pdfs/annotations/doc-destination.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../lib"); 2 | 3 | module.exports = function (doc, { lorem, font }) { 4 | doc.text("goto", { goTo: "here" }); 5 | 6 | doc.pageBreak(); 7 | doc.destination("here"); 8 | }; 9 | -------------------------------------------------------------------------------- /test/pdfs/annotations/img-goto.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { image, lorem }) { 2 | doc.image(image.jpeg, { 3 | goTo: "here", 4 | }); 5 | 6 | doc.pageBreak(); 7 | 8 | doc.text("here", { destination: "here" }); 9 | }; 10 | -------------------------------------------------------------------------------- /test/pdfs/annotations/img-destination.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { image, lorem }) { 2 | doc.text("goto", { goTo: "here" }); 3 | 4 | doc.pageBreak(); 5 | 6 | doc.image(image.jpeg, { 7 | destination: "here", 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-81.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { font }) { 2 | doc 3 | .text() 4 | .add("Manage your calories by", { font: font.opensans.regular }) 5 | .add("eating a quarter pack per day.", { font: font.opensans.bold }); 6 | }; 7 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-202-page-vs-table-header.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | doc.header().text("Page Header"); 3 | 4 | const table = doc.table({ widths: [null] }); 5 | table.header().cell("Table header"); 6 | table.row().cell("Content"); 7 | }; 8 | -------------------------------------------------------------------------------- /test/pdfs/external/template.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { document, lorem }) { 2 | doc.setTemplate(document.test); 3 | 4 | doc.text("TEST", { fontSize: 40 }); 5 | 6 | doc.pageBreak(); 7 | 8 | doc.text(lorem.short, { fontSize: 20 }); 9 | }; 10 | -------------------------------------------------------------------------------- /test/pdfs/external/addinbetween.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { document }) { 2 | const external = document.test; 3 | 4 | doc.text("Should be on first page ..."); 5 | 6 | doc.addPagesOf(external); 7 | 8 | doc.text("Should be on fourth page ..."); 9 | }; 10 | -------------------------------------------------------------------------------- /test/pdfs/cell/break-single.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const cell = doc.cell({ 3 | backgroundColor: 0xeeeeee, 4 | width: 200, 5 | padding: 10, 6 | }); 7 | 8 | cell.text(lorem.long, { textAlign: "justify", fontSize: 15 }); 9 | }; 10 | -------------------------------------------------------------------------------- /lib/object/number.js: -------------------------------------------------------------------------------- 1 | exports.parse = function (xref, lexer, trial) { 2 | const n = lexer.readNumber(true); 3 | 4 | if (n === undefined) { 5 | if (trial) { 6 | return undefined; 7 | } 8 | 9 | throw new Error("Invalid number"); 10 | } 11 | 12 | return n; 13 | }; 14 | -------------------------------------------------------------------------------- /test/pdfs/text/append.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc 3 | .text("Lorem ipsum dolor sit amet, consetetur sadipscing elitr") 4 | .append(",") 5 | .add( 6 | "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.", 7 | ); 8 | }; 9 | -------------------------------------------------------------------------------- /test/pdfs/ops/relative.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.short); 3 | 4 | // relative 5 | doc.op(1, 0, 0, "sc"); 6 | doc.op((x, y) => { 7 | const height = 40; 8 | return [x, y - height, x + 60, height, "re"]; 9 | }); 10 | doc.op("f"); 11 | }; 12 | -------------------------------------------------------------------------------- /test/pdfs/cell/border-break-single.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const cell = doc.cell({ 3 | backgroundColor: 0xeeeeee, 4 | width: 200, 5 | padding: 0, 6 | borderWidth: 10, 7 | }); 8 | 9 | cell.text(lorem.long, { textAlign: "justify", fontSize: 15 }); 10 | }; 11 | -------------------------------------------------------------------------------- /test/pdfs/headerfooter/header-change.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem, image }) { 2 | let header = doc.header(); 3 | header.text("First"); 4 | 5 | doc.text("Hello World 1"); 6 | 7 | header = doc.header(); 8 | header.text("Second"); 9 | 10 | doc.text("Hello World 2"); 11 | }; 12 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | exports.Document = require("./document"); 4 | exports.Font = require("./font/otf"); 5 | 6 | exports.Image = require("./image/image"); 7 | 8 | exports.ExternalDocument = require("./external"); 9 | 10 | exports.mm = 0.0393700787 * 72; 11 | exports.cm = exports.mm * 10; 12 | -------------------------------------------------------------------------------- /test/pdfs/doc/padding-zero.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../lib"); 2 | 3 | module.exports = function (_, { lorem, font }) { 4 | const doc = new pdf.Document({ 5 | font: font.afm.regular, 6 | paddingLeft: 0, 7 | paddingRight: 0, 8 | }); 9 | doc.text(lorem.short); 10 | return doc; 11 | }; 12 | -------------------------------------------------------------------------------- /test/pdfs/external/collision-prevention.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { font, document, lorem }) { 2 | doc.text("TEST", { fontSize: 200, color: 0xdddddd, textAlign: "center" }); 3 | 4 | doc.setTemplate(document.pdfjsCreated); 5 | 6 | doc.text("TEST", { fontSize: 200, color: 0xdddddd, textAlign: "center" }); 7 | }; 8 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-133.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | for (var i = 0; i < 10; i++) { 3 | const table = doc 4 | .table({ widths: [null, null], borderWidth: 1, padding: 100 }) 5 | .row(); 6 | table.cell().text(`L ${i}`); 7 | table.cell().text(`R ${i}`); 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /lib/object/null.js: -------------------------------------------------------------------------------- 1 | exports.parse = function (xref, lexer, trial) { 2 | const isNull = lexer.getString(4) === "null"; 3 | 4 | if (!isNull) { 5 | if (trial) { 6 | return undefined; 7 | } 8 | 9 | throw new Error("Invalid null"); 10 | } 11 | 12 | lexer.shift(4); 13 | 14 | return null; 15 | }; 16 | -------------------------------------------------------------------------------- /test/pdfs/headerfooter/footer-change.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | new Array(3).fill(lorem.short).forEach((t, i) => { 3 | const h = doc.header(); 4 | h.text("Header " + i); 5 | const f = doc.footer(); 6 | f.text("Footer \n\n\n\n Part #" + i); 7 | doc.text(t); 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-68.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { font }) { 2 | doc.header().text("Test", { font: font.afm.bold }); 3 | 4 | doc.footer().text("Footer", { font: font.afm.mono }); 5 | 6 | doc.text("TEST:", { fontSize: 16, font: font.afm.bold }); 7 | doc.text().add("TE").append("ST", { font: font.afm.monoRegular }); 8 | }; 9 | -------------------------------------------------------------------------------- /test/pdfs/cell/break-multiple.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const cell = doc.cell({ 3 | backgroundColor: 0xeeeeee, 4 | width: 250, 5 | padding: 10, 6 | }); 7 | 8 | cell.text(lorem.long, { textAlign: "justify", fontSize: 20 }); 9 | cell.text(lorem.long, { textAlign: "justify", fontSize: 20 }); 10 | }; 11 | -------------------------------------------------------------------------------- /test/pdfs/parser/objstream.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const external = new pdf.ExternalDocument( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/objstream.pdf")), 8 | ); 9 | doc.addPagesOf(external); 10 | }; 11 | -------------------------------------------------------------------------------- /test/pdfs/cell/xy.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.short); 3 | 4 | const cell = doc.cell({ 5 | backgroundColor: 0xeeeeee, 6 | padding: 10, 7 | width: 256, 8 | borderWidth: 1, 9 | x: 256, 10 | y: 256, 11 | }); 12 | cell.text(lorem.short); 13 | 14 | doc.text(lorem.short); 15 | }; 16 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-260-empty-name.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | const pdf = require("../../../"); 3 | const path = require("path"); 4 | const fs = require("fs"); 5 | 6 | const external = new pdf.ExternalDocument( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/issue-260.pdf")), 8 | ); 9 | doc.addPagesOf(external); 10 | }; 11 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-6.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc.text( 3 | "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", 4 | { font: fixtures.font.opensans.regular }, 5 | ); 6 | doc.text("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", { 7 | font: fixtures.font.opensans.regular, 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /test/pdfs/text/alignment-afm.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc.text(fixtures.lorem.short + "\n\n", { textAlign: "left" }); 3 | doc.text(fixtures.lorem.short + "\n\n", { textAlign: "center" }); 4 | doc.text(fixtures.lorem.short + "\n\n", { textAlign: "right" }); 5 | doc.text(fixtures.lorem.short + "\n\n", { textAlign: "justify" }); 6 | }; 7 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-112.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { font }) { 2 | const pdf = require("../../../"); 3 | const path = require("path"); 4 | const fs = require("fs"); 5 | 6 | const external = new pdf.ExternalDocument( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/msoffice-toc.pdf")), 8 | ); 9 | doc.addPagesOf(external); 10 | }; 11 | -------------------------------------------------------------------------------- /test/pdfs/table/header-only.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const table = doc.table({ 3 | widths: [null, null], 4 | borderWidth: 1, 5 | }); 6 | 7 | const header = table.header(); 8 | header.cell("Header Left", { textAlign: "center", padding: 30 }); 9 | header.cell("Header Right", { textAlign: "center", padding: 30 }); 10 | }; 11 | -------------------------------------------------------------------------------- /test/pdfs/annotations/text-destination.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../lib"); 2 | 3 | module.exports = function (doc, { lorem, font }) { 4 | doc.text("goto B", { goTo: "B" }); 5 | doc.text("goto A", { goTo: "A" }); 6 | 7 | doc.pageBreak(); 8 | doc.text("A", { destination: "A" }); 9 | 10 | doc.pageBreak(); 11 | doc.text("B", { destination: "B" }); 12 | }; 13 | -------------------------------------------------------------------------------- /test/pdfs/cell/border-break-long.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const cell = doc.cell({ 3 | backgroundColor: 0xeeeeee, 4 | width: 270, 5 | padding: 0, 6 | borderWidth: 10, 7 | }); 8 | 9 | cell.text(lorem.long, { textAlign: "justify", fontSize: 20 }); 10 | cell.text(lorem.long, { textAlign: "justify", fontSize: 20 }); 11 | }; 12 | -------------------------------------------------------------------------------- /test/pdfs/external/self.js: -------------------------------------------------------------------------------- 1 | // Add PDF generated by pdfjs as external document. 2 | const fs = require("fs"); 3 | const path = require("path"); 4 | const pdf = require("../../../lib"); 5 | 6 | module.exports = function (doc) { 7 | doc.addPagesOf( 8 | new pdf.ExternalDocument( 9 | fs.readFileSync(path.join(__dirname, "addallpages.pdf")), 10 | ), 11 | ); 12 | }; 13 | -------------------------------------------------------------------------------- /test/pdfs/table/border.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const table = doc.table({ 3 | widths: [256, 256], 4 | borderWidth: 10, 5 | }); 6 | 7 | const row = table.row(); 8 | 9 | row.cell(lorem.shorter, { textAlign: "justify", fontSize: 20, padding: 10 }); 10 | row.cell(lorem.shorter, { textAlign: "justify", fontSize: 20, padding: 10 }); 11 | }; 12 | -------------------------------------------------------------------------------- /test/pdfs/table/border-horizontal2.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.cell({ y: 60 }); 3 | 4 | const table = doc.table({ 5 | widths: [null, null], 6 | borderWidth: 1, 7 | padding: 10, 8 | }); 9 | 10 | for (let i = 0; i < 3; ++i) { 11 | const row = table.row(); 12 | row.cell("Cell " + i); 13 | row.cell("Cell " + i); 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /test/pdfs/headerfooter/footer.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem, image }) { 2 | const footer = doc.footer(); 3 | footer.text("text"); 4 | 5 | const cell = footer.cell({ padding: 20, backgroundColor: 0xdddddd }); 6 | cell.text("TESTING"); 7 | cell.image(image.pdf); 8 | 9 | doc.text("Hello"); 10 | 11 | doc.pageBreak(); 12 | 13 | doc.text(lorem.long, { fontSize: 20 }); 14 | }; 15 | -------------------------------------------------------------------------------- /test/pdfs/headerfooter/header.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem, image }) { 2 | const header = doc.header(); 3 | header.text("text"); 4 | 5 | const cell = header.cell({ padding: 20, backgroundColor: 0xdddddd }); 6 | cell.text("TESTING"); 7 | cell.image(image.pdf); 8 | 9 | doc.text("Hello"); 10 | 11 | doc.pageBreak(); 12 | 13 | doc.text(lorem.long, { fontSize: 20 }); 14 | }; 15 | -------------------------------------------------------------------------------- /test/pdfs/parser/google.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/google.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak5.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const table = doc.table({ widths: [200, 200] }); 3 | const row = table.row(); 4 | row.cell(lorem.short, { 5 | backgroundColor: 0xeeeeee, 6 | padding: 10, 7 | fontSize: 20, 8 | }); 9 | row.cell("Uneven ...", { 10 | backgroundColor: 0xbbbbbb, 11 | padding: 10, 12 | fontSize: 20, 13 | }); 14 | }; 15 | -------------------------------------------------------------------------------- /test/pdfs/cell/retrospective.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | for (let i = 0; i < 3; ++i) { 3 | doc.text(lorem.short, { fontSize: 20 }); 4 | } 5 | 6 | // should be moved to the next page retrospectively 7 | doc.cell(lorem.short, { 8 | backgroundColor: 0xeeeeee, 9 | padding: 30, 10 | fontSize: 20, 11 | }); 12 | 13 | doc.text(lorem.short, { fontSize: 20 }); 14 | }; 15 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-150-nested-pages-in-templates.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { font }) { 2 | const pdf = require("../../../"); 3 | const path = require("path"); 4 | const fs = require("fs"); 5 | 6 | const external = new pdf.ExternalDocument( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/issue-117.pdf")), 8 | ); 9 | doc.setTemplate(external); 10 | doc.text("Works"); 11 | }; 12 | -------------------------------------------------------------------------------- /test/pdfs/parser/illustrator.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/illustrator.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /test/pdfs/table/border-color.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const table = doc.table({ 3 | widths: [256, 256], 4 | borderWidth: 10, 5 | borderColor: 0xe74c3c, 6 | }); 7 | 8 | const row = table.row(); 9 | 10 | row.cell(lorem.shorter, { textAlign: "justify", fontSize: 20, padding: 10 }); 11 | row.cell(lorem.shorter, { textAlign: "justify", fontSize: 20, padding: 10 }); 12 | }; 13 | -------------------------------------------------------------------------------- /test/pdfs/external/pagesize.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { document }) { 2 | doc.text("First"); 3 | 4 | const pdf = require("../../../"); 5 | const path = require("path"); 6 | const fs = require("fs"); 7 | 8 | const external = new pdf.ExternalDocument( 9 | fs.readFileSync(path.join(__dirname, "/fixtures/200x200.pdf")), 10 | ); 11 | doc.addPagesOf(external); 12 | 13 | doc.text("Second"); 14 | }; 15 | -------------------------------------------------------------------------------- /test/pdfs/parser/ms-print-to-pdf.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/ms-print-to-pdf.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /test/pdfs/parser/itext2.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/itext2.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | height: 841.89, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /test/pdfs/parser/itext5.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/itext5.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | height: 841.89, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /test/pdfs/parser/itext7.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/itext7.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | height: 841.89, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /test/pdfs/parser/word.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/word.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | height: 841.89, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | on: push 2 | name: Continuous Integration 3 | jobs: 4 | ci: 5 | name: Continuous Integration 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@master 9 | - name: Use Node.js 10.x 10 | uses: actions/setup-node@v1 11 | with: 12 | version: 10.x 13 | - name: Install Dependencies and Run Tests 14 | run: | 15 | npm install 16 | npm test 17 | -------------------------------------------------------------------------------- /test/pdfs/parser/photoshop.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/photoshop.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | height: 841.89, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /test/pdfs/parser/pixelmator.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/pixelmator.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | height: 841.89, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-117-nested-pages.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { font }) { 2 | const pdf = require("../../../"); 3 | const path = require("path"); 4 | const fs = require("fs"); 5 | 6 | const external = new pdf.ExternalDocument( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/issue-117.pdf")), 8 | ); 9 | doc.addPageOf(43, external); // should add "Hello 41" as the first page 10 | doc.addPagesOf(external); 11 | }; 12 | -------------------------------------------------------------------------------- /test/pdfs/parser/indesign-print.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/indesign-print.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | height: 841.89, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /test/pdfs/table/missing-cells.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const table = doc.table({ widths: [null, null, null], borderWidth: 1 }); 3 | { 4 | const row = table.row(); 5 | row.cell("A"); 6 | row.cell("B"); 7 | row.cell("C"); 8 | } 9 | { 10 | const row = table.row(); 11 | row.cell("A"); 12 | // missing cells should be added automatically 13 | } 14 | 15 | doc.text(lorem.shorter); 16 | }; 17 | -------------------------------------------------------------------------------- /test/pdfs/cell/border.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | doc.text("before"); 3 | 4 | doc.cell("Cell 1", { 5 | fontSize: 15, 6 | width: 256, 7 | padding: 10, 8 | borderWidth: 5, 9 | }); 10 | 11 | doc.text("in between"); 12 | 13 | doc.cell("Cell 2", { 14 | fontSize: 15, 15 | width: 256, 16 | padding: 10, 17 | borderWidth: 1, 18 | borderColor: 0x2980b9, 19 | }); 20 | 21 | doc.text("after"); 22 | }; 23 | -------------------------------------------------------------------------------- /test/pdfs/cell/nested.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc.text(fixtures.lorem.shorter); 3 | const outer = doc.cell({ 4 | width: 400, 5 | padding: 20, 6 | backgroundColor: 0xeeeeee, 7 | }); 8 | const inner = outer.cell({ padding: 20, backgroundColor: 0xdddddd }); 9 | inner.text(fixtures.lorem.short); 10 | inner.text(fixtures.lorem.short); 11 | outer.text("Hello World"); 12 | doc.text("Hello World"); 13 | }; 14 | -------------------------------------------------------------------------------- /test/pdfs/parser/indesign-interactive.js: -------------------------------------------------------------------------------- 1 | const pdf = require("../../../"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | module.exports = function (doc) { 6 | const img = new pdf.Image( 7 | fs.readFileSync(path.join(__dirname, "/fixtures/indesign-interactive.pdf")), 8 | ); 9 | 10 | doc.image(img, { 11 | wrap: false, 12 | x: 0, 13 | y: 841.89, 14 | width: 595.28, 15 | height: 841.89, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /test/pdfs/cell/retrospective-long.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | for (let i = 0; i < 3; ++i) { 3 | doc.text(lorem.short, { fontSize: 20 }); 4 | } 5 | 6 | // should be moved to the next page retrospectively 7 | const cell = doc.cell({ backgroundColor: 0xeeeeee, padding: 20 }); 8 | for (let i = 0; i < 4; ++i) { 9 | cell.text(lorem.short, { fontSize: 20 }); 10 | } 11 | 12 | doc.text(lorem.short, { fontSize: 20 }); 13 | }; 14 | -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak6.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.cell({ y: 70 }); 3 | 4 | const table = doc.table({ 5 | widths: [null, null], 6 | borderWidth: 1, 7 | padding: 10, 8 | }); 9 | 10 | for (let i = 0; i < 2; ++i) { 11 | const row = table.row(); 12 | row.cell("Cell " + i); 13 | const cell = row.cell(); 14 | for (let i = 0; i < 3; ++i) { 15 | cell.text("text " + i); 16 | } 17 | } 18 | }; 19 | -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak7.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.cell({ y: 120 }); 3 | 4 | const table = doc.table({ 5 | widths: [null, null], 6 | borderWidth: 1, 7 | padding: 10, 8 | }); 9 | 10 | for (let i = 0; i < 2; ++i) { 11 | const row = table.row(); 12 | row.cell("Cell " + i); 13 | const cell = row.cell(); 14 | for (let i = 0; i < 3; ++i) { 15 | cell.text("text " + i); 16 | } 17 | } 18 | }; 19 | -------------------------------------------------------------------------------- /test/pdfs/cell/border-top.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | doc.text("before"); 3 | 4 | doc.cell("Cell 1", { 5 | fontSize: 15, 6 | width: 256, 7 | padding: 10, 8 | borderTopWidth: 5, 9 | }); 10 | 11 | doc.text("in between"); 12 | 13 | doc.cell("Cell 2", { 14 | fontSize: 15, 15 | width: 256, 16 | padding: 10, 17 | borderTopWidth: 1, 18 | borderTopColor: 0x2980b9, 19 | }); 20 | 21 | doc.text("after"); 22 | }; 23 | -------------------------------------------------------------------------------- /test/pdfs/cell/break-nested.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const cell = doc.cell({ 3 | backgroundColor: 0xeeeeee, 4 | width: 250, 5 | padding: 10, 6 | }); 7 | 8 | cell.text(lorem.shorter, { fontSize: 20 }); 9 | 10 | const inner = cell.cell({ 11 | backgroundColor: 0xdddddd, 12 | padding: 10, 13 | }); 14 | 15 | inner.text(lorem.long, { fontSize: 20 }); 16 | 17 | cell.text(lorem.shorter, { fontSize: 20 }); 18 | }; 19 | -------------------------------------------------------------------------------- /test/others/multiple-table-headers.js: -------------------------------------------------------------------------------- 1 | const test = require("tape"); 2 | const pdf = require("../../lib"); 3 | 4 | test("table headers created in-between rows", function (t) { 5 | const doc = new pdf.Document(); 6 | const table = doc.table({ widths: [] }); 7 | table.header(); 8 | table.header(); 9 | table.row(); 10 | t.throws( 11 | () => table.header(), 12 | /The table already has rows, cannot add additional headers/, 13 | ); 14 | t.end(); 15 | }); 16 | -------------------------------------------------------------------------------- /test/pdfs/cell/border-left.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | doc.text("before"); 3 | 4 | doc.cell("Cell 1", { 5 | fontSize: 15, 6 | width: 256, 7 | padding: 10, 8 | borderLeftWidth: 5, 9 | }); 10 | 11 | doc.text("in between"); 12 | 13 | doc.cell("Cell 2", { 14 | fontSize: 15, 15 | width: 256, 16 | padding: 10, 17 | borderLeftWidth: 1, 18 | borderLeftColor: 0x2980b9, 19 | }); 20 | 21 | doc.text("after"); 22 | }; 23 | -------------------------------------------------------------------------------- /test/pdfs/cell/border-right.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | doc.text("before"); 3 | 4 | doc.cell("Cell 1", { 5 | fontSize: 15, 6 | width: 256, 7 | padding: 10, 8 | borderRightWidth: 5, 9 | }); 10 | 11 | doc.text("in between"); 12 | 13 | doc.cell("Cell 2", { 14 | fontSize: 15, 15 | width: 256, 16 | padding: 10, 17 | borderRightWidth: 1, 18 | borderRightColor: 0x2980b9, 19 | }); 20 | 21 | doc.text("after"); 22 | }; 23 | -------------------------------------------------------------------------------- /lib/object/boolean.js: -------------------------------------------------------------------------------- 1 | exports.parse = function (xref, lexer, trial) { 2 | const isTrue = lexer.getString(4) === "true"; 3 | const isFalse = !isTrue && lexer.getString(5) === "false"; 4 | 5 | if (!isTrue && !isFalse) { 6 | if (trial) { 7 | return undefined; 8 | } 9 | 10 | throw new Error("Invalid boolean"); 11 | } 12 | 13 | if (isTrue) { 14 | lexer.shift(4); 15 | } else { 16 | lexer.shift(5); 17 | } 18 | 19 | return isTrue; 20 | }; 21 | -------------------------------------------------------------------------------- /test/pdfs/cell/border-bottom.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | doc.text("before"); 3 | 4 | doc.cell("Cell 1", { 5 | fontSize: 15, 6 | width: 256, 7 | padding: 10, 8 | borderBottomWidth: 5, 9 | }); 10 | 11 | doc.text("in between"); 12 | 13 | doc.cell("Cell 2", { 14 | fontSize: 15, 15 | width: 256, 16 | padding: 10, 17 | borderBottomWidth: 1, 18 | borderBottomColor: 0x2980b9, 19 | }); 20 | 21 | doc.text("after"); 22 | }; 23 | -------------------------------------------------------------------------------- /test/pdfs/cell/border-mixed.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | doc.text("before"); 3 | 4 | doc.cell("Cell 1", { 5 | fontSize: 15, 6 | width: 256, 7 | padding: 10, 8 | borderTopWidth: 2, 9 | borderTopColor: 0xe74c3c, 10 | borderRightWidth: 4, 11 | borderRightColor: 0x2980b9, 12 | borderBottomWidth: 6, 13 | borderBottomColor: 0x27ae60, 14 | borderLeftWidth: 8, 15 | borderLeftColor: 0xf1c40f, 16 | }); 17 | 18 | doc.text("after"); 19 | }; 20 | -------------------------------------------------------------------------------- /test/pdfs/headerfooter/pagenumber.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | const footer = doc.footer(); 3 | footer.text("before", { textAlign: "center" }); 4 | footer.pageNumber({ textAlign: "center", fontSize: 16 }); 5 | 6 | const header = doc.header(); 7 | header.pageNumber({ textAlign: "center", fontSize: 16 }); 8 | header.text("after", { textAlign: "center" }); 9 | 10 | doc.text("Hello World 1"); 11 | 12 | doc.pageBreak(); 13 | 14 | doc.text("Hello World 2"); 15 | }; 16 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-175-cell-text-opts-inheritance.js: -------------------------------------------------------------------------------- 1 | const HelveticaBold = require("../../../font/Helvetica-Bold.js"); 2 | 3 | const cm = 0.0393700787 * 72 * 10; 4 | 5 | module.exports = function (doc, { image }) { 6 | const table = doc.table({ 7 | widths: [null], 8 | borderWidth: 1, 9 | padding: 4, 10 | }); 11 | 12 | table.row({ font: HelveticaBold }).cell().text("Bold").add("Bold"); 13 | table.row({ font: HelveticaBold }).cell().text("Bold").text("Bold"); 14 | }; 15 | -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak4.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const table = doc.table({ widths: [205, 205] }); 3 | 4 | for (let r = 0; r < 3; ++r) { 5 | const row = table.row(); 6 | 7 | for (let c = 0; c < 2; ++c) { 8 | const cell = row.cell({ padding: 10, backgroundColor: 0xbbbbbb }); 9 | for (let i = 0; i < 2; ++i) { 10 | cell.text(lorem.short, { fontSize: 20 }); 11 | } 12 | } 13 | } 14 | 15 | doc.text(lorem.shorter); 16 | }; 17 | -------------------------------------------------------------------------------- /docs/text.md: -------------------------------------------------------------------------------- 1 | ## Text 2 | 3 | ### .add(text, [opts]) 4 | 5 | Adds text to the text fragment. 6 | 7 | **Arguments:** 8 | 9 | - **str** - the string 10 | - **opts** - styling options 11 | 12 | **Options:** 13 | 14 | Same as [doc.text([text], [opts])](fragment.md#texttext-opts) 15 | 16 | ### .append(text, [opts]) 17 | 18 | Same as [text.add(text, [opts])](fragment.md#texttext-opts), but directly appends the text, i.e., adds the text without a space. 19 | 20 | ### .br() 21 | 22 | Adds a line break. 23 | -------------------------------------------------------------------------------- /lib/content.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const PDF = require("./object"); 4 | 5 | module.exports = class ContentChunk { 6 | constructor(doc, obj) { 7 | this._doc = doc; 8 | this._fonts = {}; 9 | this._xobjects = {}; 10 | 11 | this._object = obj || new PDF.Object(); 12 | this._length = new PDF.Object(); 13 | 14 | doc._registerObject(this._object); 15 | doc._registerObject(this._length); 16 | 17 | this._object.prop("Length", this._length.toReference()); 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak3.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.shorter); 3 | 4 | const table = doc.table({ widths: [200, 200] }); 5 | 6 | for (let r = 0; r < 4; ++r) { 7 | const row = table.row(); 8 | 9 | for (let c = 0; c < 2; ++c) { 10 | const cell = row.cell({ padding: 10, backgroundColor: 0xbbbbbb }); 11 | for (let i = 0; i < 2; ++i) { 12 | cell.text(lorem.shorter, { fontSize: 20 }); 13 | } 14 | } 15 | } 16 | 17 | doc.text(lorem.shorter); 18 | }; 19 | -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak8.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.header().text("Header"); 3 | doc.footer().text("Footer"); 4 | 5 | doc.cell({ y: 120 }); 6 | 7 | const table = doc.table({ 8 | widths: [null, null], 9 | borderWidth: 1, 10 | padding: 10, 11 | }); 12 | 13 | for (let i = 0; i < 2; ++i) { 14 | const row = table.row(); 15 | row.cell("Cell " + i); 16 | const cell = row.cell(); 17 | for (let i = 0; i < 3; ++i) { 18 | cell.text("text " + i); 19 | } 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /test/pdfs/text/append-style.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { font }) { 2 | const txt1 = doc 3 | .text("foo", { font: font.afm.monoRegular }) 4 | .append("bar", { font: font.afm.monoBold }) 5 | .append("_"); 6 | 7 | for (let i = 0; i < 100; ++i) { 8 | txt1.add("."); 9 | } 10 | 11 | const txt2 = doc 12 | .text("foo", { font: font.afm.monoRegular, textAlign: "center" }) 13 | .append("bar", { font: font.afm.monoBold }) 14 | .append("_"); 15 | 16 | for (let i = 0; i < 30; ++i) { 17 | txt2.add("."); 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /test/pdfs/table/border-break-long.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const table = doc.table({ 3 | widths: [256, 256], 4 | padding: 0, 5 | borderWidth: 10, 6 | }); 7 | 8 | const row = table.row(); 9 | 10 | row.cell(lorem.short, { 11 | textAlign: "justify", 12 | fontSize: 20, 13 | padding: 10, 14 | backgroundColor: 0xdddddd, 15 | }); 16 | row.cell(lorem.long + "\n" + lorem.long, { 17 | textAlign: "justify", 18 | fontSize: 20, 19 | padding: 10, 20 | backgroundColor: 0xeeeeee, 21 | }); 22 | }; 23 | -------------------------------------------------------------------------------- /test/pdfs/text/styling.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | const text = doc.text(); 3 | text 4 | .add("Regular") 5 | .add("Bold", { font: fixtures.font.afm.bold }) 6 | .add("Regular", { font: fixtures.font.afm.regular }) 7 | .add("Big", { fontSize: 20 }) 8 | .add("BigBold", { fontSize: 20, font: fixtures.font.afm.bold }) 9 | .add("Red", { color: 0xff0000 }) 10 | .add("Regular") 11 | // test changing line heights 12 | .add("\nRegular") 13 | .add("\nBigger", { fontSize: 40 }) 14 | .add("\nRegular"); 15 | }; 16 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-113-even-pages.js: -------------------------------------------------------------------------------- 1 | module.exports = async function (doc, fixtures, t) { 2 | await doc._endPage(); 3 | t.equal(doc._pages.length, 0); 4 | 5 | doc.text("Foobar"); 6 | 7 | // necessary to render the last started content 8 | if (doc._current) { 9 | doc._current.end(); 10 | doc._current = null; 11 | } 12 | 13 | // render all queued content 14 | await doc._next(); 15 | await doc._endPage(); 16 | 17 | t.equal(doc._pages.length, 1); 18 | 19 | if (doc._pages.length % 2 !== 0) { 20 | await doc._startPage(); 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /test/pdfs/table/break-empty-cells.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.cell({ y: 29 }); 3 | 4 | const table = doc.table({ 5 | widths: [null, null, null, null, null, null, null], 6 | borderWidth: 1, 7 | padding: 0, 8 | }); 9 | 10 | for (let i = 0; i < 3; ++i) { 11 | const row = table.row(); 12 | row.cell("Cell " + i); 13 | row.cell(); 14 | row.cell(); 15 | row.cell("Cell " + i); 16 | row.cell(); 17 | row.cell("Cell " + i); 18 | row.cell("Cell " + i); 19 | } 20 | }; 21 | 22 | module.exports.padding = 0; 23 | -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak2.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.shorter, { fontSize: 20 }); 3 | 4 | const table = doc.table({ widths: [200, 200] }); 5 | const row = table.row(); 6 | 7 | const cell1 = row.cell({ padding: 20, backgroundColor: 0xbbbbbb }); 8 | for (let i = 0; i < 2; ++i) { 9 | cell1.text(lorem.short, { fontSize: 20 }); 10 | } 11 | 12 | const cell2 = row.cell({ padding: 10, backgroundColor: 0xdddddd }); 13 | cell2.text(lorem.short, { fontSize: 20 }); 14 | 15 | doc.text(lorem.shorter, { fontSize: 20 }); 16 | }; 17 | -------------------------------------------------------------------------------- /test/pdfs/cell/border-retrospective.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | for (let i = 0; i < 3; ++i) { 3 | doc.text(lorem.short, { fontSize: 20 }); 4 | } 5 | 6 | doc.text("--------------------------", { fontSize: 20 }); 7 | 8 | // should be moved to the next page retrospectively 9 | const cell = doc.cell({ 10 | backgroundColor: 0xeeeeee, 11 | padding: 0, 12 | borderWidth: 1, 13 | }); 14 | for (let i = 0; i < 4; ++i) { 15 | cell.text(lorem.short, { fontSize: 20 }); 16 | } 17 | 18 | doc.text(lorem.short, { fontSize: 20 }); 19 | }; 20 | -------------------------------------------------------------------------------- /test/pdfs/image/pdf.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { image, lorem }) { 2 | doc.image(image.pdf, { 3 | width: 64, 4 | align: "center", 5 | wrap: false, 6 | x: 10, 7 | y: 30, 8 | }); 9 | 10 | doc.text(lorem.shorter); 11 | 12 | doc.image(image.pdf); 13 | 14 | doc.image(image.pdf, { 15 | width: 128, 16 | align: "left", 17 | }); 18 | 19 | doc.image(image.pdf, { 20 | height: 55, 21 | align: "center", 22 | }); 23 | 24 | doc.image(image.pdf, { 25 | width: 128, 26 | align: "right", 27 | }); 28 | 29 | doc.text(lorem.shorter); 30 | }; 31 | -------------------------------------------------------------------------------- /test/pdfs/image/jpeg.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { image, lorem }) { 2 | doc.image(image.jpeg, { 3 | width: 64, 4 | align: "center", 5 | wrap: false, 6 | x: 10, 7 | y: 30, 8 | }); 9 | 10 | doc.text(lorem.shorter); 11 | 12 | doc.image(image.jpeg); 13 | 14 | doc.image(image.jpeg, { 15 | width: 128, 16 | align: "left", 17 | }); 18 | 19 | doc.image(image.jpeg, { 20 | height: 55, 21 | align: "center", 22 | }); 23 | 24 | doc.image(image.jpeg, { 25 | width: 128, 26 | align: "right", 27 | }); 28 | 29 | doc.text(lorem.shorter); 30 | }; 31 | -------------------------------------------------------------------------------- /test/pdfs/table/border-break-single.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.short, { fontSize: 20 }); 3 | 4 | const table = doc.table({ 5 | widths: [256, 256], 6 | padding: 0, 7 | borderWidth: 10, 8 | }); 9 | 10 | const row = table.row(); 11 | 12 | row.cell(lorem.short, { 13 | textAlign: "justify", 14 | fontSize: 20, 15 | padding: 10, 16 | backgroundColor: 0xdddddd, 17 | }); 18 | row.cell(lorem.shorter, { 19 | textAlign: "justify", 20 | fontSize: 20, 21 | padding: 10, 22 | backgroundColor: 0xeeeeee, 23 | }); 24 | }; 25 | -------------------------------------------------------------------------------- /test/pdfs/text/alignment-otf.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, fixtures) { 2 | doc.text(fixtures.lorem.short + "\n\n", { 3 | font: fixtures.font.opensans.regular, 4 | textAlign: "left", 5 | }); 6 | doc.text(fixtures.lorem.short + "\n\n", { 7 | font: fixtures.font.opensans.regular, 8 | textAlign: "center", 9 | }); 10 | doc.text(fixtures.lorem.short + "\n\n", { 11 | font: fixtures.font.opensans.regular, 12 | textAlign: "right", 13 | }); 14 | doc.text(fixtures.lorem.short + "\n\n", { 15 | font: fixtures.font.opensans.regular, 16 | textAlign: "justify", 17 | }); 18 | }; 19 | -------------------------------------------------------------------------------- /test/pdfs/headerfooter/pagecount.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | const footer = doc.footer(); 3 | footer.pageNumber((curr, total) => `${curr} / ${total}`, { 4 | textAlign: "center", 5 | fontSize: 16, 6 | }); 7 | footer.text("after", { textAlign: "center" }); 8 | 9 | const header = doc.header(); 10 | header.text("before", { textAlign: "center" }); 11 | header.pageNumber((curr, total) => `${curr} / ${total}`, { 12 | textAlign: "center", 13 | fontSize: 16, 14 | }); 15 | 16 | doc.text("Hello World 1"); 17 | 18 | doc.pageBreak(); 19 | 20 | doc.text("Hello World 2"); 21 | }; 22 | -------------------------------------------------------------------------------- /test/pdfs/table/simple.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.shorter); 3 | 4 | const table = doc.table({ widths: [null, null, null] }); 5 | const row = table.row(); 6 | 7 | const cell1 = row.cell({ padding: 0, backgroundColor: 0xeeeeee }); 8 | cell1.text(lorem.short); 9 | 10 | const cell2 = row.cell({ padding: 0, backgroundColor: 0xbbbbbb }); 11 | for (let i = 0; i < 3; ++i) { 12 | cell2.text(lorem.short); 13 | } 14 | 15 | const cell3 = row.cell({ padding: 20, backgroundColor: 0xdddddd }); 16 | cell3.text(lorem.shorter); 17 | 18 | doc.text(lorem.shorter); 19 | }; 20 | -------------------------------------------------------------------------------- /types/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES2017", 5 | "noEmit": true, 6 | "skipLibCheck": true, 7 | "strict": true /* Enable all strict type-checking options. */, 8 | "noUnusedLocals": true /* Report errors on unused locals. */, 9 | "noUnusedParameters": true /* Report errors on unused parameters. */, 10 | "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, 11 | "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */ 12 | }, 13 | "files": ["pdfjs-tests.ts", "main.d.ts"] 14 | } 15 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-191-row-breaks.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc) { 2 | doc.cell({ y: 140 }); 3 | 4 | const table = doc.table({ 5 | widths: [100, null], 6 | borderWidth: 1, 7 | borderColor: 0xf00f00, 8 | }); 9 | const row = table.row(); 10 | 11 | row.cell(`heading`, { 12 | padding: 12, 13 | }); 14 | 15 | const cell = row.cell(); 16 | 17 | cell.cell(`value - 1`, { 18 | padding: 12, 19 | }); 20 | 21 | cell.cell(`value - 2`, { 22 | padding: 10, 23 | }); 24 | 25 | cell.cell(`value - 3`, { 26 | padding: 10, 27 | }); 28 | 29 | cell.cell(`value - 4`, { 30 | padding: 10, 31 | }); 32 | }; 33 | -------------------------------------------------------------------------------- /test/pdfs/headerfooter/both.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem, image }) { 2 | // header 3 | const header = doc.header(); 4 | header.text("text"); 5 | 6 | let cell = header.cell({ padding: 20, backgroundColor: 0xdddddd }); 7 | cell.text("TESTING"); 8 | cell.image(image.pdf); 9 | 10 | // footer 11 | const footer = doc.footer(); 12 | footer.text("text"); 13 | 14 | cell = footer.cell({ padding: 20, backgroundColor: 0xdddddd }); 15 | cell.image(image.complexPdf); 16 | cell.text("TESTING"); 17 | 18 | // body 19 | 20 | doc.text("Hello"); 21 | 22 | doc.pageBreak(); 23 | 24 | doc.text(lorem.long, { fontSize: 20 }); 25 | }; 26 | -------------------------------------------------------------------------------- /lib/object/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | exports.PDFArray = exports.Array = require("./array"); 4 | exports.PDFDictionary = exports.Dictionary = require("./dictionary"); 5 | exports.PDFName = exports.Name = require("./name"); 6 | exports.PDFNameTree = exports.NameTree = require("./nametree"); 7 | exports.PDFObject = exports.Object = require("./object"); 8 | exports.PDFReference = exports.Reference = require("./reference"); 9 | exports.PDFStream = exports.Stream = require("./stream"); 10 | exports.PDFString = exports.String = require("./string"); 11 | exports.PDFTrailer = exports.Trailer = require("./trailer"); 12 | exports.PDFXref = exports.Xref = require("./xref"); 13 | -------------------------------------------------------------------------------- /test/pdfs/table/header2.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text("Foo").br().br().br().br().br().br().br().br().br(); 3 | 4 | const table = doc.table({ 5 | widths: [null, null], 6 | borderWidth: 1, 7 | }); 8 | 9 | const header = table.header(); 10 | header.cell("Header Left", { textAlign: "center", padding: 30 }); 11 | header.cell("Header Right", { textAlign: "center", padding: 30 }); 12 | 13 | const row1 = table.row(); 14 | 15 | row1.cell("Cell 1", { fontSize: 11, padding: 10, backgroundColor: 0xdddddd }); 16 | row1.cell("Cell 2", { fontSize: 11, padding: 10, backgroundColor: 0xeeeeee }); 17 | 18 | doc.text("Bar"); 19 | }; 20 | -------------------------------------------------------------------------------- /test/pdfs/table/retrospective-uneven.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | for (let i = 0; i < 3; ++i) { 3 | doc.text(lorem.short, { fontSize: 20 }); 4 | } 5 | 6 | doc.text("---------------------"); 7 | 8 | const table = doc.table({ widths: [200, 200] }); 9 | 10 | // should be moved to the next page retrospectively 11 | const row = table.row(); 12 | row.cell(lorem.short, { 13 | backgroundColor: 0xeeeeee, 14 | padding: 10, 15 | fontSize: 20, 16 | }); 17 | row.cell("Uneven ...", { 18 | backgroundColor: 0xbbbbbb, 19 | padding: 10, 20 | fontSize: 20, 21 | }); 22 | 23 | doc.text(lorem.short, { fontSize: 20 }); 24 | }; 25 | -------------------------------------------------------------------------------- /test/pdfs/table/break-nested.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | const table = doc.table({ widths: [null, null] }); 3 | const row = table.row(); 4 | 5 | const cell1 = row.cell({ padding: 0, backgroundColor: 0xeeeeee }); 6 | cell1.text(lorem.short, { fontSize: 20 }); 7 | 8 | const cell2 = row.cell({ padding: 20, backgroundColor: 0xbbbbbb }); 9 | 10 | const inner = cell2.table({ widths: [null] }); 11 | const innerRow = inner.row(); 12 | const innerCell = innerRow.cell({ padding: 10, backgroundColor: 0xdddddd }); 13 | 14 | for (let i = 0; i < 2; ++i) { 15 | innerCell.text(lorem.short, { fontSize: 20 }); 16 | } 17 | 18 | doc.text(lorem.shorter, { fontSize: 20 }); 19 | }; 20 | -------------------------------------------------------------------------------- /test/pdfs/table/pagebreak1.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.shorter, { fontSize: 20 }); 3 | 4 | const table = doc.table({ widths: [null, null, null] }); 5 | const row = table.row(); 6 | 7 | const cell1 = row.cell({ padding: 0, backgroundColor: 0xeeeeee }); 8 | cell1.text(lorem.short, { fontSize: 20 }); 9 | 10 | const cell2 = row.cell({ padding: 20, backgroundColor: 0xbbbbbb }); 11 | for (let i = 0; i < 2; ++i) { 12 | cell2.text(lorem.short, { fontSize: 20 }); 13 | } 14 | 15 | const cell3 = row.cell({ padding: 10, backgroundColor: 0xdddddd }); 16 | cell3.text(lorem.shorter, { fontSize: 20 }); 17 | 18 | doc.text(lorem.shorter, { fontSize: 20 }); 19 | }; 20 | -------------------------------------------------------------------------------- /test/pdfs/table/header-pagebreak.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.header().text("PAGE HEADER"); 3 | 4 | doc.cell({ paddingTop: 750 }); 5 | 6 | const table = doc.table({ 7 | widths: [200, 200], 8 | borderWidth: 1, 9 | fontSize: 11, 10 | }); 11 | 12 | const header = table.header(); 13 | header.cell("Header Left", { textAlign: "center", padding: 30 }); 14 | header.cell("Header Right", { textAlign: "center", padding: 30 }); 15 | 16 | for (let i = 0; i < 1; ++i) { 17 | const r = table.row(); 18 | r.cell("Cell 1", { padding: 10, paddingBottom: 100 }); 19 | r.cell("Cell 2", { padding: 10, paddingBottom: 100 }); 20 | } 21 | 22 | doc.text("Foo"); 23 | }; 24 | -------------------------------------------------------------------------------- /test/pdfs/table/retrospective.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | for (let i = 0; i < 3; ++i) { 3 | doc.text(lorem.short, { fontSize: 20 }); 4 | } 5 | 6 | doc.text("---------------------"); 7 | 8 | const table = doc.table({ widths: [200, 200] }); 9 | 10 | // should be moved to the next page retrospectively 11 | const row = table.row(); 12 | row.cell(lorem.short, { 13 | backgroundColor: 0xeeeeee, 14 | padding: 10, 15 | fontSize: 20, 16 | }); 17 | row.cell(lorem.short, { 18 | backgroundColor: 0xbbbbbb, 19 | padding: 10, 20 | fontSize: 20, 21 | }); 22 | 23 | doc.text(lorem.short, { fontSize: 20 }); 24 | doc.text(lorem.short, { fontSize: 20 }); 25 | }; 26 | -------------------------------------------------------------------------------- /test/README.md: -------------------------------------------------------------------------------- 1 | JavaScript files inside the [`./pdfs`](pdfs) directory are picked up automatically and their result is compared to their *.pdf* counterparts. 2 | 3 | There will be false negatives. 4 | 5 | Ideas for a better PDF testing setup are welcome. 6 | 7 | Run specific tests: 8 | 9 | ```bash 10 | node --harmony-async-await test/index.js test/pdfs/text/*.js 11 | ``` 12 | 13 | Additional PDF validation could be done using [preflight](https://pdfbox.apache.org/download.cgi): 14 | 15 | ```bash 16 | java -classpath ./preflight-app-2.0.4.jar org.apache.pdfbox.preflight.Validator_A1b ./test.pdf 17 | ``` 18 | 19 | Use all results as future expectations: 20 | 21 | ```bash 22 | rename -f 's/\.result\.pdf$/\.pdf/' test/pdfs/**/*.pdf 23 | ``` -------------------------------------------------------------------------------- /test/pdfs/table/border-retrospective.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | for (let i = 0; i < 3; ++i) { 3 | doc.text(lorem.short, { fontSize: 20 }); 4 | } 5 | 6 | doc.text("---------------------"); 7 | 8 | const table = doc.table({ widths: [200, 200], borderWidth: 10 }); 9 | 10 | // should be moved to the next page retrospectively 11 | const row = table.row(); 12 | row.cell(lorem.short, { 13 | backgroundColor: 0xeeeeee, 14 | padding: 10, 15 | fontSize: 20, 16 | }); 17 | row.cell(lorem.short, { 18 | backgroundColor: 0xbbbbbb, 19 | padding: 10, 20 | fontSize: 20, 21 | }); 22 | 23 | doc.text(lorem.short, { fontSize: 20 }); 24 | doc.text(lorem.short, { fontSize: 20 }); 25 | }; 26 | -------------------------------------------------------------------------------- /docs/table.md: -------------------------------------------------------------------------------- 1 | ## Table 2 | 3 | ### .header([opts]) 4 | 5 | Add a table header. Returns a [Row Object](row.md). 6 | 7 | **Example:** 8 | 9 | ```js 10 | const table = doc.table({ 11 | widths: [200, 200], 12 | borderWidth: 1, 13 | }) 14 | 15 | const header = table.header() 16 | header.cell('Header Left') 17 | header.cell('Header Right') 18 | ``` 19 | 20 | ### .row([opts]) 21 | 22 | Starts a table row. Returns a [Row Object](row.md). 23 | 24 | **Options:** 25 | 26 | - **minHeight** (default: 0) - the minimum height of the row 27 | 28 | **Example:** 29 | 30 | ```js 31 | const table = doc.table({ 32 | widths: [200, 200], 33 | borderWidth: 1, 34 | }) 35 | 36 | const row = table.row() 37 | row.cell('Cell Left') 38 | row.cell('Cell Right') 39 | ``` 40 | -------------------------------------------------------------------------------- /docs/row.md: -------------------------------------------------------------------------------- 1 | ## Row 2 | 3 | ### .cell([text], [opts]) 4 | 5 | Add a cell to the row. Returns a [Fragment object](fragment.md). 6 | 7 | **Arguments:** 8 | 9 | - **text** - a string that should be rendered into the cell 10 | - **opts** - styling options 11 | 12 | **Options:** 13 | 14 | - **colspan** (default: 1) - how many columns the cell should span 15 | - **padding**, **paddingTop**, **paddingRight**, **paddingBottom**, **paddingLeft** (default: 0) - the cell padding 16 | - **backgroundColor** (default: none) - the background color the cell 17 | - **minHeight** (default: 0) - the minimum height of the cell 18 | 19 | **Example:** 20 | 21 | ```js 22 | const table = doc.table({ 23 | widths: [200, 200] 24 | }) 25 | 26 | const row = table.row() 27 | row.cell('Cell Left') 28 | row.cell('Cell Right') 29 | ``` 30 | -------------------------------------------------------------------------------- /lib/object/value.js: -------------------------------------------------------------------------------- 1 | const Objects = []; 2 | 3 | exports.parse = function (xref, lexer) { 4 | // lazy load, cause circular referecnes 5 | if (!Objects.length) { 6 | Objects.push.apply(Objects, [ 7 | require("./boolean"), 8 | require("./null"), 9 | require("./name"), 10 | require("./dictionary"), // must be tried before string! 11 | require("./string"), 12 | require("./array"), 13 | require("./reference"), // must be tried before number! 14 | require("./number"), 15 | ]); 16 | } 17 | 18 | // try 19 | for (let i = 0; i < Objects.length; ++i) { 20 | const value = Objects[i].parse(xref, lexer, true); 21 | if (value !== undefined) { 22 | return value; 23 | } 24 | } 25 | 26 | lexer._error("Invalid value"); 27 | return undefined; 28 | }; 29 | -------------------------------------------------------------------------------- /test/pdfs/table/border-horizontal.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | { 3 | const table = doc.table({ 4 | widths: [256, 256], 5 | borderHorizontalWidth: 10, 6 | }); 7 | 8 | for (let i = 0; i < 3; ++i) { 9 | const row = table.row(); 10 | 11 | row.cell("Left " + i, { fontSize: 20, padding: 10 }); 12 | row.cell("Right " + i, { fontSize: 20, padding: 10 }); 13 | } 14 | } 15 | 16 | doc.text("–––––"); 17 | 18 | { 19 | const table = doc.table({ 20 | widths: [256, 256], 21 | borderHorizontalWidths: (i) => (i + 1) * 5, 22 | }); 23 | 24 | for (let i = 0; i < 3; ++i) { 25 | const row = table.row(); 26 | 27 | row.cell("Left " + i, { fontSize: 20, padding: 10 }); 28 | row.cell("Right " + i, { fontSize: 20, padding: 10 }); 29 | } 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /lib/image/image.js: -------------------------------------------------------------------------------- 1 | const util = require("../util"); 2 | const PDFImage = require("./pdf"); 3 | const JPEGImage = require("./jpeg"); 4 | 5 | module.exports = class Image { 6 | constructor(b) { 7 | const src = util.toArrayBuffer(b); 8 | 9 | switch (determineType(src)) { 10 | case "pdf": 11 | return new PDFImage(src); 12 | case "jpeg": 13 | return new JPEGImage(src); 14 | default: 15 | throw new TypeError("Unsupported image type"); 16 | } 17 | } 18 | }; 19 | 20 | function determineType(buffer) { 21 | const pdf = String.fromCharCode.apply(null, new Uint8Array(buffer, 0, 5)); 22 | if (pdf === "%PDF-") { 23 | return "pdf"; 24 | } 25 | 26 | const view = new DataView(buffer); 27 | if (view.getUint8(0) === 0xff || view.getUint8(1) === 0xd8) { 28 | return "jpeg"; 29 | } 30 | 31 | return null; 32 | } 33 | -------------------------------------------------------------------------------- /test/pdfs/issue/issue-159-br.js: -------------------------------------------------------------------------------- 1 | const Helvetica = require("../../../font/Helvetica.js"); 2 | const HelveticaBold = require("../../../font/Helvetica-Bold.js"); 3 | 4 | const cm = 0.0393700787 * 72 * 10; 5 | 6 | module.exports = function (doc, { image }) { 7 | const table = doc.table({ 8 | widths: [null, null], 9 | borderHorizontalWidths: function (i) { 10 | return i < 2 ? 1 : 0.1; 11 | }, 12 | padding: 5, 13 | }); 14 | 15 | function addRow(index) { 16 | const tr = table.row(); 17 | tr.cell(index.toString()); 18 | 19 | tr.cell() 20 | .text() 21 | .add("A:") 22 | .br() 23 | .add("B:") 24 | .br() 25 | .add("C:") 26 | .br() 27 | .add("D:") 28 | .br() 29 | .add("E:") 30 | .br() 31 | .add("F:"); 32 | } 33 | 34 | for (let i = 1; i < 11; ++i) { 35 | addRow(i); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /test/pdfs/table/header3.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.long); 3 | 4 | const table = doc.table({ 5 | widths: [200, 200], 6 | borderWidth: 1, 7 | }); 8 | 9 | const header = table.header(); 10 | header.cell("Header Left", { textAlign: "center", padding: 30 }); 11 | header.cell("Header Right", { textAlign: "center", padding: 30 }); 12 | 13 | const row1 = table.row(); 14 | 15 | row1.cell(lorem.short, { 16 | fontSize: 11, 17 | padding: 10, 18 | backgroundColor: 0xdddddd, 19 | }); 20 | row1.cell("Cell 2", { fontSize: 11, padding: 10, backgroundColor: 0xeeeeee }); 21 | 22 | const row2 = table.row(); 23 | 24 | row2.cell(lorem.short, { 25 | fontSize: 16, 26 | padding: 10, 27 | backgroundColor: 0xdddddd, 28 | }); 29 | row2.cell("Cell 2", { fontSize: 11, padding: 10, backgroundColor: 0xeeeeee }); 30 | 31 | doc.text("Foo"); 32 | }; 33 | -------------------------------------------------------------------------------- /test/pdfs/table/header4.js: -------------------------------------------------------------------------------- 1 | module.exports = function (doc, { lorem }) { 2 | doc.text(lorem.long); 3 | 4 | const table = doc.table({ 5 | widths: [200, 200], 6 | borderWidth: 1, 7 | }); 8 | 9 | const header = table.header(); 10 | header.cell("Header Left", { textAlign: "center", padding: 30 }); 11 | header.cell("Header Right", { textAlign: "center", padding: 30 }); 12 | 13 | const row1 = table.row(); 14 | 15 | row1.cell(lorem.short, { 16 | fontSize: 15, 17 | padding: 10, 18 | backgroundColor: 0xdddddd, 19 | }); 20 | row1.cell("Cell 2", { fontSize: 11, padding: 10, backgroundColor: 0xeeeeee }); 21 | 22 | const row2 = table.row(); 23 | 24 | row2.cell(lorem.short, { 25 | fontSize: 15, 26 | padding: 10, 27 | backgroundColor: 0xdddddd, 28 | }); 29 | row2.cell("Cell 2", { fontSize: 11, padding: 10, backgroundColor: 0xeeeeee }); 30 | 31 | doc.text("Foo"); 32 | }; 33 | -------------------------------------------------------------------------------- /lib/font/base.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | class Font { 4 | static isFont(font) { 5 | return ( 6 | font && 7 | (font instanceof Font || 8 | (typeof font === "object" && 9 | typeof font.encode === "function" && 10 | typeof font.stringWidth === "function" && 11 | typeof font.lineHeight === "function" && 12 | typeof font.ascent === "function" && 13 | typeof font.descent === "function" && 14 | typeof font.underlinePosition === "function" && 15 | typeof font.underlineThickness === "function" && 16 | typeof font.write === "function")) 17 | ); 18 | } 19 | } 20 | 21 | class StringWidth { 22 | constructor(width, kerning) { 23 | this.width = width; 24 | this.kerning = kerning; 25 | } 26 | 27 | valueOf() { 28 | return this.width; 29 | } 30 | } 31 | 32 | Font.StringWidth = StringWidth; 33 | module.exports = Font; 34 | -------------------------------------------------------------------------------- /font/afm/MustRead.html: -------------------------------------------------------------------------------- 1 |
| This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. Col |