cloudPrintPaperSpec.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace common\components;
  3. /**
  4. * 链科云打印纸张规格(HTML 排版 + dmPaperSize)
  5. */
  6. class cloudPrintPaperSpec
  7. {
  8. /** 场景:配送单 */
  9. const SCENE_DELIVERY_SLIP = 'delivery_slip';
  10. /** 场景:节日贺卡 */
  11. const SCENE_GREETING_CARD = 'greeting_card';
  12. /** 场景:默认 */
  13. const SCENE_DEFAULT = 'default';
  14. /**
  15. * 内置纸张类型(paperType → 链科代码与 HTML @page)
  16. * dmPaperSize 参考 Windows DMPAPER,具体以打印机参数为准
  17. */
  18. protected static function presets()
  19. {
  20. return [
  21. 'a4' => [
  22. 'label' => 'A4',
  23. 'dmPaperSize' => 9,
  24. 'pageSize' => 'A4 portrait',
  25. 'pageMargin' => '10mm',
  26. 'contentWidth' => '190mm',
  27. 'cardWidth' => '140mm',
  28. 'cardHeight' => '200mm',
  29. ],
  30. 'a5' => [
  31. 'label' => 'A5',
  32. 'dmPaperSize' => 11,
  33. 'pageSize' => 'A5 portrait',
  34. 'pageMargin' => '8mm',
  35. 'contentWidth' => '128mm',
  36. 'cardWidth' => '100mm',
  37. 'cardHeight' => '148mm',
  38. ],
  39. 'b5' => [
  40. 'label' => 'B5',
  41. 'dmPaperSize' => 13,
  42. 'pageSize' => 'B5 portrait',
  43. 'pageMargin' => '8mm',
  44. 'contentWidth' => '176mm',
  45. 'cardWidth' => '120mm',
  46. 'cardHeight' => '170mm',
  47. ],
  48. 'letter' => [
  49. 'label' => 'Letter',
  50. 'dmPaperSize' => 1,
  51. 'pageSize' => 'letter portrait',
  52. 'pageMargin' => '10mm',
  53. 'contentWidth' => '190mm',
  54. 'cardWidth' => '140mm',
  55. 'cardHeight' => '200mm',
  56. ],
  57. // 贺卡常用竖版 10×15cm
  58. 'card_10x15' => [
  59. 'label' => '贺卡10×15cm',
  60. 'dmPaperSize' => 0,
  61. 'pageSize' => '100mm 150mm',
  62. 'pageMargin' => '5mm',
  63. 'contentWidth' => '90mm',
  64. 'cardWidth' => '90mm',
  65. 'cardHeight' => '130mm',
  66. ],
  67. // 贺卡竖版 13×18cm
  68. 'card_13x18' => [
  69. 'label' => '贺卡13×18cm',
  70. 'dmPaperSize' => 0,
  71. 'pageSize' => '130mm 180mm',
  72. 'pageMargin' => '6mm',
  73. 'contentWidth' => '118mm',
  74. 'cardWidth' => '118mm',
  75. 'cardHeight' => '160mm',
  76. ],
  77. ];
  78. }
  79. /**
  80. * 解析纸张规格
  81. *
  82. * @param array $options scene, paperType, paperSize(dmPaperSize 数值优先)
  83. */
  84. public static function resolve(array $options = [])
  85. {
  86. $scene = (string)($options['scene'] ?? self::SCENE_DEFAULT);
  87. $paperType = strtolower(trim((string)($options['paperType'] ?? '')));
  88. $paperSize = intval($options['paperSize'] ?? 0);
  89. if ($paperType === '') {
  90. $paperType = strtolower(trim((string)self::envByScene($scene, 'PAPER_TYPE')));
  91. }
  92. if ($paperSize <= 0) {
  93. $paperSize = intval(self::envByScene($scene, 'PAPER_SIZE'));
  94. }
  95. if ($paperType === '') {
  96. $paperType = 'a4';
  97. }
  98. $presets = self::presets();
  99. if (!isset($presets[$paperType])) {
  100. throw new CloudPrinterApiException('不支持的纸张类型: ' . $paperType);
  101. }
  102. $spec = $presets[$paperType];
  103. $dmPaperSize = $paperSize > 0 ? $paperSize : intval($spec['dmPaperSize']);
  104. if ($dmPaperSize <= 0) {
  105. $dmPaperSize = intval(getenv('LIANKENET_PAPER_SIZE') ?: 9);
  106. }
  107. return [
  108. 'paperType' => $paperType,
  109. 'label' => $spec['label'],
  110. 'dmPaperSize' => $dmPaperSize,
  111. 'pageSize' => $spec['pageSize'],
  112. 'pageMargin' => $spec['pageMargin'],
  113. 'contentWidth' => $spec['contentWidth'],
  114. 'cardWidth' => $spec['cardWidth'],
  115. 'cardHeight' => $spec['cardHeight'],
  116. ];
  117. }
  118. /**
  119. * 返回可选纸张类型列表(给前端或配置参考)
  120. */
  121. public static function listTypes()
  122. {
  123. $list = [];
  124. foreach (self::presets() as $key => $item) {
  125. $list[] = [
  126. 'paperType' => $key,
  127. 'label' => $item['label'],
  128. 'defaultDmPaperSize' => $item['dmPaperSize'],
  129. ];
  130. }
  131. return $list;
  132. }
  133. /**
  134. * 按场景读取 .env:LIANKENET_DELIVERY_SLIP_PAPER_TYPE 等
  135. */
  136. protected static function envByScene($scene, $suffix)
  137. {
  138. $map = [
  139. self::SCENE_DELIVERY_SLIP => 'LIANKENET_DELIVERY_SLIP_' . $suffix,
  140. self::SCENE_GREETING_CARD => 'LIANKENET_GREETING_CARD_' . $suffix,
  141. self::SCENE_DEFAULT => 'LIANKENET_' . $suffix,
  142. ];
  143. $key = $map[$scene] ?? $map[self::SCENE_DEFAULT];
  144. $value = getenv($key);
  145. if ($value === false || $value === '') {
  146. if ($scene !== self::SCENE_DEFAULT && $suffix === 'PAPER_TYPE') {
  147. return getenv('LIANKENET_PAPER_TYPE') ?: '';
  148. }
  149. if ($scene !== self::SCENE_DEFAULT && $suffix === 'PAPER_SIZE') {
  150. return getenv('LIANKENET_PAPER_SIZE') ?: 0;
  151. }
  152. }
  153. return $value;
  154. }
  155. }