ConvertDocX.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. const fs = require('fs-extra');
  2. const path = require('path');
  3. const ConvertBase = require('./ConvertBase');
  4. class ConvertDocX extends ConvertBase {
  5. async check(data, opts) {
  6. const {inputFiles} = opts;
  7. if (this.config.useExternalBookConverter &&
  8. inputFiles.sourceFileType && inputFiles.sourceFileType.ext == 'zip') {
  9. //ищем файл '[Content_Types].xml'
  10. for (const file of inputFiles.files) {
  11. if (file.path == '[Content_Types].xml') {
  12. const contentTypes = await fs.readFile(`${inputFiles.filesDir}/${file.path}`, 'utf8');
  13. return contentTypes.indexOf('/word/document.xml') >= 0;
  14. }
  15. }
  16. }
  17. return false;
  18. }
  19. async convert(docxFile, fb2File, callback, abort) {
  20. let perc = 0;
  21. await this.execConverter(this.calibrePath, [docxFile, fb2File, '-vv'], () => {
  22. perc = (perc < 100 ? perc + 1 : 50);
  23. callback(perc);
  24. }, abort);
  25. return await fs.readFile(fb2File);
  26. }
  27. async run(data, opts) {
  28. if (!(await this.check(data, opts)))
  29. return false;
  30. await this.checkExternalConverterPresent();
  31. const {inputFiles, callback, abort} = opts;
  32. const outFile = `${inputFiles.filesDir}/${path.basename(inputFiles.sourceFile)}`;
  33. const docxFile = `${outFile}.docx`;
  34. const fb2File = `${outFile}.fb2`;
  35. await fs.copy(inputFiles.sourceFile, docxFile);
  36. return await this.convert(docxFile, fb2File, callback, abort);
  37. }
  38. }
  39. module.exports = ConvertDocX;