| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <?php
- namespace common\components;
- /**
- * 链科云打印纸张规格(HTML 排版 + dmPaperSize)
- */
- class cloudPrintPaperSpec
- {
- /** 场景:配送单 */
- const SCENE_DELIVERY_SLIP = 'delivery_slip';
- /** 场景:节日贺卡 */
- const SCENE_GREETING_CARD = 'greeting_card';
- /** 场景:默认 */
- const SCENE_DEFAULT = 'default';
- /**
- * 内置纸张类型(paperType → 链科代码与 HTML @page)
- * dmPaperSize 参考 Windows DMPAPER,具体以打印机参数为准
- */
- protected static function presets()
- {
- return [
- 'a4' => [
- 'label' => 'A4',
- 'dmPaperSize' => 9,
- 'pageSize' => 'A4 portrait',
- 'pageMargin' => '10mm',
- 'contentWidth' => '190mm',
- 'cardWidth' => '140mm',
- 'cardHeight' => '200mm',
- ],
- 'a5' => [
- 'label' => 'A5',
- 'dmPaperSize' => 11,
- 'pageSize' => 'A5 portrait',
- 'pageMargin' => '8mm',
- 'contentWidth' => '128mm',
- 'cardWidth' => '100mm',
- 'cardHeight' => '148mm',
- ],
- 'b5' => [
- 'label' => 'B5',
- 'dmPaperSize' => 13,
- 'pageSize' => 'B5 portrait',
- 'pageMargin' => '8mm',
- 'contentWidth' => '176mm',
- 'cardWidth' => '120mm',
- 'cardHeight' => '170mm',
- ],
- 'letter' => [
- 'label' => 'Letter',
- 'dmPaperSize' => 1,
- 'pageSize' => 'letter portrait',
- 'pageMargin' => '10mm',
- 'contentWidth' => '190mm',
- 'cardWidth' => '140mm',
- 'cardHeight' => '200mm',
- ],
- // 贺卡常用竖版 10×15cm
- 'card_10x15' => [
- 'label' => '贺卡10×15cm',
- 'dmPaperSize' => 0,
- 'pageSize' => '100mm 150mm',
- 'pageMargin' => '5mm',
- 'contentWidth' => '90mm',
- 'cardWidth' => '90mm',
- 'cardHeight' => '130mm',
- ],
- // 贺卡竖版 13×18cm
- 'card_13x18' => [
- 'label' => '贺卡13×18cm',
- 'dmPaperSize' => 0,
- 'pageSize' => '130mm 180mm',
- 'pageMargin' => '6mm',
- 'contentWidth' => '118mm',
- 'cardWidth' => '118mm',
- 'cardHeight' => '160mm',
- ],
- ];
- }
- /**
- * 解析纸张规格
- *
- * @param array $options scene, paperType, paperSize(dmPaperSize 数值优先)
- */
- public static function resolve(array $options = [])
- {
- $scene = (string)($options['scene'] ?? self::SCENE_DEFAULT);
- $paperType = strtolower(trim((string)($options['paperType'] ?? '')));
- $paperSize = intval($options['paperSize'] ?? 0);
- if ($paperType === '') {
- $paperType = strtolower(trim((string)self::envByScene($scene, 'PAPER_TYPE')));
- }
- if ($paperSize <= 0) {
- $paperSize = intval(self::envByScene($scene, 'PAPER_SIZE'));
- }
- if ($paperType === '') {
- $paperType = 'a4';
- }
- $presets = self::presets();
- if (!isset($presets[$paperType])) {
- throw new CloudPrinterApiException('不支持的纸张类型: ' . $paperType);
- }
- $spec = $presets[$paperType];
- $dmPaperSize = $paperSize > 0 ? $paperSize : intval($spec['dmPaperSize']);
- if ($dmPaperSize <= 0) {
- $dmPaperSize = intval(getenv('LIANKENET_PAPER_SIZE') ?: 9);
- }
- return [
- 'paperType' => $paperType,
- 'label' => $spec['label'],
- 'dmPaperSize' => $dmPaperSize,
- 'pageSize' => $spec['pageSize'],
- 'pageMargin' => $spec['pageMargin'],
- 'contentWidth' => $spec['contentWidth'],
- 'cardWidth' => $spec['cardWidth'],
- 'cardHeight' => $spec['cardHeight'],
- ];
- }
- /**
- * 返回可选纸张类型列表(给前端或配置参考)
- */
- public static function listTypes()
- {
- $list = [];
- foreach (self::presets() as $key => $item) {
- $list[] = [
- 'paperType' => $key,
- 'label' => $item['label'],
- 'defaultDmPaperSize' => $item['dmPaperSize'],
- ];
- }
- return $list;
- }
- /**
- * 按场景读取 .env:LIANKENET_DELIVERY_SLIP_PAPER_TYPE 等
- */
- protected static function envByScene($scene, $suffix)
- {
- $map = [
- self::SCENE_DELIVERY_SLIP => 'LIANKENET_DELIVERY_SLIP_' . $suffix,
- self::SCENE_GREETING_CARD => 'LIANKENET_GREETING_CARD_' . $suffix,
- self::SCENE_DEFAULT => 'LIANKENET_' . $suffix,
- ];
- $key = $map[$scene] ?? $map[self::SCENE_DEFAULT];
- $value = getenv($key);
- if ($value === false || $value === '') {
- if ($scene !== self::SCENE_DEFAULT && $suffix === 'PAPER_TYPE') {
- return getenv('LIANKENET_PAPER_TYPE') ?: '';
- }
- if ($scene !== self::SCENE_DEFAULT && $suffix === 'PAPER_SIZE') {
- return getenv('LIANKENET_PAPER_SIZE') ?: 0;
- }
- }
- return $value;
- }
- }
|