|
@@ -50,7 +50,9 @@ class ConvertPdf extends ConvertHtml {
|
|
let lines = [];
|
|
let lines = [];
|
|
let pagelines = [];
|
|
let pagelines = [];
|
|
let line = {text: ''};
|
|
let line = {text: ''};
|
|
|
|
+ let page = {};
|
|
let fonts = {};
|
|
let fonts = {};
|
|
|
|
+ let sectionTitleFound = false;
|
|
|
|
|
|
let images = [];
|
|
let images = [];
|
|
let loading = [];
|
|
let loading = [];
|
|
@@ -95,11 +97,26 @@ class ConvertPdf extends ConvertHtml {
|
|
//добавим закрывающий тег стиля
|
|
//добавим закрывающий тег стиля
|
|
line.text += line.tClose;
|
|
line.text += line.tClose;
|
|
|
|
|
|
|
|
+ //проверим, возможно это заголовок
|
|
|
|
+ if (line.fonts.length == 1 && line.pageWidth) {
|
|
|
|
+ const f = fonts[line.fonts[0]];
|
|
|
|
+ const centerLeft = (line.pageWidth - line.width)/2;
|
|
|
|
+ if (f && f.isBold && Math.abs(centerLeft - line.left) < 3) {
|
|
|
|
+ if (!sectionTitleFound) {
|
|
|
|
+ line.isSectionTitle = true;
|
|
|
|
+ sectionTitleFound = true;
|
|
|
|
+ } else {
|
|
|
|
+ line.isSubtitle = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //объедняем
|
|
if (Math.abs(pt - line.top) > 3) {
|
|
if (Math.abs(pt - line.top) > 3) {
|
|
j++;
|
|
j++;
|
|
pl[j] = line;
|
|
pl[j] = line;
|
|
} else {
|
|
} else {
|
|
- pl[j].text += line.text;
|
|
|
|
|
|
+ pl[j].text += ` ${line.text}`;
|
|
}
|
|
}
|
|
pt = line.top;
|
|
pt = line.top;
|
|
});
|
|
});
|
|
@@ -111,6 +128,7 @@ class ConvertPdf extends ConvertHtml {
|
|
lines[i] = line;
|
|
lines[i] = line;
|
|
});
|
|
});
|
|
pagelines = [];
|
|
pagelines = [];
|
|
|
|
+ prevTop = 0;
|
|
};
|
|
};
|
|
|
|
|
|
const onStartNode = (tag, tail, singleTag, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
|
|
const onStartNode = (tag, tail, singleTag, cutCounter, cutTag) => {// eslint-disable-line no-unused-vars
|
|
@@ -122,19 +140,26 @@ class ConvertPdf extends ConvertHtml {
|
|
if (fontId && fontStyle) {
|
|
if (fontId && fontStyle) {
|
|
const styles = fontStyle.split(' ');
|
|
const styles = fontStyle.split(' ');
|
|
const styleTags = {bold: 'b', italics: 'i', superscript: 'sup', subscript: 'sub'};
|
|
const styleTags = {bold: 'b', italics: 'i', superscript: 'sup', subscript: 'sub'};
|
|
- const f = fonts[fontId] = {tOpen: '', tClose: ''};
|
|
|
|
|
|
+ const f = fonts[fontId] = {tOpen: '', tClose: '', isBold: false};
|
|
|
|
|
|
styles.forEach(style => {
|
|
styles.forEach(style => {
|
|
const s = styleTags[style];
|
|
const s = styleTags[style];
|
|
if (s) {
|
|
if (s) {
|
|
f.tOpen += `<${s}>`;
|
|
f.tOpen += `<${s}>`;
|
|
f.tClose = `</${s}>${f.tClose}`;
|
|
f.tClose = `</${s}>${f.tClose}`;
|
|
|
|
+ if (s == 'b')
|
|
|
|
+ f.isBold = true;
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (tag == 'page') {
|
|
if (tag == 'page') {
|
|
|
|
+ const attrs = sax.getAttrsSync(tail);
|
|
|
|
+ page = {
|
|
|
|
+ width: parseInt((attrs.width && attrs.width.value ? attrs.width.value : null), 10),
|
|
|
|
+ };
|
|
|
|
+
|
|
putPageLines();
|
|
putPageLines();
|
|
putImage(100000);
|
|
putImage(100000);
|
|
}
|
|
}
|
|
@@ -149,13 +174,17 @@ class ConvertPdf extends ConvertHtml {
|
|
height: parseInt((attrs.height && attrs.height.value ? attrs.height.value : null), 10),
|
|
height: parseInt((attrs.height && attrs.height.value ? attrs.height.value : null), 10),
|
|
tOpen: '',
|
|
tOpen: '',
|
|
tClose: '',
|
|
tClose: '',
|
|
|
|
+ isSectionTitle: false,
|
|
|
|
+ isSubtitle: false,
|
|
|
|
+ pageWidth: page.width,
|
|
|
|
+ fonts: [],
|
|
};
|
|
};
|
|
|
|
|
|
if (line.width != 0 || line.height != 0) {
|
|
if (line.width != 0 || line.height != 0) {
|
|
if (Math.abs(prevTop - line.top) > 3) {
|
|
if (Math.abs(prevTop - line.top) > 3) {
|
|
putImage(line.top);
|
|
putImage(line.top);
|
|
- pagelines.push(line);
|
|
|
|
}
|
|
}
|
|
|
|
+ pagelines.push(line);
|
|
prevTop = line.top;
|
|
prevTop = line.top;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -170,6 +199,8 @@ class ConvertPdf extends ConvertHtml {
|
|
if (fontId && fonts[fontId]) {
|
|
if (fontId && fonts[fontId]) {
|
|
tOpen = fonts[fontId].tOpen;
|
|
tOpen = fonts[fontId].tOpen;
|
|
tClose = fonts[fontId].tClose;
|
|
tClose = fonts[fontId].tClose;
|
|
|
|
+ if (!line.fonts.length || line.fonts[0] != fontId)
|
|
|
|
+ line.fonts.push(fontId);
|
|
}
|
|
}
|
|
|
|
|
|
if (line.tOpen != tOpen) {
|
|
if (line.tOpen != tOpen) {
|
|
@@ -252,6 +283,7 @@ class ConvertPdf extends ConvertHtml {
|
|
if (!title && uploadFileName)
|
|
if (!title && uploadFileName)
|
|
title = uploadFileName;
|
|
title = uploadFileName;
|
|
|
|
|
|
|
|
+ //console.log(JSON.stringify(lines, null, 2));
|
|
//формируем текст
|
|
//формируем текст
|
|
const limitSize = 2*this.config.maxUploadFileSize;
|
|
const limitSize = 2*this.config.maxUploadFileSize;
|
|
let text = '';
|
|
let text = '';
|
|
@@ -270,6 +302,16 @@ class ConvertPdf extends ConvertHtml {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (line.isSectionTitle) {
|
|
|
|
+ text += `<fb2-section-title>${line.text.trim()}</fb2-section-title>`;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (line.isSubtitle) {
|
|
|
|
+ text += `<br><fb2-subtitle>${line.text.trim()}</fb2-subtitle>`;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (concat == '') {
|
|
if (concat == '') {
|
|
const left = line.left || 0;
|
|
const left = line.left || 0;
|
|
sp = ' '.repeat(indents[left]);
|
|
sp = ' '.repeat(indents[left]);
|
|
@@ -287,6 +329,7 @@ class ConvertPdf extends ConvertHtml {
|
|
if (concat)
|
|
if (concat)
|
|
text += sp + concat + "\n";
|
|
text += sp + concat + "\n";
|
|
|
|
|
|
|
|
+ //console.log(text);
|
|
await utils.sleep(100);
|
|
await utils.sleep(100);
|
|
return await super.run(Buffer.from(text), {skipCheck: true, isText: true});
|
|
return await super.run(Buffer.from(text), {skipCheck: true, isText: true});
|
|
}
|
|
}
|