mirror of
https://github.com/frappe/books.git
synced 2024-12-25 20:11:15 +00:00
-Use puppeteer core for smaller app size
This commit is contained in:
parent
4cbb99ed2d
commit
d352e39082
@ -51,9 +51,9 @@
|
||||
"octicons": "^7.2.0",
|
||||
"passport": "^0.4.0",
|
||||
"passport-jwt": "^4.0.0",
|
||||
"puppeteer": "^1.2.0",
|
||||
"puppeteer-core": "^1.19.0",
|
||||
"sass-loader": "^7.0.3",
|
||||
"sharp": "^0.22.1",
|
||||
"sharp": "^0.23.0",
|
||||
"showdown": "^1.8.6",
|
||||
"socket.io": "^2.0.4",
|
||||
"sqlite3": "^4.0.9",
|
||||
|
126
server/pdf.js
126
server/pdf.js
@ -1,5 +1,5 @@
|
||||
const frappe = require('frappejs');
|
||||
const puppeteer = require('puppeteer');
|
||||
const puppeteer = require('puppeteer-core');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { getTmpDir } = require('frappejs/server/utils');
|
||||
@ -7,87 +7,97 @@ const { getHTML } = require('frappejs/common/print');
|
||||
const { getRandomString } = require('frappejs/utils');
|
||||
|
||||
async function makePDF(html, filepath) {
|
||||
const browser = await puppeteer.launch();
|
||||
const page = await browser.newPage();
|
||||
await page.setContent(html);
|
||||
await page.addStyleTag({
|
||||
url: 'https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css'
|
||||
})
|
||||
await page.pdf({
|
||||
path: filepath,
|
||||
format: 'A4'
|
||||
});
|
||||
await browser.close();
|
||||
const browser = await puppeteer.launch();
|
||||
const page = await browser.newPage();
|
||||
await page.setContent(html);
|
||||
await page.addStyleTag({
|
||||
url:
|
||||
'https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css'
|
||||
});
|
||||
await page.pdf({
|
||||
path: filepath,
|
||||
format: 'A4'
|
||||
});
|
||||
await browser.close();
|
||||
}
|
||||
|
||||
async function getPDFForElectron(doctype, name, destination, htmlContent) {
|
||||
const { remote, shell } = require('electron');
|
||||
const { BrowserWindow } = remote;
|
||||
const html = htmlContent || await getHTML(doctype, name);
|
||||
const filepath = path.join(destination, name + '.pdf');
|
||||
const { remote, shell } = require('electron');
|
||||
const { BrowserWindow } = remote;
|
||||
const html = htmlContent || (await getHTML(doctype, name));
|
||||
const filepath = path.join(destination, name + '.pdf');
|
||||
|
||||
const fs = require('fs')
|
||||
let printWindow = new BrowserWindow({
|
||||
width: 600,
|
||||
height: 800,
|
||||
show: false
|
||||
})
|
||||
printWindow.loadURL(`file://${path.join(__static, 'print.html')}`);
|
||||
const fs = require('fs');
|
||||
let printWindow = new BrowserWindow({
|
||||
width: 600,
|
||||
height: 800,
|
||||
show: false
|
||||
});
|
||||
printWindow.loadURL(`file://${path.join(__static, 'print.html')}`);
|
||||
|
||||
printWindow.on('closed', () => {
|
||||
printWindow = null;
|
||||
});
|
||||
printWindow.on('closed', () => {
|
||||
printWindow = null;
|
||||
});
|
||||
|
||||
const code = `
|
||||
const code = `
|
||||
document.body.innerHTML = \`${html}\`;
|
||||
`;
|
||||
|
||||
printWindow.webContents.executeJavaScript(code);
|
||||
printWindow.webContents.executeJavaScript(code);
|
||||
|
||||
const printPromise = new Promise(resolve => {
|
||||
printWindow.webContents.on('did-finish-load', () => {
|
||||
printWindow.webContents.printToPDF({
|
||||
const printPromise = new Promise(resolve => {
|
||||
printWindow.webContents.on('did-finish-load', () => {
|
||||
printWindow.webContents.printToPDF(
|
||||
{
|
||||
marginsType: 1, // no margin
|
||||
pageSize: 'A4',
|
||||
printBackground: true
|
||||
}, (error, data) => {
|
||||
if (error) throw error
|
||||
},
|
||||
(error, data) => {
|
||||
if (error) throw error;
|
||||
printWindow.close();
|
||||
fs.writeFile(filepath, data, (error) => {
|
||||
if (error) throw error
|
||||
fs.writeFile(filepath, data, error => {
|
||||
if (error) throw error;
|
||||
resolve(shell.openItem(filepath));
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
await printPromise;
|
||||
// await makePDF(html, filepath);
|
||||
await printPromise;
|
||||
// await makePDF(html, filepath);
|
||||
}
|
||||
|
||||
function setupExpressRoute() {
|
||||
if (!frappe.app) return;
|
||||
frappe.app.post('/api/method/pdf', frappe.asyncHandler(handlePDFRequest));
|
||||
if (!frappe.app) return;
|
||||
frappe.app.post('/api/method/pdf', frappe.asyncHandler(handlePDFRequest));
|
||||
}
|
||||
|
||||
async function handlePDFRequest(req, res) {
|
||||
const args = req.body;
|
||||
const { doctype, name } = args;
|
||||
const html = await getHTML(doctype, name);
|
||||
const args = req.body;
|
||||
const { doctype, name } = args;
|
||||
const html = await getHTML(doctype, name);
|
||||
|
||||
const filepath = path.join(getTmpDir(), `frappe-pdf-${getRandomString()}.pdf`);
|
||||
await makePDF(html, filepath);
|
||||
const filepath = path.join(
|
||||
getTmpDir(),
|
||||
`frappe-pdf-${getRandomString()}.pdf`
|
||||
);
|
||||
await makePDF(html, filepath);
|
||||
|
||||
const file = fs.createReadStream(filepath);
|
||||
const stat = fs.statSync(filepath);
|
||||
res.setHeader('Content-Length', stat.size);
|
||||
res.setHeader('Content-Type', 'application/pdf');
|
||||
res.setHeader('Content-Disposition', `attachment; filename=${path.basename(filepath)}`);
|
||||
file.pipe(res);
|
||||
const file = fs.createReadStream(filepath);
|
||||
const stat = fs.statSync(filepath);
|
||||
res.setHeader('Content-Length', stat.size);
|
||||
res.setHeader('Content-Type', 'application/pdf');
|
||||
res.setHeader(
|
||||
'Content-Disposition',
|
||||
`attachment; filename=${path.basename(filepath)}`
|
||||
);
|
||||
file.pipe(res);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
makePDF,
|
||||
setupExpressRoute,
|
||||
getPDFForElectron
|
||||
}
|
||||
makePDF,
|
||||
setupExpressRoute,
|
||||
getPDFForElectron
|
||||
};
|
||||
|
@ -73,7 +73,7 @@ export default {
|
||||
this.doc.set('name', '');
|
||||
}
|
||||
|
||||
if (this.defaults) {
|
||||
if (this.doc.isNew() && this.defaults) {
|
||||
for (let fieldname in this.defaults) {
|
||||
const value = this.defaults[fieldname];
|
||||
await this.doc.set(fieldname, value);
|
||||
@ -123,13 +123,23 @@ export default {
|
||||
},
|
||||
|
||||
async submit() {
|
||||
this.doc.set('submitted', 1);
|
||||
await this.save();
|
||||
await this.doc.set('submitted', 1);
|
||||
try {
|
||||
await this.save();
|
||||
} catch (e) {
|
||||
await this.doc.set('submitted', 0);
|
||||
await this.doc.set('_dirty', false);
|
||||
}
|
||||
},
|
||||
|
||||
async revert() {
|
||||
this.doc.set('submitted', 0);
|
||||
await this.save();
|
||||
await this.doc.set('submitted', 0);
|
||||
try {
|
||||
await this.save();
|
||||
} catch (e) {
|
||||
await this.doc.set('submitted', 1);
|
||||
await this.doc.set('_dirty', false);
|
||||
}
|
||||
},
|
||||
|
||||
print() {
|
||||
|
@ -75,6 +75,19 @@ export default {
|
||||
: true;
|
||||
|
||||
this.disableSave = this.doc.isNew() ? false : !this.isDirty;
|
||||
},
|
||||
getFormTitle() {
|
||||
const _ = this._;
|
||||
|
||||
try {
|
||||
return _(
|
||||
this.meta.getFormTitle(this.doc) ||
|
||||
this.meta.label ||
|
||||
this.doc.doctype
|
||||
);
|
||||
} catch (e) {
|
||||
return _(this.meta.label || this.doc.doctype);
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -85,7 +98,7 @@ export default {
|
||||
const _ = this._;
|
||||
|
||||
if (this.doc.isNew()) {
|
||||
return _('New {0}', _(this.meta.label || this.doc.doctype));
|
||||
return _('New {0}', this.getFormTitle());
|
||||
}
|
||||
|
||||
const titleField = this.meta.titleField || 'name';
|
||||
|
@ -14,7 +14,7 @@
|
||||
:docfield="getDocField(fieldname)"
|
||||
:value="$data[fieldname]"
|
||||
:doc="doc"
|
||||
:autofocus="doc.isNew() && (i === currentSection || i === 0) && j === 0 && k === 0"
|
||||
:autofocus="doc.isNew() && (i === currentSection || i === 0) && j === 0 && k === 0 && !$data[fieldname]"
|
||||
@change="value => updateDoc(fieldname, value)"
|
||||
/>
|
||||
</div>
|
||||
|
@ -1,6 +1,11 @@
|
||||
<script>
|
||||
import Float from './Float';
|
||||
export default {
|
||||
extends: Float
|
||||
}
|
||||
extends: Float,
|
||||
methods: {
|
||||
parse(value) {
|
||||
return frappe.format(value, 'Currency');
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
Loading…
Reference in New Issue
Block a user