sertGen.js 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /**
  2. * ГЕНЕРИРОВАНИЕ СЕРТИФИКАТА О ПУБЛИКАЦИИ
  3. * Copyright © 2021, А.М.Гольдин. ISC license
  4. */
  5. "use strict";
  6. const PDFDocument = require("pdfkit");
  7. const colors = ["black", "#080", "#e30313"];
  8. // otvet - это объект ответа (передается скриптом server.js)
  9. // id - это id статьи (строка)
  10. // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
  11. // Отдает pdf-файл сертификата в браузер клиента
  12. module.exports = async (otvet, id, user) => {
  13. let err = 0,
  14. MON = [
  15. '', "января", "февраля", "марта", "апреля", "мая", "июня",
  16. "июля", "августа", "сентября", "октября", "ноября", "декабря"
  17. ]
  18. errLabel: {
  19. id = id.toLowerCase();
  20. // Забираем из базы запрашиваемую статью и проверяем, опубликована ли она,
  21. // а также является ли юзер ее автором или одним из соавторов
  22. let res = await dbFind("articles", {_id: id});
  23. if (!res.length) {err = 1; break errLabel;}
  24. if (res[0].status < 7) {err = 1; break errLabel;}
  25. let author;
  26. if (res[0].us == user[1]) author = res[0].author;
  27. else if (res[0].coauth[user[1]]) author = res[0].coauth[user[1]][0];
  28. else {err = 1; break errLabel;}
  29. author = author.replace(/^(\S+) (\S+) (\S+)$/, "$2 $3 $1");
  30. let dtArr = res[0].dt2.split('.'),
  31. dtPubl = `${Number(dtArr[0])} ${MON[Number(dtArr[1])]} `
  32. + `${dtArr[2]} года`,
  33. title = res[0].head.toUpperCase();
  34. // left, top, font-size, text-align (0=center, 1=left),
  35. // letter-spacing, color (0=black, 1=green, 2=red), text
  36. let content = [
  37. [ 0, 180, 11, 0, 0.7, 1, "АРХИВ ПУБЛИКАЦИЙ ОБУЧАЮЩИХСЯ И СОТРУДНИКОВ"],
  38. [ 0, 198, 9, 0, 0.5, 1, "СПЕЦИАЛИЗИРОВАННОГО УЧЕБНО-НАУЧНОГО ЦЕНТРА"],
  39. [ 0, 210, 9, 0, 0.5, 1, "УРАЛЬСКОГО ФЕДЕРАЛЬНОГО УНИВЕРСИТЕТА"],
  40. [ 0, 225, 8, 0, 0, 0, "Обновляемое электронное издание "
  41. + "сетевого распространения"],
  42. [ 0, 235, 8, 0, 0, 0, "Не является средством массовой информации"],
  43. [ 0, 265, 32, 0, 2, 2, "СЕРТИФИКАТ"],
  44. [ 0, 310, 14, 0, 0, 2, "о публикации статьи"],
  45. [ 0, 360, 10, 0, 0.5, 1, "ОБЛАДАТЕЛЬ СЕРТИФИКАТА"],
  46. [ 0, 375, 14, 0, 0, 0, author],
  47. [ 0, 420, 10, 0, 0.5, 1, "СТАТЬЯ"],
  48. [ 0, 437, 12, 0, 0.5, 0, title],
  49. [ 0, 533, 10, 0, 0.5, 1, "АДРЕС В АРХИВЕ"],
  50. [ 0, 550, 12, 0, 0, 0, "http://lycarch.urfu.ru/pub/" + id],
  51. [ 0, 610, 11, 1, 0, 0, "Директор СУНЦ УрФУ"],
  52. [290, 610, 11, 1, 0, 0, global.DIRECTOR],
  53. [ 0, 655, 11, 1, 0, 0, "Главный редактор"],
  54. [290, 655, 11, 1, 0, 0, global.GLRED],
  55. [ 0, 715, 9, 1, 0, 0, "Екатеринбург"],
  56. [ 0, 728, 9, 1, 0, 0, dtPubl],
  57. [ 0, 740, 9, 1, 0, 0, "ID " + id.toUpperCase()]
  58. ];
  59. const doc = new PDFDocument({
  60. size: "A4", margin: 24, info: {Title: "Certificate"}
  61. });
  62. otvet.writeHead(200, {
  63. "Content-Type": "application/pdf",
  64. "Content-Disposition": "inline; filename=certificate.pdf"
  65. });
  66. doc.pipe(otvet);
  67. try {
  68. doc.font(__dirname + "/../www/fonts/ptsans.otf");
  69. doc.image(__dirname + "/sert_blank.jpg", 24, 24, {width: 547});
  70. for (let el of content) {
  71. let align = el[3] ? "left" : "center";
  72. let opt = {width: 403, align: align, characterSpacing: el[4]};
  73. doc.fontSize(el[2]);
  74. doc.fillColor(colors[el[5]]);
  75. doc.text(el[6], 96 + el[0], el[1], opt);
  76. }
  77. }
  78. catch(e) {;}
  79. doc.end();
  80. } // end of errLabel block
  81. if (err) {
  82. otvet.writeHead(423, {"Content-Type": "text/html"});
  83. otvet.end(
  84. "<h1>423 Locked</h1><hr><address>Server lycArch.urfu.ru</address>"
  85. );
  86. }
  87. };