UNPKG

html-to-pdf-converter

Version:

HTML to PDF converter with support for HEADERS, FOOTERS and page numbers

134 lines 6.69 kB
"use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; return t; }; Object.defineProperty(exports, "__esModule", { value: true }); const ramda_1 = require("ramda"); const hummus_1 = require("hummus"); const read_stream_for_buffer_1 = require("./read-stream-for-buffer"); const pdf_stream_for_buffer_1 = require("./pdf-stream-for-buffer"); const types_1 = require("./types"); exports.addFooter = (args) => { const { pdfBuffer, margin, txt, startPageNum, endPageNum, totalPagesCount } = args; const pdfReader = hummus_1.createReader(new read_stream_for_buffer_1.ReadStreamForBuffer(pdfBuffer)); const outputBuffer = new pdf_stream_for_buffer_1.PDFStreamForBuffer(); const pdfWriter = hummus_1.createWriterToModify(new read_stream_for_buffer_1.ReadStreamForBuffer(pdfBuffer), outputBuffer); const writeTextArguments = []; if (txt.left) { const { fontPath, text, size, underline, color } = txt.left; const font = pdfWriter.getFontForFile(fontPath); writeTextArguments.push(() => { const x = margin.left.toPdfPoints(); const y = margin.bottom.toPdfPoints(); return { text, x, y, txtOpts: { font, size: size.toPdfPoints(), underline: !!underline, color }, }; }); } if (txt.right) { const { fontPath, text, size, underline, color } = txt.right; const font = pdfWriter.getFontForFile(fontPath); writeTextArguments.push(({ pageNumber, pagesCount, width }) => { const txt = text.replace('{page}', `${pageNumber}`).replace('{pages}', `${pagesCount}`); const textDimensions = font.calculateTextDimensions(txt, size.toPdfPoints()._n); const x = width.subtract(types_1.PdfPoints.of(textDimensions.width + 5).add(margin.right.toPdfPoints())); const y = margin.bottom.toPdfPoints(); return { text: txt, x, y, txtOpts: { font, size: size.toPdfPoints(), underline: !!underline, color }, }; }); } const editPage = (cxt, pageInfo) => { const { cm, q, writeText, Q } = cxt; cm.apply(cxt, [1, 0, 0, -1, 0, pageInfo.height._n]); q.apply(cxt); writeTextArguments.forEach(getArguments => { const _a = getArguments(pageInfo), { txtOpts } = _a, args = __rest(_a, ["txtOpts"]); const { font, size, underline, color } = txtOpts; const options = { font, size: size._n, underline, color }; writeText.apply(cxt, [args.text, args.x._n, args.y._n, options]); }); Q.apply(cxt); }; const [, , width, height] = pdfReader.parsePage(0).getMediaBox(); ramda_1.range(0, endPageNum - startPageNum).forEach(pageIndex => { const pageModifier = new hummus_1.PDFPageModifier(pdfWriter, pageIndex); const cxt = pageModifier.startContext().getContext(); editPage(cxt, { width: types_1.PdfPoints.of(width), height: types_1.PdfPoints.of(height), pageNumber: startPageNum + pageIndex, pagesCount: totalPagesCount, }); pageModifier.endContext().writePage(); }); pdfWriter.end(); return outputBuffer.getBuffer(); }; exports.mergePdfs = (target, source, margin, type, slotSize) => { const targetReader = hummus_1.createReader(new read_stream_for_buffer_1.ReadStreamForBuffer(target)); const targetFirstPage = targetReader.parsePage(0); const targetMediaBox = targetFirstPage.getMediaBox(); const targetPagesCount = targetReader.getPagesCount(); const sourceReader = hummus_1.createReader(new read_stream_for_buffer_1.ReadStreamForBuffer(source)); const sourcePagesCount = sourceReader.getPagesCount(); if (sourcePagesCount < targetPagesCount) { throw new Error('Source pages count can not be smaller than target pages count!'); } const outputBuffer = new pdf_stream_for_buffer_1.PDFStreamForBuffer(); const pdfWriter = hummus_1.createWriter(outputBuffer); const targetCopyCxt = pdfWriter.createPDFCopyingContext(new read_stream_for_buffer_1.ReadStreamForBuffer(target)); const sourceCopyCxt = pdfWriter.createPDFCopyingContext(new read_stream_for_buffer_1.ReadStreamForBuffer(source)); const left = margin.left.toPdfPoints(); const yPos = type === 'footer' ? types_1.PdfPoints.of(targetMediaBox[3]).subtract(margin.bottom.toPdfPoints()) : slotSize.height.toPdfPoints().add(margin.top.toPdfPoints()); ramda_1.range(0, targetPagesCount).forEach(pageIndex => { const page = pdfWriter.createPage.apply(pdfWriter, targetMediaBox); targetCopyCxt.mergePDFPageToPage(page, pageIndex); const formObjectId = sourceCopyCxt.createFormXObjectFromPDFPage(pageIndex, hummus_1.ePDFPageBoxMediaBox); pdfWriter .startPageContentContext(page) .q() .cm(1, 0, 0, -1, left._n, yPos._n) .doXObject(page.getResourcesDictionary().addFormXObjectMapping(formObjectId)) .Q(); pdfWriter.writePage(page); }); pdfWriter.end(); return outputBuffer.getBuffer(); }; exports.appendPageToPdf = (target, source, sourcePageIndex) => { const outputBuffer = new pdf_stream_for_buffer_1.PDFStreamForBuffer(); const pdfWriter = hummus_1.createWriterToModify(new read_stream_for_buffer_1.ReadStreamForBuffer(target), outputBuffer); const cpyCxt = pdfWriter.createPDFCopyingContext(new read_stream_for_buffer_1.ReadStreamForBuffer(source)); cpyCxt.appendPDFPageFromPDF(sourcePageIndex); pdfWriter.end(); return outputBuffer.getBuffer(); }; exports.appendPdfs = (sources) => { const outputBuffer = new pdf_stream_for_buffer_1.PDFStreamForBuffer(); const pdfWriter = hummus_1.createWriter(outputBuffer); sources .map(source => new read_stream_for_buffer_1.ReadStreamForBuffer(source)) .forEach(source => pdfWriter.appendPDFPagesFromPDF(source)); pdfWriter.end(); return outputBuffer.getBuffer(); }; exports.getPagesCount = (pdfBuffer) => { const pdfReader = hummus_1.createReader(new read_stream_for_buffer_1.ReadStreamForBuffer(pdfBuffer)); return pdfReader.getPagesCount(); }; //# sourceMappingURL=hummus.js.map