Merge pull request #14577 from Alchez/dev-granular-printing
feat: allow more print page size options (develop)
This commit is contained in:
commit
17aa4b823b
7 changed files with 139 additions and 58 deletions
|
|
@ -1523,8 +1523,8 @@ def format(*args, **kwargs):
|
|||
import frappe.utils.formatters
|
||||
return frappe.utils.formatters.format_value(*args, **kwargs)
|
||||
|
||||
def get_print(doctype=None, name=None, print_format=None, style=None,
|
||||
html=None, as_pdf=False, doc=None, output=None, no_letterhead=0, password=None):
|
||||
def get_print(doctype=None, name=None, print_format=None, style=None, html=None,
|
||||
as_pdf=False, doc=None, output=None, no_letterhead=0, password=None, pdf_options=None):
|
||||
"""Get Print Format for given document.
|
||||
|
||||
:param doctype: DocType of document.
|
||||
|
|
@ -1543,15 +1543,15 @@ def get_print(doctype=None, name=None, print_format=None, style=None,
|
|||
local.form_dict.doc = doc
|
||||
local.form_dict.no_letterhead = no_letterhead
|
||||
|
||||
options = None
|
||||
pdf_options = pdf_options or {}
|
||||
if password:
|
||||
options = {'password': password}
|
||||
pdf_options['password'] = password
|
||||
|
||||
if not html:
|
||||
html = get_response_content("printview")
|
||||
|
||||
if as_pdf:
|
||||
return get_pdf(html, output = output, options = options)
|
||||
return get_pdf(html, options=pdf_options, output=output)
|
||||
else:
|
||||
return html
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@
|
|||
"repeat_header_footer",
|
||||
"column_break_4",
|
||||
"pdf_page_size",
|
||||
"pdf_page_height",
|
||||
"pdf_page_width",
|
||||
"view_link_in_email",
|
||||
"with_letterhead",
|
||||
"allow_print_for_draft",
|
||||
|
|
@ -56,7 +58,7 @@
|
|||
"fieldname": "pdf_page_size",
|
||||
"fieldtype": "Select",
|
||||
"label": "PDF Page Size",
|
||||
"options": "A4\nLetter"
|
||||
"options": "A0\nA1\nA2\nA3\nA4\nA5\nA6\nA7\nA8\nA9\nB0\nB1\nB2\nB3\nB4\nB5\nB6\nB7\nB8\nB9\nB10\nC5E\nComm10E\nDLE\nExecutive\nFolio\nLedger\nLegal\nLetter\nTabloid\nCustom"
|
||||
},
|
||||
{
|
||||
"fieldname": "view_link_in_email",
|
||||
|
|
@ -156,6 +158,18 @@
|
|||
"fieldname": "font_size",
|
||||
"fieldtype": "Float",
|
||||
"label": "Font Size"
|
||||
},
|
||||
{
|
||||
"depends_on": "eval:doc.pdf_page_size == \"Custom\"",
|
||||
"fieldname": "pdf_page_height",
|
||||
"fieldtype": "Float",
|
||||
"label": "PDF Page Height (in mm)"
|
||||
},
|
||||
{
|
||||
"depends_on": "eval:doc.pdf_page_size == \"Custom\"",
|
||||
"fieldname": "pdf_page_width",
|
||||
"fieldtype": "Float",
|
||||
"label": "PDF Page Width (in mm)"
|
||||
}
|
||||
],
|
||||
"icon": "fa fa-cog",
|
||||
|
|
|
|||
|
|
@ -8,14 +8,23 @@ from frappe.utils import cint
|
|||
|
||||
from frappe.model.document import Document
|
||||
|
||||
|
||||
class PrintSettings(Document):
|
||||
def validate(self):
|
||||
if self.pdf_page_size == "Custom" and not (
|
||||
self.pdf_page_height and self.pdf_page_width
|
||||
):
|
||||
frappe.throw(_("Page height and width cannot be zero"))
|
||||
|
||||
def on_update(self):
|
||||
frappe.clear_cache()
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def is_print_server_enabled():
|
||||
if not hasattr(frappe.local, 'enable_print_server'):
|
||||
frappe.local.enable_print_server = cint(frappe.db.get_single_value('Print Settings',
|
||||
'enable_print_server'))
|
||||
if not hasattr(frappe.local, "enable_print_server"):
|
||||
frappe.local.enable_print_server = cint(
|
||||
frappe.db.get_single_value("Print Settings", "enable_print_server")
|
||||
)
|
||||
|
||||
return frappe.local.enable_print_server
|
||||
|
|
|
|||
|
|
@ -24,51 +24,84 @@ export default class BulkOperations {
|
|||
return;
|
||||
}
|
||||
|
||||
if (valid_docs.length > 0) {
|
||||
const dialog = new frappe.ui.Dialog({
|
||||
title: __('Print Documents'),
|
||||
fields: [
|
||||
{
|
||||
'fieldtype': 'Select',
|
||||
'label': __('Letter Head'),
|
||||
'fieldname': 'letter_sel',
|
||||
'default': __('No Letterhead'),
|
||||
options: this.get_letterhead_options()
|
||||
},
|
||||
{
|
||||
'fieldtype': 'Select',
|
||||
'label': __('Print Format'),
|
||||
'fieldname': 'print_sel',
|
||||
options: frappe.meta.get_print_formats(this.doctype)
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
dialog.set_primary_action(__('Print'), args => {
|
||||
if (!args) return;
|
||||
const default_print_format = frappe.get_meta(this.doctype).default_print_format;
|
||||
const with_letterhead = args.letter_sel == __("No Letterhead") ? 0 : 1;
|
||||
const print_format = args.print_sel ? args.print_sel : default_print_format;
|
||||
const json_string = JSON.stringify(valid_docs);
|
||||
const letterhead = args.letter_sel;
|
||||
const w = window.open('/api/method/frappe.utils.print_format.download_multi_pdf?' +
|
||||
'doctype=' + encodeURIComponent(this.doctype) +
|
||||
'&name=' + encodeURIComponent(json_string) +
|
||||
'&format=' + encodeURIComponent(print_format) +
|
||||
'&no_letterhead=' + (with_letterhead ? '0' : '1') +
|
||||
'&letterhead=' + encodeURIComponent(letterhead)
|
||||
);
|
||||
|
||||
if (!w) {
|
||||
frappe.msgprint(__('Please enable pop-ups'));
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
} else {
|
||||
if (valid_docs.length === 0) {
|
||||
frappe.msgprint(__('Select atleast 1 record for printing'));
|
||||
return;
|
||||
}
|
||||
|
||||
const dialog = new frappe.ui.Dialog({
|
||||
title: __('Print Documents'),
|
||||
fields: [{
|
||||
fieldtype: 'Select',
|
||||
label: __('Letter Head'),
|
||||
fieldname: 'letter_sel',
|
||||
default: __('No Letterhead'),
|
||||
options: this.get_letterhead_options()
|
||||
},
|
||||
{
|
||||
fieldtype: 'Select',
|
||||
label: __('Print Format'),
|
||||
fieldname: 'print_sel',
|
||||
options: frappe.meta.get_print_formats(this.doctype)
|
||||
},
|
||||
{
|
||||
fieldtype: 'Select',
|
||||
label: __('Page Size'),
|
||||
fieldname: 'page_size',
|
||||
options: frappe.meta.get_print_sizes(),
|
||||
default: print_settings.pdf_page_size
|
||||
},
|
||||
{
|
||||
fieldtype: 'Float',
|
||||
label: __('Page Height (in mm)'),
|
||||
fieldname: 'page_height',
|
||||
depends_on: 'eval:doc.page_size == "Custom"',
|
||||
default: print_settings.pdf_page_height
|
||||
},
|
||||
{
|
||||
fieldtype: 'Float',
|
||||
label: __('Page Width (in mm)'),
|
||||
fieldname: 'page_width',
|
||||
depends_on: 'eval:doc.page_size == "Custom"',
|
||||
default: print_settings.pdf_page_width
|
||||
}]
|
||||
});
|
||||
|
||||
dialog.set_primary_action(__('Print'), args => {
|
||||
if (!args) return;
|
||||
const default_print_format = frappe.get_meta(this.doctype).default_print_format;
|
||||
const with_letterhead = args.letter_sel == __("No Letterhead") ? 0 : 1;
|
||||
const print_format = args.print_sel ? args.print_sel : default_print_format;
|
||||
const json_string = JSON.stringify(valid_docs);
|
||||
const letterhead = args.letter_sel;
|
||||
|
||||
let pdf_options;
|
||||
if (args.page_size === "Custom") {
|
||||
if (args.page_height === 0 || args.page_width === 0) {
|
||||
frappe.throw(__('Page height and width cannot be zero'));
|
||||
}
|
||||
pdf_options = JSON.stringify({ "page-height": args.page_height, "page-width": args.page_width });
|
||||
} else {
|
||||
pdf_options = JSON.stringify({ "page-size": args.page_size });
|
||||
}
|
||||
|
||||
const w = window.open(
|
||||
'/api/method/frappe.utils.print_format.download_multi_pdf?' +
|
||||
'doctype=' + encodeURIComponent(this.doctype) +
|
||||
'&name=' + encodeURIComponent(json_string) +
|
||||
'&format=' + encodeURIComponent(print_format) +
|
||||
'&no_letterhead=' + (with_letterhead ? '0' : '1') +
|
||||
'&letterhead=' + encodeURIComponent(letterhead) +
|
||||
'&options=' + encodeURIComponent(pdf_options)
|
||||
);
|
||||
|
||||
if (!w) {
|
||||
frappe.msgprint(__('Please enable pop-ups'));
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
get_letterhead_options () {
|
||||
|
|
|
|||
|
|
@ -192,6 +192,15 @@ $.extend(frappe.meta, {
|
|||
}
|
||||
},
|
||||
|
||||
get_print_sizes: function() {
|
||||
return [
|
||||
"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9",
|
||||
"B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10",
|
||||
"C5E", "Comm10E", "DLE", "Executive", "Folio", "Ledger", "Legal",
|
||||
"Letter", "Tabloid", "Custom"
|
||||
];
|
||||
},
|
||||
|
||||
get_print_formats: function(doctype) {
|
||||
var print_format_list = ["Standard"];
|
||||
var default_print_format = locals.DocType[doctype].default_print_format;
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ def prepare_options(html, options):
|
|||
'quiet': None,
|
||||
# 'no-outline': None,
|
||||
'encoding': "UTF-8",
|
||||
#'load-error-handling': 'ignore'
|
||||
# 'load-error-handling': 'ignore'
|
||||
})
|
||||
|
||||
if not options.get("margin-right"):
|
||||
|
|
@ -111,8 +111,21 @@ def prepare_options(html, options):
|
|||
options.update(get_cookie_options())
|
||||
|
||||
# page size
|
||||
if not options.get("page-size"):
|
||||
options['page-size'] = frappe.db.get_single_value("Print Settings", "pdf_page_size") or "A4"
|
||||
pdf_page_size = (
|
||||
options.get("page-size")
|
||||
or frappe.db.get_single_value("Print Settings", "pdf_page_size")
|
||||
or "A4"
|
||||
)
|
||||
|
||||
if pdf_page_size == "Custom":
|
||||
options["page-height"] = options.get("page-height") or frappe.db.get_single_value(
|
||||
"Print Settings", "pdf_page_height"
|
||||
)
|
||||
options["page-width"] = options.get("page-width") or frappe.db.get_single_value(
|
||||
"Print Settings", "pdf_page_width"
|
||||
)
|
||||
else:
|
||||
options["page-size"] = pdf_page_size
|
||||
|
||||
return html, options
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ base_template_path = "www/printview.html"
|
|||
standard_format = "templates/print_formats/standard.html"
|
||||
|
||||
@frappe.whitelist()
|
||||
def download_multi_pdf(doctype, name, format=None, no_letterhead=0):
|
||||
def download_multi_pdf(doctype, name, format=None, no_letterhead=False, options=None):
|
||||
"""
|
||||
Concatenate multiple docs as PDF .
|
||||
|
||||
|
|
@ -54,18 +54,21 @@ def download_multi_pdf(doctype, name, format=None, no_letterhead=0):
|
|||
import json
|
||||
output = PdfFileWriter()
|
||||
|
||||
if isinstance(options, str):
|
||||
options = json.loads(options)
|
||||
|
||||
if not isinstance(doctype, dict):
|
||||
result = json.loads(name)
|
||||
|
||||
# Concatenating pdf files
|
||||
for i, ss in enumerate(result):
|
||||
output = frappe.get_print(doctype, ss, format, as_pdf = True, output = output, no_letterhead=no_letterhead)
|
||||
output = frappe.get_print(doctype, ss, format, as_pdf=True, output=output, no_letterhead=no_letterhead, pdf_options=options)
|
||||
frappe.local.response.filename = "{doctype}.pdf".format(doctype=doctype.replace(" ", "-").replace("/", "-"))
|
||||
else:
|
||||
for doctype_name in doctype:
|
||||
for doc_name in doctype[doctype_name]:
|
||||
try:
|
||||
output = frappe.get_print(doctype_name, doc_name, format, as_pdf = True, output = output, no_letterhead=no_letterhead)
|
||||
output = frappe.get_print(doctype_name, doc_name, format, as_pdf=True, output=output, no_letterhead=no_letterhead, pdf_options=options)
|
||||
except Exception:
|
||||
frappe.log_error("Permission Error on doc {} of doctype {}".format(doc_name, doctype_name))
|
||||
frappe.local.response.filename = "{}.pdf".format(name)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue