# 인쇄 (브라우저·출력 프로그램·사일런트)

> print() 의 세 가지 방식, 결과 값, 프린터 고르기, 브라우저 인쇄 창 설정.

Source: https://82label.app/docs/printing/

`print(template, rows, options)` 하나로 인쇄합니다. `template` 은 서식 객체 또는 서식 ID(`'lbl_…'`)입니다.

```js
const r = await Label82.print(template, rows, {
  mode: 'auto',        // 'auto' | 'agent' | 'browser'
  printer: 'TSC TE210', // 출력 프로그램의 프린터 이름 (빼면 기본 프린터)
  copies: 1,           // 행마다 몇 장
  startAt: 1,          // 시트: 몇 번째 칸부터
  frames: true,        // false: layer 'frame' 요소를 빼고 인쇄
});
```

## 세 가지 방식

| mode | 동작 |
| --- | --- |
| `auto` (기본) | PC 에 출력 프로그램이 켜져 있고 구독 계정에 연결돼 있으면 출력 프로그램으로 바로(사일런트). 아니면 브라우저 인쇄 창. |
| `agent` | 출력 프로그램으로만. 없거나 연결이 안 됐으면 `AgentError` 를 던집니다(브라우저로 넘어가지 않음). |
| `browser` | 항상 브라우저 인쇄 창. 출력 프로그램을 찾지 않습니다. |

## 사일런트 인쇄

출력 프로그램 경로에서는 인쇄 창이 뜨지 않습니다. 라이브러리가 라벨을 프린터 해상도(dpi)의 PNG 로 만들어 PC 의 출력 프로그램(`http://127.0.0.1:18282`)에 보내고, 출력 프로그램이 Windows 프린터 드라이버로 용지 크기 그대로(여백 0, 배율 100%) 찍습니다.

- 처음 보는 사이트에서 요청이 오면 출력 프로그램이 "이 사이트의 출력을 허용할까요?" 를 묻습니다. 그동안 `print()` 는 아무것도 찍지 않고 `status: 'pending_permission'` 을 돌려줍니다. 허용한 뒤 다시 누르면 바로 나갑니다.
- 출력 프로그램은 켜져 있지만 구독 계정에 연결되지 않았으면 브라우저로 인쇄하고 `notice: 'agent_license_required'` 를 붙입니다.
- 출력 프로그램이 없으면 0.4초 안에 판단하고 브라우저로 넘어갑니다.

## 결과

```js
{
  via: 'agent' | 'browser',
  printed: 2,                 // 보낸 라벨 수 (copies 포함)
  status: 'done' | 'pending_permission' | 'cancelled',
  errors: [],                 // 바코드 값 오류, 글자 넘침 등 (인쇄는 계속됨)
  notice: 'agent_license_required', // 있을 때만
}
```

```js
const r = await Label82.print(template, rows);
if (r.status === 'pending_permission') showToast('출력 프로그램 창에서 이 사이트를 허용해 주세요.');
else if (r.notice === 'agent_license_required') showToast('바로 인쇄하려면 출력 프로그램을 계정에 연결하세요.');
if (r.errors.length) console.warn(r.errors);
```

## 프린터 목록

```js
const list = await Label82.printers(); // 출력 프로그램이 없으면 null
// [{ name: 'TSC TE210', isDefault: true, dpi: 203 }, { name: 'Canon G3010', isDefault: false }]
const status = await Label82.agentStatus(); // { version, allowed, licensed } 또는 null
```

## 브라우저 인쇄 창 설정

- 배율: **100%**(실제 크기). "용지에 맞춤"은 끄세요.
- 여백: **없음**. 82label 이 `@page { size: 가로mm 세로mm; margin: 0 }` 을 넣습니다.
- 머리글·바닥글(날짜, 주소)은 끄세요. 크롬은 여백이 없으면 저절로 빠집니다.
- 롤 라벨프린터라면 프린터의 용지 크기를 라벨 크기로 고릅니다.

> 브라우저 인쇄는 사용자가 인쇄 창에서 취소해도 알 수 없어 `status` 는 `'done'` 입니다. 정확한 출력 기록이 필요하면 출력 프로그램을 쓰세요.
