printerutil.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // 打印机纸宽58mm,页的宽度384,字符宽度为1,每行最多盛放32个字符
  2. const PAGE_WIDTH = 384;
  3. const MAX_CHAR_COUNT_EACH_LINE = 32;
  4. /**
  5. * @param str
  6. * @returns {boolean} str是否全是中文
  7. */
  8. function isChinese(str) {
  9. return /^[\u4e00-\u9fa5]$/.test(str);
  10. }
  11. /**
  12. * 返回字符串宽度(1个中文=2个英文字符)
  13. * @param str
  14. * @returns {number}
  15. */
  16. function getStringWidth(str) {
  17. let width = 0;
  18. for (let i = 0, len = str.length; i < len; i++) {
  19. width += isChinese(str.charAt(i)) ? 2 : 1;
  20. }
  21. return width;
  22. }
  23. /**
  24. * 同一行输出str1, str2,str1居左, str2居右
  25. * @param {string} str1 内容1
  26. * @param {string} str2 内容2
  27. * @param {number} fontWidth 字符宽度 1/2
  28. * @param {string} fillWith str1 str2之间的填充字符
  29. *
  30. */
  31. function inline(str1, str2, fillWith = ' ', fontWidth = 1) {
  32. const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
  33. // 需要填充的字符数量
  34. let fillCount = lineWidth - (getStringWidth(str1) + getStringWidth(str2)) % lineWidth;
  35. let fillStr = new Array(fillCount).fill(fillWith.charAt(0)).join('');
  36. return str1 + fillStr + str2;
  37. }
  38. /**
  39. * 用字符填充一整行
  40. * @param {string} fillWith 填充字符
  41. * @param {number} fontWidth 字符宽度 1/2
  42. */
  43. function fillLine(fillWith = '-', fontWidth = 1) {
  44. const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
  45. return new Array(lineWidth).fill(fillWith.charAt(0)).join('');
  46. }
  47. /**
  48. * 文字内容居中,左右用字符填充
  49. * @param {string} str 文字内容
  50. * @param {number} fontWidth 字符宽度 1/2
  51. * @param {string} fillWith str1 str2之间的填充字符
  52. */
  53. function fillAround(str, fillWith = '-', fontWidth = 1) {
  54. const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
  55. let strWidth = getStringWidth(str);
  56. // 内容已经超过一行了,没必要填充
  57. if (strWidth >= lineWidth) {
  58. return str;
  59. }
  60. // 需要填充的字符数量
  61. let fillCount = lineWidth - strWidth;
  62. // 左侧填充的字符数量
  63. let leftCount = Math.round(fillCount / 2);
  64. // 两侧的填充字符,需要考虑左边需要填充,右边不需要填充的情况
  65. let fillStr = new Array(leftCount).fill(fillWith.charAt(0)).join('');
  66. return fillStr + str + fillStr.substr(0, fillCount - leftCount);
  67. }
  68. // ArrayBuffer转16进度字符串示例
  69. function ab2hex(buffer) {
  70. const hexArr = Array.prototype.map.call(
  71. new Uint8Array(buffer),
  72. function(bit) {
  73. return ('00' + bit.toString(16)).slice(-2)
  74. }
  75. )
  76. return hexArr.join(',')
  77. }
  78. module.exports = {
  79. inline: inline,
  80. fillLine: fillLine,
  81. fillAround: fillAround,
  82. ab2hex: ab2hex,
  83. getStringWidth: getStringWidth,
  84. };