html-to-pdf-converter
Version:
HTML to PDF converter with support for HEADERS, FOOTERS and page numbers
134 lines • 6.69 kB
JavaScript
;
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