12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /**
- * ГЕНЕРИРОВАНИЕ СЕРТИФИКАТА О ПУБЛИКАЦИИ
- * Copyright © 2021, А.М.Гольдин. ISC license
- */
- "use strict";
- const PDFDocument = require("pdfkit");
- const colors = ["black", "#080", "#e30313"];
- // otvet - это объект ответа (передается скриптом server.js)
- // id - это id статьи (строка)
- // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
- // Отдает pdf-файл сертификата в браузер клиента
- module.exports = async (otvet, id, user) => {
- let err = 0,
- MON = [
- '', "января", "февраля", "марта", "апреля", "мая", "июня",
- "июля", "августа", "сентября", "октября", "ноября", "декабря"
- ]
- errLabel: {
- id = id.toLowerCase();
- // Забираем из базы запрашиваемую статью и проверяем, опубликована ли она,
- // а также является ли юзер ее автором или одним из соавторов
- let res = await dbFind("articles", {_id: id});
- if (!res.length) {err = 1; break errLabel;}
- if (res[0].status < 7) {err = 1; break errLabel;}
- let author;
- if (res[0].us == user[1]) author = res[0].author;
- else if (res[0].coauth[user[1]]) author = res[0].coauth[user[1]][0];
- else {err = 1; break errLabel;}
- author = author.replace(/^(\S+) (\S+) (\S+)$/, "$2 $3 $1");
-
- let dtArr = res[0].dt2.split('.'),
- dtPubl = `${Number(dtArr[0])} ${MON[Number(dtArr[1])]} `
- + `${dtArr[2]} года`,
- title = res[0].head.toUpperCase();
- // left, top, font-size, text-align (0=center, 1=left),
- // letter-spacing, color (0=black, 1=green, 2=red), text
- let content = [
- [ 0, 180, 11, 0, 0.7, 1, "АРХИВ ПУБЛИКАЦИЙ ОБУЧАЮЩИХСЯ И СОТРУДНИКОВ"],
- [ 0, 198, 9, 0, 0.5, 1, "СПЕЦИАЛИЗИРОВАННОГО УЧЕБНО-НАУЧНОГО ЦЕНТРА"],
- [ 0, 210, 9, 0, 0.5, 1, "УРАЛЬСКОГО ФЕДЕРАЛЬНОГО УНИВЕРСИТЕТА"],
- [ 0, 225, 8, 0, 0, 0, "Обновляемое электронное издание "
- + "сетевого распространения"],
- [ 0, 235, 8, 0, 0, 0, "Не является средством массовой информации"],
- [ 0, 265, 32, 0, 2, 2, "СЕРТИФИКАТ"],
- [ 0, 310, 14, 0, 0, 2, "о публикации статьи"],
- [ 0, 360, 10, 0, 0.5, 1, "ОБЛАДАТЕЛЬ СЕРТИФИКАТА"],
- [ 0, 375, 14, 0, 0, 0, author],
- [ 0, 420, 10, 0, 0.5, 1, "СТАТЬЯ"],
- [ 0, 437, 12, 0, 0.5, 0, title],
- [ 0, 533, 10, 0, 0.5, 1, "АДРЕС В АРХИВЕ"],
- [ 0, 550, 12, 0, 0, 0, "http://lycarch.urfu.ru/pub/" + id],
- [ 0, 610, 11, 1, 0, 0, "Директор СУНЦ УрФУ"],
- [290, 610, 11, 1, 0, 0, global.DIRECTOR],
- [ 0, 655, 11, 1, 0, 0, "Главный редактор"],
- [290, 655, 11, 1, 0, 0, global.GLRED],
- [ 0, 715, 9, 1, 0, 0, "Екатеринбург"],
- [ 0, 728, 9, 1, 0, 0, dtPubl],
- [ 0, 740, 9, 1, 0, 0, "ID " + id.toUpperCase()]
- ];
- const doc = new PDFDocument({
- size: "A4", margin: 24, info: {Title: "Certificate"}
- });
- otvet.writeHead(200, {
- "Content-Type": "application/pdf",
- "Content-Disposition": "inline; filename=certificate.pdf"
- });
- doc.pipe(otvet);
- try {
- doc.font(__dirname + "/../www/fonts/ptsans.otf");
- doc.image(__dirname + "/sert_blank.jpg", 24, 24, {width: 547});
- for (let el of content) {
- let align = el[3] ? "left" : "center";
- let opt = {width: 403, align: align, characterSpacing: el[4]};
- doc.fontSize(el[2]);
- doc.fillColor(colors[el[5]]);
- doc.text(el[6], 96 + el[0], el[1], opt);
- }
- }
- catch(e) {;}
- doc.end();
- } // end of errLabel block
- if (err) {
- otvet.writeHead(423, {"Content-Type": "text/html"});
- otvet.end(
- "<h1>423 Locked</h1><hr><address>Server lycArch.urfu.ru</address>"
- );
- }
- };
|