Browse Source

Сделал конвертер для DocX

Book Pauk 6 years ago
parent
commit
a5fe61078d

+ 15 - 0
server/core/BookConverter/ConvertBase.js

@@ -1,7 +1,9 @@
 const fs = require('fs-extra');
 const fs = require('fs-extra');
 const iconv = require('iconv-lite');
 const iconv = require('iconv-lite');
 const chardet = require('chardet');
 const chardet = require('chardet');
+
 const textUtils = require('./textUtils');
 const textUtils = require('./textUtils');
+const utils = require('../utils');
 
 
 class ConvertBase {
 class ConvertBase {
     constructor(config) {
     constructor(config) {
@@ -27,6 +29,19 @@ class ConvertBase {
             throw new Error('Внешний конвертер pdftohtml не найден');
             throw new Error('Внешний конвертер pdftohtml не найден');
     }
     }
 
 
+    async execConverter(path, args, onData) {
+        try {
+            const result = await utils.spawnProcess(path, {args, onData});
+            if (result.code != 0)
+                throw new Error(`Внешний конвертер завершился с ошибкой: ${result.code}`);
+        } catch(e) {
+            if (e.status == 'killed')
+                throw new Error('Слишком долгое ожидание конвертера');
+            else
+                throw new Error(e.error);
+        }
+    }
+
     decode(data) {
     decode(data) {
         let selected = textUtils.getEncoding(data);
         let selected = textUtils.getEncoding(data);
 
 

+ 17 - 2
server/core/BookConverter/ConvertDocX.js

@@ -1,3 +1,6 @@
+const fs = require('fs-extra');
+const path = require('path');
+
 const ConvertBase = require('./ConvertBase');
 const ConvertBase = require('./ConvertBase');
 
 
 class ConvertDocX extends ConvertBase {
 class ConvertDocX extends ConvertBase {
@@ -22,9 +25,21 @@ class ConvertDocX extends ConvertBase {
             return false;
             return false;
         await this.checkExternalConverterPresent();
         await this.checkExternalConverterPresent();
 
 
-        
+        const {inputFiles, callback} = opts;
 
 
-        return false;
+        const outFile = `${inputFiles.fileListDir}/${path.basename(inputFiles.sourceFile)}`;
+        const docxFile = `${outFile}.docx`;
+        const fb2File = `${outFile}.fb2`;
+
+        await fs.copy(inputFiles.sourceFile, docxFile);
+
+        let perc = 0;
+        await this.execConverter(this.calibrePath, [docxFile, fb2File], () => {
+            perc = (perc < 100 ? perc + 5 : 50);
+            callback(perc);
+        });
+
+        return await fs.readFile(fb2File);
     }
     }
 }
 }