ConvertPdfImages.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const fs = require('fs-extra');
  2. const path = require('path');
  3. const utils = require('../../utils');
  4. const ConvertJpegPng = require('./ConvertJpegPng');
  5. class ConvertPdfImages extends ConvertJpegPng {
  6. check(data, opts) {
  7. const {inputFiles} = opts;
  8. return this.config.useExternalBookConverter &&
  9. inputFiles.sourceFileType && inputFiles.sourceFileType.ext == 'pdf';
  10. }
  11. async run(data, opts) {
  12. if (!this.check(data, opts))
  13. return false;
  14. let {inputFiles, callback, abort, pdfQuality} = opts;
  15. pdfQuality = (pdfQuality && pdfQuality <= 100 && pdfQuality >= 10 ? pdfQuality : 20);
  16. const pdftoppmPath = '/usr/bin/pdftoppm';
  17. if (!await fs.pathExists(pdftoppmPath))
  18. throw new Error('Внешний конвертер pdftoppm не найден');
  19. const dir = `${inputFiles.filesDir}/`;
  20. const baseFile = `${dir}${path.basename(inputFiles.sourceFile)}`;
  21. const jpgFiles = `${baseFile}.tmp`;
  22. //конвертируем в jpeg
  23. let perc = 0;
  24. await this.execConverter(pdftoppmPath, ['-jpeg', '-jpegopt', `quality=${pdfQuality},progressive=y`, inputFiles.sourceFile, jpgFiles], () => {
  25. perc = (perc < 100 ? perc + 1 : 40);
  26. callback(perc);
  27. }, abort);
  28. const limitSize = 2*this.config.maxUploadFileSize;
  29. let jpgFilesSize = 0;
  30. //ищем изображения
  31. let files = [];
  32. await utils.findFiles(async(file) => {
  33. if (path.extname(file) == '.jpg') {
  34. jpgFilesSize += (await fs.stat(file)).size;
  35. if (jpgFilesSize > limitSize) {
  36. throw new Error(`Файл для конвертирования слишком большой|FORLOG| jpgFilesSize: ${jpgFilesSize} > ${limitSize}`);
  37. }
  38. files.push({name: file, base: path.basename(file)});
  39. }
  40. }, dir);
  41. files.sort((a, b) => a.base.localeCompare(b.base));
  42. //схема документа (outline)
  43. //const djvusedResult = await this.execConverter(djvusedPath, ['-u', '-e', 'print-outline', inputFiles.sourceFile]);
  44. const outline = [];
  45. /*const lines = djvusedResult.stdout.match(/\(".*"\s*?"#\d+".*?\)/g);
  46. if (lines) {
  47. lines.forEach(l => {
  48. const m = l.match(/"(.*)"\s*?"#(\d+)"/);
  49. if (m) {
  50. outline[m[2]] = m[1];
  51. }
  52. });
  53. }*/
  54. await utils.sleep(100);
  55. let i = 0;
  56. const imageFiles = files.map(f => {
  57. i++;
  58. let alt = (outline[i] ? outline[i] : '');
  59. return {src: f.name, alt};
  60. });
  61. return await super.run(data, Object.assign({}, opts, {imageFiles}));
  62. }
  63. }
  64. module.exports = ConvertPdfImages;