Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Joshua
erp5
Commits
30508c74
Commit
30508c74
authored
Mar 16, 2015
by
Klaus Wölfel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
erp5_printer: print with html5 canvas to support chinese characters
parent
56a2208b
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
450 additions
and
1 deletion
+450
-1
bt5/erp5_printer/SkinTemplateItem/portal_skins/erp5_printer/SaleOrder_viewEpsonPrintout.xml
...portal_skins/erp5_printer/SaleOrder_viewEpsonPrintout.xml
+1
-1
bt5/erp5_printer/SkinTemplateItem/portal_skins/erp5_printer/erp5_epson_canvas_printout.js.xml
...rtal_skins/erp5_printer/erp5_epson_canvas_printout.js.xml
+449
-0
No files found.
bt5/erp5_printer/SkinTemplateItem/portal_skins/erp5_printer/SaleOrder_viewEpsonPrintout.xml
View file @
30508c74
...
...
@@ -52,7 +52,7 @@
<title>
Receipt
</title>
\n
<script
type=
"text/javascript"
tal:attributes=
\'src
python:"%s/jquery/core/jquery.js"
%
portal_url\'
></script>
\n
<script
type=
"text/javascript"
tal:attributes=
\'src
python:"%s/epos-print-4.1.0.js"
%
portal_url\'
></script>
\n
<script
type=
"text/javascript"
tal:attributes=
\'src
python:"%s/erp5_epson_printout.js"
%
portal_url\'
></script>
\n
<script
type=
"text/javascript"
tal:attributes=
\'src
python:"%s/erp5_epson_
canvas_
printout.js"
%
portal_url\'
></script>
\n
<link
rel=
"license"
href=
"http://www.opensource.org/licenses/mit-license/"
>
\n
</head>
\n
<body
style=
"background:white"
>
\n
...
...
bt5/erp5_printer/SkinTemplateItem/portal_skins/erp5_printer/erp5_epson_canvas_printout.js.xml
0 → 100644
View file @
30508c74
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"DTMLMethod"
module=
"OFS.DTMLMethod"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
erp5_epson_canvas_printout.js
</string>
</value>
</item>
<item>
<key>
<string>
_proxy_roles
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
_vars
</string>
</key>
<value>
<dictionary/>
</value>
</item>
<item>
<key>
<string>
globals
</string>
</key>
<value>
<dictionary/>
</value>
</item>
<item>
<key>
<string>
raw
</string>
</key>
<value>
<string
encoding=
"cdata"
>
<![CDATA[
/*\n
Copyright (c) 20xx-2006 Nexedi SARL and Contributors. All Rights Reserved.\n
\n
This program is Free Software; you can redistribute it ahand/or\n
modify it under the terms of the GNU General Public License\n
as published by the Free Software Foundation; either version 2\n
of the License, or (at your option) any later version.\n
cful,\n
but WITHOUT ANY WARRANTY; without even the implied warranty of\n
MERCHANTABILITY or FITNESS FgOR A PARTICULAR PURPOSE. See the\n
GNU General Public License for more details.\n
\n
You should have received a copy of the GNU General Public License\n
along with this program; if not, write to the Free Software\n
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n
*/\n
var y;\n
\n
function draw(canvas) {\n
y = 0;\n
context = canvas.getContext(\'2d\');\n
//add logo\n
context.drawImage($(\'#company_logo\')[0], (canvas.width-330)/2, 0, 330, 75);\n
addFeed(75);\n
addFeed();\n
addFeed();\n
\n
//add company information\n
$("#company-info div").each(function(){\n
addText(context, $(this).text());\n
});\n
addFeed();\n
\n
//add invoice information\n
addText(context, $.trim($("#invoice_information_title").text()), {\n
size: 36,\n
line: 46\n
});\n
$("#invoice_information_detail div").each(function(){\n
$(this).find("span").each(function(i){\n
if(i==0){\n
addText(context, $.trim($(this).text()), {bold: true, nobreak: true});\n
}\n
else {\n
addText(context, $.trim($(this).text()), {x: 300});\n
}\n
});\n
});\n
addFeed(100);\n
\n
//add products line\n
$("#invoice_line thead tr").each(function(j){\n
var textPosition=0;\n
$(this).find("th").each(function(i){\n
addText(context, $.trim($(this).text()), {\n
x: textPosition,\n
bold: true,\n
nobreak: true\n
});\n
switch(i)\n
{\n
case 0:\n
textPosition+=285;\n
break;\n
case 1:\n
textPosition+=100; \n
break;\n
case 3:\n
textPosition+=60;\n
break;\n
}\n
});\n
});\n
addFeed();\n
$("#invoice_line tbody tr").each(function(){\n
var textPosition=0;\n
$(this).find("td").each(function(i){\n
switch(i)\n
{\n
case 0:\n
var content=$.trim($(this).text());\n
content_len=content.length;\n
if(content_len>
20)\n
content=content.substr(0,12)+"..."+content.substr(content_len-4,5);\n
addText(context, content, {x:textPosition, nobreak: true});\n
textPosition+=330;\n
break;\n
case 1:\n
var content=parseFloat($.trim($(this).text())).toFixed(1);\n
var content_len=content.length;\n
if(content_len>10)\n
content=parseFloat(content).toExponential(2);\n
else if(content_len>8
&&
content_len
<11
)\n
content=
parseInt(content);\n
addText(context,
content,
{\n
x:textPosition,\n
nobreak:
true,\n
textalign:
\'right\'\n
});\n
textPosition+=140;\n
break;\n
case
2:\n
priceControl(context,
$.trim($(this).text()),
{\n
x:textPosition,\n
textalign:
\'right\'\n
});\n
textPosition+=60;\n
break;\n
case
3:\n
var
content=
$.trim($(this).text());\n
var
content_len=
content.length;\n
content=
content.substr(0,5);\n
addText(context,
content,
{x:textPosition,
nobreak:
true});\n
break;\n
case
4:\n
priceControl(context,
$.trim($(this).text()),
{\n
x:60,\n
textalign:
\'right\'\n
});\n
break;\n
}\n
});\n
});\n
\n
addText(context,
"===========",
{x:360});\n
addText(context,
$.trim($("#total_price
tr
th").text()),
{\n
bold:
true,\n
size:
28,\n
line:
36,\n
nobreak:
true\n
});\n
priceControl(context,
$.trim($("#total_price
tr
td").text()),
{\n
x:480,\n
textalign:
\'right\',\n
bold:
true,\n
size:
28,\n
line:
36\n
});\n
addFeed();\n
\n
if
($("#total_discount").length
>
0) {\n
builder.addText(context, $.trim($("#total_discount tr th").text()), {x:130});\n
priceControl(context, $.trim($("#total_discount tr td").text()), {x:385});\n
addFeed();\n
\n
addText(context, "===========", x=360);\n
addText(context, $.trim($("#total_price_with_discount tr th").text()), {x:130});\n
priceControl(context, $.trim($("#total_price_with_discount tr td").text()), {x:385});\n
}\n
\n
addFeed();\n
// append date and time\n
var now = new Date();\n
addText(context, now.toDateString() + \' \' + now.toTimeString().slice(0, 8) + \'\\n\');\n
\n
return canvas;\n
}\n
\n
function addText(context, text, options) {\n
if (!options) options = {};\n
if (!options.x) options.x = 0;\n
if (!options.bold) options.bold = false;\n
if (!options.size) options.size = 24;\n
if (!options.line) options.line = 30;\n
if (!options.nobreak) options.nobreak = false;\n
if (!options.font) options.font = \'Courier\';\n
if (!options.textalign) options.textalign = \'left\';\n
context.font =\n
(options.bold ? \'bold \' : \'normal \') + options.size + \'px \' + options.font;\n
context.textAlign = options.textalign;\n
context.fillText(text, options.x, y);\n
// line feed\n
if (options.nobreak === false) {\n
y = y + options.line;\n
}\n
console.log(options.line);\n
}\n
\n
function addFeed(px) {\n
if (!px) px = 30;\n
y = y + px;\n
}\n
\n
// if the price number length > 13 use the Scientific notation,\n
// if the length==11,12,13 , just need to remove the number after Decimal point\n
function priceControl(context, price, options){\n
var content=parseFloat(price).toFixed(2);\n
var content_len=content.length;\n
if(content_len>13)\n
content=parseFloat(content).toExponential(4);\n
else if(content_len>10
&&
content_len
<14
)\n
content=
parseInt(content);\n
addText(context,
content,
options);\n
}\n
\n
monitoring_enabled =
0;\n
\n
function
enableEpsonMonitoring(printer_url){\n
if
(
monitoring_enabled =
=
0)
{\n
monitoring_enabled =
1;\n
}
else
{
\n
return
true;\n
};\n
var
monitoting_epos =
new
epson.ePOSPrint(printer_url);\n
monitoting_epos.interval =
5000;\n
monitoting_epos.onpoweroff =
function
()
{\n
msg =
"ERROR: Unable to connect to the printer at the URL (Unreachable or Power off): "
+
monitoting_epos.address\n
$("#js_error_log").append("<div
>
" + msg + "
</div>
");\n
console.log(msg);\n
}\n
\n
monitoting_epos.onoffline = function () {\n
msg = "ERROR: Printer seems offline check if you can access printer at the URL (Unreachable or Power off): " + monitoting_epos.address\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
}\n
\n
monitoting_epos.online = function () {\n
msg = "INFO: Printer is online at" + monitoting_epos.address\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
}\n
\n
monitoting_epos.onpaperend = function () {\n
msg = "WARNNING: Printer report that paper is finished!"\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
};\n
\n
monitoting_epos.onpapernearend = function () {\n
msg = "WARNNING: Printer report that paper is near finished from finish!"\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
};\n
\n
monitoting_epos.onpaperok = function () {\n
msg = "INFO: Printer report that paper is OK."\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
};\n
\n
monitoting_epos.ondrawerclosed = function () {\n
msg = "INFO: Printer report that drawer is closed."\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
};\n
\n
monitoting_epos.ondraweropen = function () {\n
msg = "INFO: Printer report that drawer is open."\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
};\n
\n
monitoting_epos.oncoveropen = function () {\n
msg = "WARNNING: Printer report that cover is open! Please close it!"\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
};\n
\n
monitoting_epos.oncoverok = function () {\n
msg = "INFO: Printer cover is closed."\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
};\n
\n
monitoting_epos.onstatuschange = function (status) {\n
msg = "INFO: Printer changed status to :" + status;\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
console.log(msg);\n
};\n
\n
monitoting_epos.open();\n
}\n
\n
function printInvoiceOnEpson(printer_url){\n
enableEpsonMonitoring(printer_url);\n
// create print object\n
var epos = new epson.CanvasPrint(printer_url);\n
// set paper cutting\n
epos.cut = true;\n
\n
// register callback function\n
epos.onreceive = function (res) {\n
// Obtain the print result and error code\n
var msg = \'Print\' + (res.success ? \'Success\' : \'Failure\') + \'\\nCode:\' + res.code;\n
\n
switch(res.code) {\n
case "EPTR_AUTOMATICAL":\n
msg += \' An automatically recoverable error occurred\\n\';\n
break;\n
case "EPTR_COVER_OPEN":\n
msg += \' A cover open error occurred\\n\';\n
break;\n
case "EPTR_CUTTER":\n
msg += \' An autocutter error occurred\\n\';\n
break;\n
case \'EPTR_MECHANICAL\':\n
msg += \' A mechanical error occurred\\n\';\n
break;\n
case \'EPTR_REC_EMPTY\':\n
msg += \' No paper in roll paper end sensor\\n\';\n
break;\n
case \'EPTR_UNRECOVERABLE\':\n
msg += \' An unrecoverable error occurred\\n\';\n
break;\n
case \'SchemaError\':\n
msg += \' The request document contains a syntax error\\n\';\n
break;\n
case \'DeviceNotFound\':\n
msg += \' The printer with the specified device ID does not exist\\n\';\n
break;\n
case \'PrintSystemError\':\n
msg += \' An error occurred on the printing system\\n\';\n
break;\n
case \'EX_BADPORT\':\n
msg += \' An error was detected on the communication port\\n\';\n
break;\n
case \'EX_TIMEOUT\':\n
msg += \' A print timeout occurred\\n\';\n
break;\n
}\n
\n
msg += \'\\nStatus:\\n\';\n
// Obtain the printer status\n
var asb = res.status;\n
if (asb
&
epos.ASB_NO_RESPONSE) {\n
msg += \' No printer response\\n\';\n
}\n
if (asb
&
epos.ASB_PRINT_SUCCESS) {\n
msg += \' Print complete\\n\';\n
}\n
if (asb
&
epos.ASB_DRAWER_KICK) {\n
msg += \' Status of the drawer kick number 3 connector pin = "H"\\n\';\n
}\n
if (asb
&
epos.ASB_OFF_LINE) {\n
msg += \' Offline status\\n\';\n
}\n
if (asb
&
epos.ASB_COVER_OPEN) {\n
msg += \' Cover is open\\n\';\n
}\n
if (asb
&
epos.ASB_PAPER_FEED) {\n
msg += \' Paper feed switch is feeding paper\\n\';\n
}\n
if (asb
&
epos.ASB_WAIT_ON_LINE) {\n
msg += \' Waiting for online recovery\\n\';\n
}\n
if (asb
&
epos.ASB_PANEL_SWITCH) {\n
msg += \' Panel switch is ON\\n\';\n
}\n
if (asb
&
epos.ASB_MECHANICAL_ERR) {\n
msg += \' Mechanical error generated\\n\';\n
}\n
if (asb
&
epos.ASB_AUTOCUTTER_ERR) {\n
msg += \' Auto cutter error generated\\n\';\n
}\n
if (asb
&
epos.ASB_UNRECOVER_ERR) {\n
msg += \' Unrecoverable error generated\\n\';\n
}\n
if (asb
&
epos.ASB_AUTORECOVER_ERR) {\n
msg += \' Auto recovery error generated\\n\';\n
}\n
if (asb
&
epos.ASB_RECEIPT_NEAR_END) {\n
msg += \' No paper in the roll paper near end detector\\n\';\n
}\n
if (asb
&
epos.ASB_RECEIPT_END) {\n
msg += \' No paper in the roll paper end detector\\n\';\n
}\n
if (asb
&
epos.ASB_BUZZER) {\n
msg += \' Sounding the buzzer (limited model)\\n\';\n
}\n
if (asb
&
epos.ASB_SPOOLER_IS_STOPPED) {\n
msg += \' Stop the spooler\\n\';\n
}\n
// Display in the dialog box\n
console.log(msg);\n
$("#js_error_log").append("
<div>
" + msg + "
</div>
");\n
}\n
\n
// register callback function\n
epos.onerror = function (err) {\n
$("#js_error_log").append("
<div>
Error Status: " + err.status + " Response: " + err.responseText + "
</div>
");\n
if (err.status == 0) {\n
$("#js_error_log").append("
<div>
Make sure you are able to access the printer at: " + epos.address + "
</div>
");\n
};\n
console.log("Error Status: " + err.status + "Response: " + err.responseText);\n
}\n
\n
// send\n
$("#js_error_log").append("
<div>
The print will start soon...
</div>
");\n
\n
// first draw on dummy canvas to get canvas height\n
// needed because setting size clears canvas\n
draw(document.createElement("canvas"));\n
console.log(y);\n
var canvas = document.createElement("canvas");\n
canvas.width = 512;\n
canvas.height = y;\n
epos.print(draw(canvas));\n
}\n
]]>
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment