Skip to content
Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ and the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
## [Unreleased]

### Added
- **Label sheets for office printers** (File > Export > Label sheets (PDF), or Label sheets in the Print dialog): put the label on sheets for a laser or inkjet printer and save them as a PDF at the sheet's real size, each label at its own physical size. Pick a generic template (Letter 30-up, 20-up, 14-up, 10-up, 6-up, 80-up and half sheets; A4 3 x 8, 21-up, 65-up, 16-up, 14-up, 8-up and 2-up) or type your own layout, start at any position of a partly used sheet, and add crop marks or label outlines. With data loaded the ticked records go on the sheets with their copies, and serial numbers are used once, exactly as when printing. The layout is saved with the label; older versions of Rotula open such a file and ignore it. Sending the sheets straight to a Windows printer is not offered: print the PDF at actual size.
- **Machine-wide MSI for IT departments**: every release now also has `Rotula-X.Y.Z-win-x64.msi`, signed like the setup program. It installs to Program Files for every user with a Start menu entry and the `.rotula` association, upgrades older versions in place, and is made for silent deployment with Intune, Group Policy or Configuration Manager. The setup program can now also install for all users silently with `/ALLUSERS`. Silent install and uninstall commands, exit codes, Intune detection rules and Group Policy steps are in the new [docs/deployment.md](docs/deployment.md).
- **Settings your organization can manage**: administrators can fix the language and switch the update check on or off for everyone, suggest a default printer, keep add-ons in the user's own folder from loading, and switch printing or database access of the MCP server off, through Group Policy or Intune. Administrative templates (English and Spanish) are in `packaging/policies`. A setting fixed this way is greyed out in Rotula with "Managed by your organization".
- **Optional update check** (Help > Check for updates once a day): off unless you switch it on. Then Rotula asks GitHub once a day, with one anonymous request that carries nothing about you or your PC, whether a newer version exists, and shows a notice with a link to the release page. It never downloads or installs anything.
Expand Down
19 changes: 17 additions & 2 deletions README.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,8 @@ transferencia térmica) y el seguimiento.
- **Qué sabe.** Tamaño en milímetros y pulgadas, radio de las esquinas, etiquetas a lo ancho, tamaño del núcleo, etiquetas por
rollo y de dónde sale el dato. Un medio cuyo tamaño no está contrastado aparece marcado y, al aplicarlo, se muestra un aviso.
- **Sin inventar.** La separación entre etiquetas casi siempre se desconoce, así que Rotula indica que calibres la impresora en
lugar de adivinar. En medios con varias etiquetas por fila o en hojas solo se aplica el tamaño de una etiqueta, y Rotula lo dice.
lugar de adivinar. En rollos con varias etiquetas por fila solo se aplica el tamaño de una etiqueta, y Rotula lo dice. Un medio en hojas abre la
exportación de [hojas de etiquetas](#hojas-de-etiquetas-impresoras-de-oficina) con el diseño que le corresponde.
- **Tus propios medios.** Guarda un tamaño personalizado como medio, o importa una lista de suministros (`.csv` o `.xlsx`) y revisa
las filas antes de conservarlas. Los precios nunca se leen. Tus medios se guardan en `%AppData%\Rotula\stocks`.
- **Favoritos y recientes** se recuerdan en tu PC.
Expand Down Expand Up @@ -400,6 +401,21 @@ Rotula envía el ZPL como datos RAW, así que el controlador lo transmite sin to

Más información en [docs/printing.md](docs/printing.md) (en inglés).

### Hojas de etiquetas (impresoras de oficina)

**Archivo > Exportar > Hojas de etiquetas (PDF)** (o **Hojas de etiquetas** en el cuadro Imprimir) coloca la etiqueta en hojas para
una impresora láser o de inyección de tinta: Carta de 30 (2-5/8 x 1 in), 20, 14, 10 de envío (4 x 2 in), 6, 80 y media hoja (2 por hoja),
A4 de 3 x 8 (70 x 37 mm), 21, 65, 16, 14, 8 y 2 por hoja, o un diseño personalizado (papel, márgenes, tamaño de la etiqueta, etiquetas
a lo ancho y a lo alto, distancia entre etiquetas).

- **Empezar en la posición** aprovecha una hoja ya empezada: haz clic en la primera posición libre de la vista previa.
- **La combinación de datos y los números de serie** funcionan como al imprimir: los registros marcados con sus copias, y cada
número de serie se usa una sola vez.
- **Marcas de corte** en los márgenes, o un **contorno fino** de cada etiqueta para probar en papel normal.
- El resultado es un PDF al tamaño real de la hoja, con cada etiqueta a su propio tamaño físico. Imprímelo a **tamaño real (100 %)**.
El diseño de la hoja se guarda con la etiqueta. Las plantillas se describen por sus medidas; las hojas de distintos proveedores
pueden variar un milímetro, así que imprime primero una página de prueba en papel normal.

---

## Puesto de impresión
Expand Down Expand Up @@ -565,7 +581,6 @@ No es compatible hoy, y está abierto a discusión:
- Un mercado de plantillas de etiquetas
- Sincronización en la nube
- macOS y Linux
- Diseños de hojas con varias etiquetas

¿Tienes un caso de uso que te importa? [Abre una solicitud de función](https://github.com/P4Software/Rotula/issues/new/choose).

Expand Down
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,8 @@ type. Pick a result and Rotula sets the label size, media type (direct thermal o
- **What it knows.** Size in millimetres and inches, die-cut corner radius, labels across, core size, labels per roll and where
the data comes from. A stock whose size is not cross-checked is marked, and applying it shows a warning.
- **Honest about gaps.** The gap between labels is usually unknown, so Rotula says to calibrate the printer instead of guessing.
Multi-up and sheet stocks apply the label size only, and Rotula says so.
Multi-up roll stocks apply the label size only, and Rotula says so. A sheet stock opens the [label sheets](#label-sheets-office-printers)
export on the matching layout.
- **Your own stocks.** Save a custom size as a stock, or import a supplies list (`.csv` or `.xlsx`) and review the rows before
they are kept. Prices are never read. User stocks live in `%AppData%\Rotula\stocks`.
- **Favourites and recent** stocks are remembered on your PC.
Expand Down Expand Up @@ -389,6 +390,19 @@ Rotula sends ZPL as RAW data, so the driver passes it through untouched.

More in [docs/printing.md](docs/printing.md).

### Label sheets (office printers)

**File > Export > Label sheets (PDF)** (or **Label sheets** in the Print dialog) puts the label on sheets for a laser or inkjet
printer: Letter 30-up (2-5/8 x 1 in), 20-up, 14-up, 10-up shipping (4 x 2 in), 6-up, 80-up, 2-up half sheets, A4 3 x 8 (70 x 37 mm),
21-up, 65-up, 16-up, 14-up, 8-up, 2-up, or a custom layout (paper, margins, label size, labels across and down, distance between labels).

- **Start at position** uses up a partly used sheet: click the first free position in the preview.
- **Data merge and serial numbers** work as when printing: the ticked records with their copies, and every serial number used once.
- **Crop marks** in the margins, or a **thin outline** of each label for a test on plain paper.
- The result is a PDF at the sheet's real size with every label at its own physical size. Print it at **actual size (100 %)**. The
layout is saved with the label. Templates are described by their dimensions; sheets of different suppliers can differ by a
millimetre, so print one test page on plain paper first.

---

## Print station
Expand Down Expand Up @@ -553,7 +567,6 @@ Not supported today, and open for discussion:
- A label template marketplace
- Cloud sync
- macOS and Linux
- Multi-label sheet layouts

Have a use case that matters to you? [Open a feature request](https://github.com/P4Software/Rotula/issues/new/choose).

Expand Down
8 changes: 8 additions & 0 deletions docs/decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,14 @@ host that matches a preset offers its settings. The password stays a separate pr
placeholder name used for an unnamed form can never pick up the password of a real connection. When the store asks for the password again
the user is told and the password box takes the focus.

### Label sheets (office printers)
File > Export > Label sheets (PDF) and a button in the Print dialog open `SheetLayoutViewModel`. Output is a PDF only: sending to a Windows
printer was left out because driver margins and "fit to page" scaling move the labels, while a PDF printed at actual size keeps them in place.
The labels come from the print paths (`MergeBatch.Labels` with data, `LabelPrintRun.LabelValues` without), so copies, skipped records and serial
numbers behave as when printing; numbers are confirmed only when the PDF is complete. Templates are generic and named from their dimensions.
The chosen layout is saved in the optional `sheet` object of the .rotula file without a version change (an older build ignores it); changing it
marks the label as changed but is not an undo step. Details in [printing.md](printing.md#label-sheets-for-office-printers).

### Tests
`tests/Rotula.Tests` targets `net10.0-windows` (it references the WPF app). All App tests share the xUnit collection "App"
because the language is process-wide state.
Expand Down
32 changes: 32 additions & 0 deletions docs/printing.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,35 @@ a resolution the user picked is never overridden.

The test label is sized from physical units (7 mm text, QR module size clamped to Core's 1-10) so it is readable and
inside the label at 203/300/600 dpi.

## Label sheets for office printers

Labels can also be printed on sheets with a laser or inkjet printer. This path does not send ZPL: it draws the labels into a
PDF that is printed from any PDF reader.

- **Model** (`Rotula.Core.Sheets`, no UI): `SheetLayout` is the paper (`Letter`, `A4`, `Legal` or a custom size), the top and
left margin, the label size, columns x rows and the pitch across and down (label size plus gap), all in millimetres.
`Validate()` returns message keys (`Sheet.Labels.TooWide`, `Sheet.Labels.OverlapAcross`, `Sheet.Labels.NearEdge` and the
others in `Issue.Sheet.*`); `ValidateStart` checks a start position and `CheckDesignSize` warns when the design is larger or
smaller than the positions. `SheetTemplates.All` holds generic Letter and A4 layouts described only by their dimensions;
`FindForStock` matches a sheet stock of the library by label size and grid, without naming a brand.
- **Imposition**: `SheetImposition.Paginate` pulls the labels lazily and fills the positions in reading order (or down the
columns), sheet after sheet. The first sheet can start at a later position (a partly used sheet); later sheets start at 1.
- **Values**: the labels come from the same iterations as printing. With data, `MergeBatch.Labels` yields each record with its
resolved values (`MergedLabel.Values`) and its copies; without data, `LabelPrintRun.LabelValues()` yields one value set per
copy (each copy of a label with a counter has its own number). The renderer draws them with
`LabelDocumentAdapter.ToRenderLabelResolved`, which does not resolve the variables again.
- **Serial numbers**: reserved before the PDF is written and confirmed only when the file is complete; a failed or cancelled
export gives them back. A PDF will be printed, so its numbers count as used, exactly as for "Save as ZPL".
- **Output**: `SheetExporter.SavePdf` writes one page per sheet at the paper's real size. Each label is drawn at its physical
size (its dots divided by its resolution), centred in its position and clipped to it; text, boxes and barcode modules stay
vectors. Optional crop marks (in the margins only) or grey outlines. The page size is exact for US paper and within 0.02 mm
for A4 (the PDF writer rounds it to whole pixels at 600 dpi).
- **The .rotula file** keeps the chosen layout in an optional root `sheet` object (template id, paper, margins, label size,
grid, pitch, order, guides). It does not raise the format version: an older build ignores it. The start position is not
saved, because it depends on the sheet in the printer today.

**Not offered: sending the sheets straight to a Windows printer.** Office printer drivers add their own margins and often scale
to fit, which would move every label; a PDF printed at actual size (100 %, no "fit to page") keeps the positions. Sheets of
different suppliers with the same label size can differ by about a millimetre in their margins, so print one page on plain
paper with outlines, hold it against a sheet and adjust the margins.
6 changes: 4 additions & 2 deletions docs/stock-catalog.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,10 @@ reported; it never stops Rotula from starting.

- The gap between labels along the roll is unknown for every entry except one (black-mark sensing). Calibrate the
printer on the stock.
- Multi-up (several labels across, or label sheets) is not supported yet. `columns`, `rows` and the gaps are in the
data and are reported by `StockApplier`, but the label document is laid out as a single label.
- Multi-up rolls (several labels across) are not supported yet. `columns`, `rows` and the gaps are in the data and are
reported by `StockApplier`, but the label document is laid out as a single label. A sheet stock whose label size and grid
match a built-in sheet template (`SheetTemplates.FindForStock`) opens the label sheets export on that template; the catalogue
states no margins for sheets, so the template's geometry is used.
- 40 entries are unverified: 15 where two sources disagree on size or series, 23 stated only by the PDF extraction (11
Zebra part numbers and the 12 generic `std-*` sizes), 2 where the export lists the part twice with different sizes. They are listed in the rebuild output.
- Roll length for long rolls comes from the stock name; the label height of those continuous rolls is the user's choice.
Expand Down
1 change: 1 addition & 0 deletions src/Rotula.App/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@
<MenuItem Header="{loc:T Menu.ExportPng}" Command="{Binding ExportPngCommand}" />
<MenuItem Header="{loc:T Menu.ExportJpeg}" Command="{Binding ExportJpegCommand}" />
<MenuItem Header="{loc:T Menu.ExportPdf}" Command="{Binding ExportPdfCommand}" />
<MenuItem Header="{loc:T Menu.ExportSheets}" Command="{Binding ShowSheetsCommand}" />
<MenuItem Header="{loc:T Menu.ExportZpl}" Command="{Binding ExportZplCommand}" />
</MenuItem>
<MenuItem Header="{loc:T Menu.ImportZpl}" Command="{Binding ImportZplCommand}" />
Expand Down
Loading
Loading