Initialer Commit
This commit is contained in:
BIN
docs/DOCX4J_FO_VALIDIERUNG_v2.2.pdf
Normal file
BIN
docs/DOCX4J_FO_VALIDIERUNG_v2.2.pdf
Normal file
Binary file not shown.
105
docs/HTML_PDF_FEHLERBEHEBUNG_v2.3.pdf
Normal file
105
docs/HTML_PDF_FEHLERBEHEBUNG_v2.3.pdf
Normal file
@@ -0,0 +1,105 @@
|
||||
%PDF-1.4
|
||||
%<25><><EFBFBD><EFBFBD> ReportLab Generated PDF document (opensource)
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/BaseFont /ZapfDingbats /Name /F3 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Contents 12 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 10 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Author (\(anonymous\)) /CreationDate (D:20260609194150+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260609194150+00'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Count 2 /Kids [ 6 0 R 7 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2299
|
||||
>>
|
||||
stream
|
||||
Gat=+CN%tI')h6*0lR^i[l*%R;6"*\\@-<n)r#,%">16B=G\Pk0je3=XX&Z$HY8ZUOc!8oKcl5qSXho"F(TUH!$+:Yr*:TKB+*'=%5:IXXMM,@)]!AM@WD%lO\nb4L2&`WA\iV-X/9cqE?.g?Egd/%W53/4U7)3"RUGDITkOjVWp<isleqEPLXDV\.5**]O&ct_:"9:K?8&J<5Y>'#bg.s$P(k]&9,c5iR0N\B`Fi<N#`@KfK,B*YcT[loA5(d8^q!gfg^4H-@b?qlkSe/l+Y=S&8$nq._1I`6D5Z8&*\;$1$5nhh*.44+i8OHgYe)ZG."V!VY"WNOiBCa"P/,g'j2seajiaGN$HSU,U95]5M,=,tZGqmWUNOQh_B[2_'JrFCThKn(,75kO.9qea3%AlRJALW+09oK.UN4Z&eQom9^=k"4#H&H:l;#Q3Vn!JS'c:uF\;@rYCnj3M<-Z^r$na[O_mS9P]3*qhd%K!EeSf0e;hfoUVeO59QtNtE#(hMc3#+_/GoS!X$I3<'THK(!5gR:bb;Mmb(#o[dD$Ug7Rk0L#.Y>HMd0A]5GZg<G4oq8i_X[;>82HqZGMl-2+=d-mglXE^U7fjK@>*TC,?^*k0aVN>!ZR"p$PF/8MUh*+JRDTM'a<$dLf47@U4'ed<'9:/k,RNC9=0<"O@+bl^cc64-;n$8r9LtaCJ@(hIi=JP#SPFZ(#@,TMR%hPS!*U>$06)#:Goe7i/[4`o?X1lWP[Y1*hiBD?BmtWd;iN7nM$\olBl)%"\6&240"l4[N,Hnrt.VUb9ejo@okN^h#YK6JPfPLfRkW_k"2T;Fa<=]GJS>'psFP@*D+/9W0ZUkc%7_i'mW4-rR,A7C/,2<Oa\NtG7*=^$nQ'Y:?MR&,CuXW(8b%HS-+l<`A:8T0g/N:Ff&0"#JemUA0##T/i'<WRfY$a->F@::Jc3?\78)N+0ruVcl[/QNk6hWWHS>iX^JSJV^F0VOoWjZ6ceR^&p_'jU)^n4E8+*D?+AIqMVcUCp5WVlB&@.5%%,XuZtbJ&>q1i6<BC=&bs^AKA3c,A)M%6^;hjfXofsK.fC&t7Rtb0l8Re)hkCh:i3ba)ZNdA7.X^n\6"]VaV-r)Cr.AFg%5[LLQa:fKh8=I/XYkI]/,`5hR>(l>Pf+9h5J6gSG9#]0sEHm&g%M;.0i&&PcF;<@Oq@XTm>$P=Whn3,tL_@<3'tm6?;3HCIn)kqGdBV<=U9jIkp4#T4l+j/F6-6P@i@'G)E^K6/f6a^oX^"A*^Da:7iGB=?G'=!Xc%PJ,-ZIR/=CuaY8'Q_7Zb^<52[laEKRhDZ>&:&tWOsdZgHe"$qp9n(@l'huc?SisZ!FOJGi"QmWGjGP)I>"*;I\OfPYLH%6dV8qg+?[U)6N`n:Am1]A1n&n)==@t"iH)".WJ--$sCP6A5'?7n<6Nq7:^.+ZB9/7F!Tg*EKDDMOn9.p5>^^QVV(&W`T&0Ydj9u`9IhGONo&JbTkLGr?[;Yk_<(pHW))%aYkP*]dqkHJ?`UM"50Yq[>*O>Y'_Kn'/i%6uH\JnGQk\6PmoE`!VVf4H6<aX63Z0H=JE:/P0cs&U0,i]YnHhWON/e3X9_u:[&3X<A%)X#pP_G'2"J3X^>D3T$ZX:-(fYmT2RGRH]0ZqcRDJAP+Kg.C7Tl::W?hU*/((*32"Vgi/H#))>)Wl9O^knS0[)VeXHU*HO?oi];>2*#!I6?9g>*d\G4?5]dJc(nm]YhIBjH8MnFtXhol#AE$VMtc3)?so%?7YMUOP'R#8%C*P%*C.mZm"W.<7BiC7H-!OpsdbUrHf49c^*Aeb%j!9,sr`O>S/@0'M+g*/!!D)Q>2dcGTY_+^K%jHCh8_P"/bS.c24uB(,s!6>jnc`iP,P#BaKVoND[nt[\AIF^CWNrn,Zm9V89#7U^AHD_WY>QcDUf]+fCg$54!4N?Y#Cr6IS$6>4@bVj:9+LbbLinH!UF[F*F?CO-GYf&Fb//L-nT2duLnM$0;:j+i.A#IsEU6E6"XE6jio.qek)8_ZQ2_T8-?4f3eFab7&HS.B>"[8RBbXoC+Ou!r#K8M"6hTeB#BiO^Zbt#MZ[a@&?qM\(J&O\>l!9L]-pR!9<Ef`l$8N<f#Kr-jQpmO7$]:Nm@u8@K!=J)Qr9PfK#OH<-O)VKn&sg_!)Y!bqkSQ<W93*hUJaPA4bI9TY(p\b?l;T4=i"9dpI"<00U8N2oS1A86dU2>-@j9U-Ci!T^:t?hB#DDe$3HXdPRt"`idd73r?U<oF09Ai2q8YD=F:S$9Ttc>SUR8km#UL2_X+QD^Og<p&~>endstream
|
||||
endobj
|
||||
12 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 507
|
||||
>>
|
||||
stream
|
||||
GasbU_2ctu&;KY%MZ6dT$#u.e/2pD)5Ur_*#VNg#aWrT8S6^Ks!`-RpK\^\4!KE=7cMZQn4tFQLC4$d;n34nYXb'_#YFs;l7D?ZpI.f6mIlg^]8lfYh+Np(u1/9XIa_(p[B9n]_2aV[$/fo!%=K]YkHUtHl_,;D'mp2u0ZFH!)EfI?f%`s$&\#*h$j4q,Gk<kE0[PTjeI*=hDE$fcP>EXDm`E3^1L7eYCSS$o?L@D$`SSjEGjFXL@+TI;r-0CaN)MUYbEM5AJ=1X(NO29$3"ituK57DrcLD(OuW$F&J6eK"ZnOdJXpXn`fI:+-[TuGJ^WEZOV8X.3aS&*YBL?.(X0RGQtbNdX@jELTUXHdoJ[a_\T\pDl"@V;&E.)jFmbEq'?aDs*#C`,-51u,Kc7qY1*"C'm;56iB4GD:+c18:ZCl1b!Vjb94L>faueoJh6(N>='\p;;PT)mgW&ml0!&hhF46dQ)irE)"C3k(@(@a5V+SWOqiZA.c.<&O4A>~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 13
|
||||
0000000000 65535 f
|
||||
0000000061 00000 n
|
||||
0000000122 00000 n
|
||||
0000000229 00000 n
|
||||
0000000341 00000 n
|
||||
0000000424 00000 n
|
||||
0000000529 00000 n
|
||||
0000000734 00000 n
|
||||
0000000939 00000 n
|
||||
0000001008 00000 n
|
||||
0000001288 00000 n
|
||||
0000001354 00000 n
|
||||
0000003745 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<5fc3771a4bb5cad6c6937da174857a27><5fc3771a4bb5cad6c6937da174857a27>]
|
||||
% ReportLab generated PDF document -- digest (opensource)
|
||||
|
||||
/Info 9 0 R
|
||||
/Root 8 0 R
|
||||
/Size 13
|
||||
>>
|
||||
startxref
|
||||
4343
|
||||
%%EOF
|
||||
74
docs/LIEFERSCHEIN_DEMOS_v2.4.pdf
Normal file
74
docs/LIEFERSCHEIN_DEMOS_v2.4.pdf
Normal file
@@ -0,0 +1,74 @@
|
||||
%PDF-1.3
|
||||
%<25><><EFBFBD><EFBFBD> ReportLab Generated PDF document (opensource)
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/Contents 8 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 7 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 7 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Author (anonymous) /CreationDate (D:20260609194716+00'00') /Creator (anonymous) /Keywords () /ModDate (D:20260609194716+00'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||
/Subject (unspecified) /Title (Printservice Lieferschein-Demos v2.4) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Count 1 /Kids [ 4 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 712
|
||||
>>
|
||||
stream
|
||||
Gat%`Df;+!&B<W%;r#Q6)@gp55bq+XRmtqo.bTQbBl>0s8)kA$AkZCie*h7U2H.#h$45)$h!]OV%ifu.\@^o]^f_#>3<q/Z/V+-XJ91f.l%t<+i,KhTS5#U7r#nMMR4lPn!E#)c:dfE$L=;EMb-ku,1.Tt'9'F)X@Ypu,[j[M#_cjNf+ME?um3@HTiWT$-IL.i+=<*.DJS#O!KO8#SfmTQ4],HsZXOIS8819+2@pskB&r9_'"G`E0o%T]n<Ha@:qR;4B0]>)'B<[iLfBL9)C@O$lQpQY3`BNF45GWn.l<<ta[4.oo/?0>`!Y$(Mpcd_HFDrHAba.EVVso>E4=75-KiLPG[om:iW-<3HR9UO6SLWR@=7;[9LH(LMB4L?`0:eR,/;Q]5B]>._=IMRMR6n&V.BbnIcg%CEO[XSXgNHO:[<LF@jgp`F`/q.;B+pCQLMi:N=-<o]h[_Jqc_<B+L<NRHOs!;eRs-)5L"5`5NG6tb;:Ek#CWsP0]+^dPh]3.5]4nYk&/iKXEW;a)Xq:V+FX;8qDo.nJPB``K@DH$]U[aPL9;uTsg*t6-1^B/9[gHic2[5U[g$ej01^3NgcF)B"Ts9%'IiNi>c^-nDf@dhX)VL5O3+3L\Kr::%e\_2K?%G"R.l84#ihfZ+a7\->\f0tA8es62d$P;9lZP[1;cC2kU]gNf5l2)'6.LHo2>-?=%%R4rmDO&C~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 9
|
||||
0000000000 65535 f
|
||||
0000000061 00000 n
|
||||
0000000102 00000 n
|
||||
0000000209 00000 n
|
||||
0000000321 00000 n
|
||||
0000000524 00000 n
|
||||
0000000592 00000 n
|
||||
0000000881 00000 n
|
||||
0000000940 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<3a690545ba6eb066f85a2dabe118b139><3a690545ba6eb066f85a2dabe118b139>]
|
||||
% ReportLab generated PDF document -- digest (opensource)
|
||||
|
||||
/Info 6 0 R
|
||||
/Root 5 0 R
|
||||
/Size 9
|
||||
>>
|
||||
startxref
|
||||
1742
|
||||
%%EOF
|
||||
540
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION.md
Normal file
540
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION.md
Normal file
@@ -0,0 +1,540 @@
|
||||
# Printservice Standalone Java 25 v2.3
|
||||
|
||||
Eigenständiger Druckservice ohne GlassFish/Payara. Die Anwendung läuft als normale Java-Applikation oder über WinSW als Windows-Dienst und stellt ein Webfrontend plus REST-API bereit.
|
||||
|
||||
## Funktionen
|
||||
|
||||
- eigener HTTP-Server aus dem JDK
|
||||
- Webfrontend unter `http://localhost:8080/`
|
||||
- REST-API unter `http://localhost:8080/api`
|
||||
- Drucker-Aliase für `WINDOWS_SPOOLER` und `RAW_TCP`
|
||||
- Windows-/LocalSystem-Assistent für Dienstbetrieb
|
||||
- HTML-Vorlagen mit Online-Editor
|
||||
- HTML-Tabellen über `{{#each:items}} ... {{/each}}`
|
||||
- HTML -> PDF -> Druck
|
||||
- PDF als Vorlage mit Koordinatenfeldern (`PDF_TEMPLATE`)
|
||||
- PDF-Tabellen aus JSON-Arrays
|
||||
- ZPL/EPL/Text RAW-Druck
|
||||
- DOCX-Vorlagen rendern und herunterladen
|
||||
- DOCX -> PDF -> Druck optional über `DOCX4J_FO` ohne LibreOffice
|
||||
- Barcode, QR-Code, DataMatrix und weitere ZXing-Formate
|
||||
- optionale Authentifizierung: wenn deaktiviert, kann jeder per REST drucken
|
||||
- Benutzer-/Tokenverwaltung im Webfrontend
|
||||
- persistente Druckjob-Historie / Druckwarteschlange für Redruck
|
||||
- Filterung der Druckhistorie nach User, Status, Drucker und Vorlage
|
||||
- Admin-Vollansicht der Warteschlange mit `full=true`
|
||||
- produktionsnahe Vorlagenstruktur unter `templates/<templateName>/...`
|
||||
|
||||
## Zielplattform
|
||||
|
||||
- Java 25
|
||||
- Maven 3.9 oder neuer empfohlen
|
||||
- Windows, Linux oder macOS
|
||||
- Windows-Dienstbetrieb über WinSW
|
||||
|
||||
## Build
|
||||
|
||||
```bash
|
||||
mvn clean package
|
||||
```
|
||||
|
||||
Ergebnis:
|
||||
|
||||
```text
|
||||
target/printservice-standalone.jar
|
||||
```
|
||||
|
||||
## Start als Konsole
|
||||
|
||||
Windows:
|
||||
|
||||
```cmd
|
||||
java -Dprintservice.config.dir=C:\printservice -jar target\printservice-standalone.jar --host=0.0.0.0 --port=8080
|
||||
```
|
||||
|
||||
Linux:
|
||||
|
||||
```bash
|
||||
java -Dprintservice.config.dir=/opt/printservice -jar target/printservice-standalone.jar --host=0.0.0.0 --port=8080
|
||||
```
|
||||
|
||||
Danach:
|
||||
|
||||
```text
|
||||
http://localhost:8080/
|
||||
http://localhost:8080/api/diagnostics/system
|
||||
```
|
||||
|
||||
## Konfigurationsstruktur
|
||||
|
||||
Empfohlen unter Windows:
|
||||
|
||||
```text
|
||||
C:\printservice
|
||||
├── auth.json
|
||||
├── printers.json
|
||||
├── queue
|
||||
│ └── print-jobs.json
|
||||
├── templates
|
||||
│ └── <templateName>
|
||||
│ ├── template.json
|
||||
│ ├── document.*
|
||||
│ ├── fields.json
|
||||
│ ├── sample-data.json
|
||||
│ └── print-request.json
|
||||
├── spool
|
||||
├── archive
|
||||
├── preview
|
||||
└── logs
|
||||
```
|
||||
|
||||
Ohne `-Dprintservice.config.dir` nutzt die Anwendung:
|
||||
|
||||
```text
|
||||
%USERPROFILE%\.printservice
|
||||
```
|
||||
|
||||
## Windows-Service mit WinSW
|
||||
|
||||
```powershell
|
||||
mvn clean package
|
||||
.\scripts\install-service.ps1 -InstallDir C:\printservice-app -ConfigDir C:\printservice -Port 8080
|
||||
```
|
||||
|
||||
Danach `WinSW-x64.exe` als `C:\printservice-app\printservice.exe` ablegen und starten:
|
||||
|
||||
```powershell
|
||||
cd C:\printservice-app
|
||||
.\printservice.exe install
|
||||
.\printservice.exe start
|
||||
.\printservice.exe status
|
||||
```
|
||||
|
||||
## Authentifizierung
|
||||
|
||||
Standardmäßig ist Auth deaktiviert. Dann kann jeder, der `/api/print` erreicht, drucken. Das ist für Tests praktisch, aber produktiv nur in geschlossenen Netzen sinnvoll.
|
||||
|
||||
```json
|
||||
{
|
||||
"enabled": false,
|
||||
"protectPrint": true,
|
||||
"protectRenderedDownload": true,
|
||||
"protectPreview": false,
|
||||
"protectAdmin": false,
|
||||
"headerName": "X-Printservice-Token",
|
||||
"tokens": []
|
||||
}
|
||||
```
|
||||
|
||||
### Empfohlener Ablauf im Webfrontend
|
||||
|
||||
1. Webfrontend öffnen.
|
||||
2. Bereich **Authentifizierung, Benutzer und Token**.
|
||||
3. Erst einen Admin-User anlegen, Scope `ALL`.
|
||||
4. Token kopieren und sicher speichern.
|
||||
5. Danach Auth aktivieren.
|
||||
6. Optional `protectAdmin` aktivieren.
|
||||
7. Für Maschinen/Clients eigene User mit Scope `PRINT` anlegen.
|
||||
|
||||
Token werden serverseitig nur als SHA-256-Hash gespeichert. Das Klartext-Token wird nur einmal bei der Erstellung zurückgegeben.
|
||||
|
||||
### REST: Benutzer/Token anlegen
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/auth/users \
|
||||
-H "Content-Type: application/json" \
|
||||
-d @src/main/resources/examples/rest-create-auth-user-request.json
|
||||
```
|
||||
|
||||
Beispiel:
|
||||
|
||||
```json
|
||||
{
|
||||
"userName": "line01",
|
||||
"displayName": "Linie 01",
|
||||
"tokenName": "line01-print-token",
|
||||
"enabled": true,
|
||||
"scopes": ["PRINT", "PREVIEW"]
|
||||
}
|
||||
```
|
||||
|
||||
Antwort enthält das Token einmalig:
|
||||
|
||||
```json
|
||||
{
|
||||
"userName": "line01",
|
||||
"tokenName": "line01-print-token",
|
||||
"token": "NUR_EINMAL_SICHTBAR"
|
||||
}
|
||||
```
|
||||
|
||||
### REST: Auth einschalten
|
||||
|
||||
```bash
|
||||
curl -X PUT http://localhost:8080/api/auth/config \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: ADMIN_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-update-auth-config-enabled-request.json
|
||||
```
|
||||
|
||||
### REST: Drucken mit Token
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/print \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_PRINT_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-print-raw-tcp-zpl-request.json
|
||||
```
|
||||
|
||||
Alternativ:
|
||||
|
||||
```text
|
||||
Authorization: Bearer YOUR_PRINT_TOKEN
|
||||
```
|
||||
|
||||
## Druckwarteschlange / Druckhistorie / Redruck
|
||||
|
||||
Jeder echte Druckjob wird unter `queue/print-jobs.json` gespeichert. Gespeichert werden u. a. Job-ID, Benutzer, Drucker, Vorlage, Render-Modus, Status und der Original-PrintRequest. Dadurch kann der Job später erneut gedruckt werden.
|
||||
|
||||
### Eigene Jobs abrufen
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8080/api/queue?limit=100" \
|
||||
-H "X-Printservice-Token: YOUR_PRINT_TOKEN"
|
||||
```
|
||||
|
||||
Wenn Auth aktiv ist, sieht ein normaler Benutzer nur seine eigenen Jobs.
|
||||
|
||||
### Vollständige Liste abrufen
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8080/api/queue?full=true&limit=500" \
|
||||
-H "X-Printservice-Token: YOUR_ADMIN_TOKEN"
|
||||
```
|
||||
|
||||
`full=true` benötigt Scope `ADMIN` oder `ALL`.
|
||||
|
||||
### Nach User/Status/Vorlage filtern
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8080/api/queue?full=true&user=line01&status=SUBMITTED&templateName=serial_label_zpl" \
|
||||
-H "X-Printservice-Token: YOUR_ADMIN_TOKEN"
|
||||
```
|
||||
|
||||
### Einzelnen Job abrufen
|
||||
|
||||
```bash
|
||||
curl http://localhost:8080/api/queue/JOB_ID \
|
||||
-H "X-Printservice-Token: YOUR_PRINT_TOKEN"
|
||||
```
|
||||
|
||||
### Redruck
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/queue/JOB_ID/reprint \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_PRINT_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-reprint-request.json
|
||||
```
|
||||
|
||||
Beispiel:
|
||||
|
||||
```json
|
||||
{
|
||||
"copies": 1,
|
||||
"printerAlias": "LABEL_LINE_01",
|
||||
"dataOverride": {
|
||||
"reprintReason": "Etikett beschädigt"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ohne `printerAlias` und ohne `dataOverride` wird der Originaljob unverändert erneut gesendet.
|
||||
|
||||
## Druckerarten
|
||||
|
||||
### WINDOWS_SPOOLER
|
||||
|
||||
Für PDF, HTML->PDF, PDF_TEMPLATE und normale Office-/A4-Drucker.
|
||||
|
||||
```json
|
||||
{
|
||||
"alias": "OFFICE_A4",
|
||||
"type": "WINDOWS_SPOOLER",
|
||||
"systemName": "HP_LaserJet_A4",
|
||||
"description": "A4 Drucker über Windows Spooler"
|
||||
}
|
||||
```
|
||||
|
||||
### RAW_TCP
|
||||
|
||||
Für schnelle Etikettendrucker mit ZPL/EPL/ESC-POS/PCL.
|
||||
|
||||
```json
|
||||
{
|
||||
"alias": "LABEL_LINE_01",
|
||||
"type": "RAW_TCP",
|
||||
"host": "192.168.10.50",
|
||||
"port": 9100,
|
||||
"language": "ZPL",
|
||||
"description": "Zebra Etikettendrucker direkt per TCP"
|
||||
}
|
||||
```
|
||||
|
||||
## REST-Endpunkte
|
||||
|
||||
```text
|
||||
GET /api/diagnostics/system
|
||||
GET /api/printers/diagnostics
|
||||
GET /api/printers/scan
|
||||
GET /api/printers
|
||||
POST /api/printers
|
||||
DELETE /api/printers/{alias}
|
||||
GET /api/templates/storage
|
||||
GET /api/templates
|
||||
GET /api/templates/{name}
|
||||
POST /api/templates
|
||||
PUT /api/templates/{name}
|
||||
DELETE /api/templates/{name}
|
||||
GET /api/barcodes/formats
|
||||
GET /api/auth/status
|
||||
GET /api/auth/me
|
||||
GET /api/auth/users
|
||||
POST /api/auth/users
|
||||
DELETE /api/auth/users/{idOrUserName}
|
||||
GET /api/auth/config
|
||||
PUT /api/auth/config
|
||||
POST /api/auth/reload
|
||||
POST /api/print/preview
|
||||
POST /api/print/preview/html
|
||||
POST /api/print/rendered
|
||||
POST /api/print
|
||||
GET /api/docx/converters
|
||||
POST /api/docx/validate
|
||||
GET /api/queue
|
||||
GET /api/queue/{jobId}
|
||||
POST /api/queue/{jobId}/reprint
|
||||
```
|
||||
|
||||
## Render-Modi
|
||||
|
||||
| Modus | Bedeutung |
|
||||
|---|---|
|
||||
| `AUTO` | Modus wird anhand des Vorlagentyps ermittelt |
|
||||
| `RAW` | Text/ZPL/EPL direkt ausgeben |
|
||||
| `PDF` | HTML nach PDF rendern |
|
||||
| `PDF_TEMPLATE` | PDF-Vorlage mit Koordinatenfeldern befüllen |
|
||||
| `DOCX` | DOCX befüllen und als DOCX bereitstellen |
|
||||
|
||||
## Barcode-Platzhalter in HTML/ZPL
|
||||
|
||||
```html
|
||||
<img src="{{barcode:CODE_128:serialNumber:360x90}}">
|
||||
<img src="{{qr:serialNumber}}">
|
||||
<img src="{{data_matrix:serialNumber:120x120}}">
|
||||
```
|
||||
|
||||
ZPL direkt:
|
||||
|
||||
```zpl
|
||||
^FO40,145^BCN,80,Y,N,N^FD{{serialNumber}}^FS
|
||||
^FO40,260^BQN,2,6^FDLA,{{serialNumber}}^FS
|
||||
```
|
||||
|
||||
## HTML-Tabelle
|
||||
|
||||
```html
|
||||
<table>
|
||||
<tbody>
|
||||
{{#each:items}}
|
||||
<tr>
|
||||
<td>{{text:pos}}</td>
|
||||
<td>{{text:partNumber}}</td>
|
||||
<td>{{text:description}}</td>
|
||||
<td>{{text:quantity}}</td>
|
||||
<td><img src="{{barcode:CODE_128:serialNumber:360x90}}"></td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
```
|
||||
|
||||
## PDF_TEMPLATE-Tabelle
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "positionsTable",
|
||||
"type": "TABLE",
|
||||
"source": "items",
|
||||
"page": 1,
|
||||
"x": 18,
|
||||
"y": 78,
|
||||
"width": 174,
|
||||
"height": 125,
|
||||
"rowHeight": 13,
|
||||
"headerHeight": 8,
|
||||
"maxRows": 9,
|
||||
"overflow": "CUT",
|
||||
"fontSize": 7,
|
||||
"border": true,
|
||||
"columns": [
|
||||
{ "title": "Pos.", "field": "pos", "width": 12, "align": "CENTER" },
|
||||
{ "title": "Artikel", "field": "partNumber", "width": 29 },
|
||||
{ "title": "Barcode", "type": "BARCODE", "barcodeType": "CODE_128", "field": "serialNumber", "width": 39 }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## DOCX -> PDF -> Druck ohne LibreOffice: DOCX4J_FO
|
||||
|
||||
Ab v2.3 gibt es zusätzlich zum externen LibreOffice-Weg den Java-only-Konverter:
|
||||
|
||||
```json
|
||||
{
|
||||
"renderMode": "DOCX",
|
||||
"docxConverter": "DOCX4J_FO"
|
||||
}
|
||||
```
|
||||
|
||||
Ablauf:
|
||||
|
||||
```text
|
||||
DOCX-Vorlage
|
||||
-> Platzhalter/Barcode/QR im DOCX füllen
|
||||
-> docx4j-export-fo wandelt DOCX nach XSL-FO
|
||||
-> Apache FOP erzeugt PDF
|
||||
-> PDFBox druckt das PDF
|
||||
```
|
||||
|
||||
Vorteile:
|
||||
|
||||
- keine LibreOffice-Installation notwendig
|
||||
- läuft komplett in der Java-Anwendung
|
||||
- gut für einfache DOCX-Vorlagen mit Text, einfachen Tabellen, Bildern und Kopf-/Fußzeilen
|
||||
- geeignet als optionaler, serverinterner Konverter
|
||||
|
||||
Grenzen:
|
||||
|
||||
- Layouttreue ist nicht so hoch wie bei Word/LibreOffice
|
||||
- komplexe Word-Layouts, Shapes, Textfelder, SmartArt, exakte Seitenumbrüche und komplizierte Tabellen müssen pro Vorlage geprüft werden
|
||||
- für Produktionsdruck ist `PDF_TEMPLATE` oder `HTML -> PDF` weiterhin robuster und meist schneller
|
||||
|
||||
### Konverterstatus abrufen
|
||||
|
||||
```bash
|
||||
curl http://localhost:8080/api/docx/converters
|
||||
```
|
||||
|
||||
### DOCX4J_FO mit einer Vorlage validieren
|
||||
|
||||
```bash
|
||||
curl -X POST "http://localhost:8080/api/docx/validate?converter=DOCX4J_FO" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-validate-docx4j-fo-request.json
|
||||
```
|
||||
|
||||
Beispielrequest:
|
||||
|
||||
```json
|
||||
{
|
||||
"printerAlias": "OFFICE_A4",
|
||||
"templateName": "serienbegleitschein_docx",
|
||||
"renderMode": "DOCX",
|
||||
"docxConverter": "DOCX4J_FO",
|
||||
"includeRenderedBase64": true,
|
||||
"data": {
|
||||
"serialNumber": "SNR000001",
|
||||
"partNumber": "A123456",
|
||||
"workorderNumber": "WO-100200"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Die Validierung prüft technisch, ob DOCX -> PDF erfolgreich erzeugt werden kann. Die Layout-Qualität muss anschließend visuell anhand des erzeugten PDFs geprüft werden.
|
||||
|
||||
### DOCX mit DOCX4J_FO drucken
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/print \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-print-docx4j-fo-request.json
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"printerAlias": "OFFICE_A4",
|
||||
"templateName": "serienbegleitschein_docx",
|
||||
"renderMode": "DOCX",
|
||||
"docxConverter": "DOCX4J_FO",
|
||||
"copies": 1,
|
||||
"pdfDpi": 300,
|
||||
"data": {
|
||||
"serialNumber": "SNR000001",
|
||||
"partNumber": "A123456",
|
||||
"workorderNumber": "WO-100200"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Empfehlung: `DOCX4J_FO` als optionale Alternative einbauen, aber pro Vorlage in der Druckfreigabe validieren. Für feste Formulare bleibt `PDF_TEMPLATE`; für dynamische Tabellen bleibt `HTML -> PDF`; für Etiketten bleibt `RAW_TCP/ZPL` die erste Wahl.
|
||||
|
||||
## Produktionsempfehlungen
|
||||
|
||||
- `RAW_TCP` für ZPL/EPL-Etikettendrucker verwenden.
|
||||
- `PDF_TEMPLATE` für feste A4-Formulare verwenden.
|
||||
- `HTML -> PDF` für flexible Tabellenformulare verwenden.
|
||||
- Authentifizierung mindestens für `/api/print` aktivieren.
|
||||
- Admin-Funktionen nach Initialeinrichtung schützen.
|
||||
- Für Maschinen/Stationen separate Tokens mit eigenem User verwenden.
|
||||
- `C:\printservice` regelmäßig sichern, besonders `templates`, `printers.json`, `auth.json` und `queue/print-jobs.json`.
|
||||
|
||||
|
||||
## HTML→PDF: robuste XHTML-Normalisierung ab v2.3
|
||||
|
||||
Der HTML→PDF-Druckpfad normalisiert HTML-Vorlagen jetzt vor dem PDF-Renderer automatisch zu XHTML. Hintergrund: `openhtmltopdf` ist deutlich strenger als ein Browser. Normales Browser-HTML wie `<br>`, `<img>`, fehlende `</td>` oder ein UTF-8-BOM vor `<html>` kann sonst mit einem XML-Fehler abbrechen, zum Beispiel:
|
||||
|
||||
```text
|
||||
Markup im Dokument vor dem Root-Element muss ordnungsgemäß formatiert sein.
|
||||
```
|
||||
|
||||
Der Service führt deshalb vor dem Rendern aus:
|
||||
|
||||
```text
|
||||
HTML-Vorlage + JSON-Daten
|
||||
→ Platzhalter und Tabellenblöcke rendern
|
||||
→ BOM/ungültige Steuerzeichen entfernen
|
||||
→ HTML-Fragmente bei Bedarf in <html><body>...</body></html> einbetten
|
||||
→ Browser-HTML mit jsoup zu XHTML normalisieren
|
||||
→ openhtmltopdf → PDF
|
||||
→ Druck oder Download
|
||||
```
|
||||
|
||||
Zusätzlich gibt es einen Validierungsendpunkt:
|
||||
|
||||
```http
|
||||
POST /api/html/validate
|
||||
```
|
||||
|
||||
Beispiel:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/html/validate \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-validate-html-pdf-request.json
|
||||
```
|
||||
|
||||
Eine erfolgreiche Antwort enthält unter anderem:
|
||||
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"templateName": "lieferschein_html_table",
|
||||
"renderMode": "PDF",
|
||||
"message": "HTML was rendered and normalized to XHTML successfully. It can be passed to openhtmltopdf."
|
||||
}
|
||||
```
|
||||
|
||||
Wenn die Vorlage versehentlich JSON oder PDF-Inhalt enthält, gibt der Service nun eine verständlichere Fehlermeldung aus, statt nur den SAX/XML-Fehler des Renderers weiterzugeben.
|
||||
BIN
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION.pdf
Normal file
BIN
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION.pdf
Normal file
Binary file not shown.
BIN
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION_v2.2.pdf
Normal file
BIN
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION_v2.2.pdf
Normal file
Binary file not shown.
586
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION_v2.4.md
Normal file
586
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION_v2.4.md
Normal file
@@ -0,0 +1,586 @@
|
||||
# Printservice Standalone Java 25 v2.3
|
||||
|
||||
Eigenständiger Druckservice ohne GlassFish/Payara. Die Anwendung läuft als normale Java-Applikation oder über WinSW als Windows-Dienst und stellt ein Webfrontend plus REST-API bereit.
|
||||
|
||||
## Funktionen
|
||||
|
||||
- eigener HTTP-Server aus dem JDK
|
||||
- Webfrontend unter `http://localhost:8080/`
|
||||
- REST-API unter `http://localhost:8080/api`
|
||||
- Drucker-Aliase für `WINDOWS_SPOOLER` und `RAW_TCP`
|
||||
- Windows-/LocalSystem-Assistent für Dienstbetrieb
|
||||
- HTML-Vorlagen mit Online-Editor
|
||||
- HTML-Tabellen über `{{#each:items}} ... {{/each}}`
|
||||
- HTML -> PDF -> Druck
|
||||
- PDF als Vorlage mit Koordinatenfeldern (`PDF_TEMPLATE`)
|
||||
- PDF-Tabellen aus JSON-Arrays
|
||||
- ZPL/EPL/Text RAW-Druck
|
||||
- DOCX-Vorlagen rendern und herunterladen
|
||||
- DOCX -> PDF -> Druck optional über `DOCX4J_FO` ohne LibreOffice
|
||||
- Barcode, QR-Code, DataMatrix und weitere ZXing-Formate
|
||||
- optionale Authentifizierung: wenn deaktiviert, kann jeder per REST drucken
|
||||
- Benutzer-/Tokenverwaltung im Webfrontend
|
||||
- persistente Druckjob-Historie / Druckwarteschlange für Redruck
|
||||
- Filterung der Druckhistorie nach User, Status, Drucker und Vorlage
|
||||
- Admin-Vollansicht der Warteschlange mit `full=true`
|
||||
- produktionsnahe Vorlagenstruktur unter `templates/<templateName>/...`
|
||||
|
||||
## Zielplattform
|
||||
|
||||
- Java 25
|
||||
- Maven 3.9 oder neuer empfohlen
|
||||
- Windows, Linux oder macOS
|
||||
- Windows-Dienstbetrieb über WinSW
|
||||
|
||||
## Build
|
||||
|
||||
```bash
|
||||
mvn clean package
|
||||
```
|
||||
|
||||
Ergebnis:
|
||||
|
||||
```text
|
||||
target/printservice-standalone.jar
|
||||
```
|
||||
|
||||
## Start als Konsole
|
||||
|
||||
Windows:
|
||||
|
||||
```cmd
|
||||
java -Dprintservice.config.dir=C:\printservice -jar target\printservice-standalone.jar --host=0.0.0.0 --port=8080
|
||||
```
|
||||
|
||||
Linux:
|
||||
|
||||
```bash
|
||||
java -Dprintservice.config.dir=/opt/printservice -jar target/printservice-standalone.jar --host=0.0.0.0 --port=8080
|
||||
```
|
||||
|
||||
Danach:
|
||||
|
||||
```text
|
||||
http://localhost:8080/
|
||||
http://localhost:8080/api/diagnostics/system
|
||||
```
|
||||
|
||||
## Konfigurationsstruktur
|
||||
|
||||
Empfohlen unter Windows:
|
||||
|
||||
```text
|
||||
C:\printservice
|
||||
├── auth.json
|
||||
├── printers.json
|
||||
├── queue
|
||||
│ └── print-jobs.json
|
||||
├── templates
|
||||
│ └── <templateName>
|
||||
│ ├── template.json
|
||||
│ ├── document.*
|
||||
│ ├── fields.json
|
||||
│ ├── sample-data.json
|
||||
│ └── print-request.json
|
||||
├── spool
|
||||
├── archive
|
||||
├── preview
|
||||
└── logs
|
||||
```
|
||||
|
||||
Ohne `-Dprintservice.config.dir` nutzt die Anwendung:
|
||||
|
||||
```text
|
||||
%USERPROFILE%\.printservice
|
||||
```
|
||||
|
||||
## Windows-Service mit WinSW
|
||||
|
||||
```powershell
|
||||
mvn clean package
|
||||
.\scripts\install-service.ps1 -InstallDir C:\printservice-app -ConfigDir C:\printservice -Port 8080
|
||||
```
|
||||
|
||||
Danach `WinSW-x64.exe` als `C:\printservice-app\printservice.exe` ablegen und starten:
|
||||
|
||||
```powershell
|
||||
cd C:\printservice-app
|
||||
.\printservice.exe install
|
||||
.\printservice.exe start
|
||||
.\printservice.exe status
|
||||
```
|
||||
|
||||
## Authentifizierung
|
||||
|
||||
Standardmäßig ist Auth deaktiviert. Dann kann jeder, der `/api/print` erreicht, drucken. Das ist für Tests praktisch, aber produktiv nur in geschlossenen Netzen sinnvoll.
|
||||
|
||||
```json
|
||||
{
|
||||
"enabled": false,
|
||||
"protectPrint": true,
|
||||
"protectRenderedDownload": true,
|
||||
"protectPreview": false,
|
||||
"protectAdmin": false,
|
||||
"headerName": "X-Printservice-Token",
|
||||
"tokens": []
|
||||
}
|
||||
```
|
||||
|
||||
### Empfohlener Ablauf im Webfrontend
|
||||
|
||||
1. Webfrontend öffnen.
|
||||
2. Bereich **Authentifizierung, Benutzer und Token**.
|
||||
3. Erst einen Admin-User anlegen, Scope `ALL`.
|
||||
4. Token kopieren und sicher speichern.
|
||||
5. Danach Auth aktivieren.
|
||||
6. Optional `protectAdmin` aktivieren.
|
||||
7. Für Maschinen/Clients eigene User mit Scope `PRINT` anlegen.
|
||||
|
||||
Token werden serverseitig nur als SHA-256-Hash gespeichert. Das Klartext-Token wird nur einmal bei der Erstellung zurückgegeben.
|
||||
|
||||
### REST: Benutzer/Token anlegen
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/auth/users \
|
||||
-H "Content-Type: application/json" \
|
||||
-d @src/main/resources/examples/rest-create-auth-user-request.json
|
||||
```
|
||||
|
||||
Beispiel:
|
||||
|
||||
```json
|
||||
{
|
||||
"userName": "line01",
|
||||
"displayName": "Linie 01",
|
||||
"tokenName": "line01-print-token",
|
||||
"enabled": true,
|
||||
"scopes": ["PRINT", "PREVIEW"]
|
||||
}
|
||||
```
|
||||
|
||||
Antwort enthält das Token einmalig:
|
||||
|
||||
```json
|
||||
{
|
||||
"userName": "line01",
|
||||
"tokenName": "line01-print-token",
|
||||
"token": "NUR_EINMAL_SICHTBAR"
|
||||
}
|
||||
```
|
||||
|
||||
### REST: Auth einschalten
|
||||
|
||||
```bash
|
||||
curl -X PUT http://localhost:8080/api/auth/config \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: ADMIN_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-update-auth-config-enabled-request.json
|
||||
```
|
||||
|
||||
### REST: Drucken mit Token
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/print \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_PRINT_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-print-raw-tcp-zpl-request.json
|
||||
```
|
||||
|
||||
Alternativ:
|
||||
|
||||
```text
|
||||
Authorization: Bearer YOUR_PRINT_TOKEN
|
||||
```
|
||||
|
||||
## Druckwarteschlange / Druckhistorie / Redruck
|
||||
|
||||
Jeder echte Druckjob wird unter `queue/print-jobs.json` gespeichert. Gespeichert werden u. a. Job-ID, Benutzer, Drucker, Vorlage, Render-Modus, Status und der Original-PrintRequest. Dadurch kann der Job später erneut gedruckt werden.
|
||||
|
||||
### Eigene Jobs abrufen
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8080/api/queue?limit=100" \
|
||||
-H "X-Printservice-Token: YOUR_PRINT_TOKEN"
|
||||
```
|
||||
|
||||
Wenn Auth aktiv ist, sieht ein normaler Benutzer nur seine eigenen Jobs.
|
||||
|
||||
### Vollständige Liste abrufen
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8080/api/queue?full=true&limit=500" \
|
||||
-H "X-Printservice-Token: YOUR_ADMIN_TOKEN"
|
||||
```
|
||||
|
||||
`full=true` benötigt Scope `ADMIN` oder `ALL`.
|
||||
|
||||
### Nach User/Status/Vorlage filtern
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8080/api/queue?full=true&user=line01&status=SUBMITTED&templateName=serial_label_zpl" \
|
||||
-H "X-Printservice-Token: YOUR_ADMIN_TOKEN"
|
||||
```
|
||||
|
||||
### Einzelnen Job abrufen
|
||||
|
||||
```bash
|
||||
curl http://localhost:8080/api/queue/JOB_ID \
|
||||
-H "X-Printservice-Token: YOUR_PRINT_TOKEN"
|
||||
```
|
||||
|
||||
### Redruck
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/queue/JOB_ID/reprint \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_PRINT_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-reprint-request.json
|
||||
```
|
||||
|
||||
Beispiel:
|
||||
|
||||
```json
|
||||
{
|
||||
"copies": 1,
|
||||
"printerAlias": "LABEL_LINE_01",
|
||||
"dataOverride": {
|
||||
"reprintReason": "Etikett beschädigt"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ohne `printerAlias` und ohne `dataOverride` wird der Originaljob unverändert erneut gesendet.
|
||||
|
||||
## Druckerarten
|
||||
|
||||
### WINDOWS_SPOOLER
|
||||
|
||||
Für PDF, HTML->PDF, PDF_TEMPLATE und normale Office-/A4-Drucker.
|
||||
|
||||
```json
|
||||
{
|
||||
"alias": "OFFICE_A4",
|
||||
"type": "WINDOWS_SPOOLER",
|
||||
"systemName": "HP_LaserJet_A4",
|
||||
"description": "A4 Drucker über Windows Spooler"
|
||||
}
|
||||
```
|
||||
|
||||
### RAW_TCP
|
||||
|
||||
Für schnelle Etikettendrucker mit ZPL/EPL/ESC-POS/PCL.
|
||||
|
||||
```json
|
||||
{
|
||||
"alias": "LABEL_LINE_01",
|
||||
"type": "RAW_TCP",
|
||||
"host": "192.168.10.50",
|
||||
"port": 9100,
|
||||
"language": "ZPL",
|
||||
"description": "Zebra Etikettendrucker direkt per TCP"
|
||||
}
|
||||
```
|
||||
|
||||
## REST-Endpunkte
|
||||
|
||||
```text
|
||||
GET /api/diagnostics/system
|
||||
GET /api/printers/diagnostics
|
||||
GET /api/printers/scan
|
||||
GET /api/printers
|
||||
POST /api/printers
|
||||
DELETE /api/printers/{alias}
|
||||
GET /api/templates/storage
|
||||
GET /api/templates
|
||||
GET /api/templates/{name}
|
||||
POST /api/templates
|
||||
PUT /api/templates/{name}
|
||||
DELETE /api/templates/{name}
|
||||
GET /api/barcodes/formats
|
||||
GET /api/auth/status
|
||||
GET /api/auth/me
|
||||
GET /api/auth/users
|
||||
POST /api/auth/users
|
||||
DELETE /api/auth/users/{idOrUserName}
|
||||
GET /api/auth/config
|
||||
PUT /api/auth/config
|
||||
POST /api/auth/reload
|
||||
POST /api/print/preview
|
||||
POST /api/print/preview/html
|
||||
POST /api/print/rendered
|
||||
POST /api/print
|
||||
GET /api/docx/converters
|
||||
POST /api/docx/validate
|
||||
GET /api/queue
|
||||
GET /api/queue/{jobId}
|
||||
POST /api/queue/{jobId}/reprint
|
||||
```
|
||||
|
||||
## Render-Modi
|
||||
|
||||
| Modus | Bedeutung |
|
||||
|---|---|
|
||||
| `AUTO` | Modus wird anhand des Vorlagentyps ermittelt |
|
||||
| `RAW` | Text/ZPL/EPL direkt ausgeben |
|
||||
| `PDF` | HTML nach PDF rendern |
|
||||
| `PDF_TEMPLATE` | PDF-Vorlage mit Koordinatenfeldern befüllen |
|
||||
| `DOCX` | DOCX befüllen und als DOCX bereitstellen |
|
||||
|
||||
## Barcode-Platzhalter in HTML/ZPL
|
||||
|
||||
```html
|
||||
<img src="{{barcode:CODE_128:serialNumber:360x90}}">
|
||||
<img src="{{qr:serialNumber}}">
|
||||
<img src="{{data_matrix:serialNumber:120x120}}">
|
||||
```
|
||||
|
||||
ZPL direkt:
|
||||
|
||||
```zpl
|
||||
^FO40,145^BCN,80,Y,N,N^FD{{serialNumber}}^FS
|
||||
^FO40,260^BQN,2,6^FDLA,{{serialNumber}}^FS
|
||||
```
|
||||
|
||||
## HTML-Tabelle
|
||||
|
||||
```html
|
||||
<table>
|
||||
<tbody>
|
||||
{{#each:items}}
|
||||
<tr>
|
||||
<td>{{text:pos}}</td>
|
||||
<td>{{text:partNumber}}</td>
|
||||
<td>{{text:description}}</td>
|
||||
<td>{{text:quantity}}</td>
|
||||
<td><img src="{{barcode:CODE_128:serialNumber:360x90}}"></td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
```
|
||||
|
||||
## PDF_TEMPLATE-Tabelle
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "positionsTable",
|
||||
"type": "TABLE",
|
||||
"source": "items",
|
||||
"page": 1,
|
||||
"x": 18,
|
||||
"y": 78,
|
||||
"width": 174,
|
||||
"height": 125,
|
||||
"rowHeight": 13,
|
||||
"headerHeight": 8,
|
||||
"maxRows": 9,
|
||||
"overflow": "CUT",
|
||||
"fontSize": 7,
|
||||
"border": true,
|
||||
"columns": [
|
||||
{ "title": "Pos.", "field": "pos", "width": 12, "align": "CENTER" },
|
||||
{ "title": "Artikel", "field": "partNumber", "width": 29 },
|
||||
{ "title": "Barcode", "type": "BARCODE", "barcodeType": "CODE_128", "field": "serialNumber", "width": 39 }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## DOCX -> PDF -> Druck ohne LibreOffice: DOCX4J_FO
|
||||
|
||||
Ab v2.3 gibt es zusätzlich zum externen LibreOffice-Weg den Java-only-Konverter:
|
||||
|
||||
```json
|
||||
{
|
||||
"renderMode": "DOCX",
|
||||
"docxConverter": "DOCX4J_FO"
|
||||
}
|
||||
```
|
||||
|
||||
Ablauf:
|
||||
|
||||
```text
|
||||
DOCX-Vorlage
|
||||
-> Platzhalter/Barcode/QR im DOCX füllen
|
||||
-> docx4j-export-fo wandelt DOCX nach XSL-FO
|
||||
-> Apache FOP erzeugt PDF
|
||||
-> PDFBox druckt das PDF
|
||||
```
|
||||
|
||||
Vorteile:
|
||||
|
||||
- keine LibreOffice-Installation notwendig
|
||||
- läuft komplett in der Java-Anwendung
|
||||
- gut für einfache DOCX-Vorlagen mit Text, einfachen Tabellen, Bildern und Kopf-/Fußzeilen
|
||||
- geeignet als optionaler, serverinterner Konverter
|
||||
|
||||
Grenzen:
|
||||
|
||||
- Layouttreue ist nicht so hoch wie bei Word/LibreOffice
|
||||
- komplexe Word-Layouts, Shapes, Textfelder, SmartArt, exakte Seitenumbrüche und komplizierte Tabellen müssen pro Vorlage geprüft werden
|
||||
- für Produktionsdruck ist `PDF_TEMPLATE` oder `HTML -> PDF` weiterhin robuster und meist schneller
|
||||
|
||||
### Konverterstatus abrufen
|
||||
|
||||
```bash
|
||||
curl http://localhost:8080/api/docx/converters
|
||||
```
|
||||
|
||||
### DOCX4J_FO mit einer Vorlage validieren
|
||||
|
||||
```bash
|
||||
curl -X POST "http://localhost:8080/api/docx/validate?converter=DOCX4J_FO" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-validate-docx4j-fo-request.json
|
||||
```
|
||||
|
||||
Beispielrequest:
|
||||
|
||||
```json
|
||||
{
|
||||
"printerAlias": "OFFICE_A4",
|
||||
"templateName": "serienbegleitschein_docx",
|
||||
"renderMode": "DOCX",
|
||||
"docxConverter": "DOCX4J_FO",
|
||||
"includeRenderedBase64": true,
|
||||
"data": {
|
||||
"serialNumber": "SNR000001",
|
||||
"partNumber": "A123456",
|
||||
"workorderNumber": "WO-100200"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Die Validierung prüft technisch, ob DOCX -> PDF erfolgreich erzeugt werden kann. Die Layout-Qualität muss anschließend visuell anhand des erzeugten PDFs geprüft werden.
|
||||
|
||||
### DOCX mit DOCX4J_FO drucken
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/print \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-print-docx4j-fo-request.json
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"printerAlias": "OFFICE_A4",
|
||||
"templateName": "serienbegleitschein_docx",
|
||||
"renderMode": "DOCX",
|
||||
"docxConverter": "DOCX4J_FO",
|
||||
"copies": 1,
|
||||
"pdfDpi": 300,
|
||||
"data": {
|
||||
"serialNumber": "SNR000001",
|
||||
"partNumber": "A123456",
|
||||
"workorderNumber": "WO-100200"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Empfehlung: `DOCX4J_FO` als optionale Alternative einbauen, aber pro Vorlage in der Druckfreigabe validieren. Für feste Formulare bleibt `PDF_TEMPLATE`; für dynamische Tabellen bleibt `HTML -> PDF`; für Etiketten bleibt `RAW_TCP/ZPL` die erste Wahl.
|
||||
|
||||
## Produktionsempfehlungen
|
||||
|
||||
- `RAW_TCP` für ZPL/EPL-Etikettendrucker verwenden.
|
||||
- `PDF_TEMPLATE` für feste A4-Formulare verwenden.
|
||||
- `HTML -> PDF` für flexible Tabellenformulare verwenden.
|
||||
- Authentifizierung mindestens für `/api/print` aktivieren.
|
||||
- Admin-Funktionen nach Initialeinrichtung schützen.
|
||||
- Für Maschinen/Stationen separate Tokens mit eigenem User verwenden.
|
||||
- `C:\printservice` regelmäßig sichern, besonders `templates`, `printers.json`, `auth.json` und `queue/print-jobs.json`.
|
||||
|
||||
|
||||
## HTML→PDF: robuste XHTML-Normalisierung ab v2.3
|
||||
|
||||
Der HTML→PDF-Druckpfad normalisiert HTML-Vorlagen jetzt vor dem PDF-Renderer automatisch zu XHTML. Hintergrund: `openhtmltopdf` ist deutlich strenger als ein Browser. Normales Browser-HTML wie `<br>`, `<img>`, fehlende `</td>` oder ein UTF-8-BOM vor `<html>` kann sonst mit einem XML-Fehler abbrechen, zum Beispiel:
|
||||
|
||||
```text
|
||||
Markup im Dokument vor dem Root-Element muss ordnungsgemäß formatiert sein.
|
||||
```
|
||||
|
||||
Der Service führt deshalb vor dem Rendern aus:
|
||||
|
||||
```text
|
||||
HTML-Vorlage + JSON-Daten
|
||||
→ Platzhalter und Tabellenblöcke rendern
|
||||
→ BOM/ungültige Steuerzeichen entfernen
|
||||
→ HTML-Fragmente bei Bedarf in <html><body>...</body></html> einbetten
|
||||
→ Browser-HTML mit jsoup zu XHTML normalisieren
|
||||
→ openhtmltopdf → PDF
|
||||
→ Druck oder Download
|
||||
```
|
||||
|
||||
Zusätzlich gibt es einen Validierungsendpunkt:
|
||||
|
||||
```http
|
||||
POST /api/html/validate
|
||||
```
|
||||
|
||||
Beispiel:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/html/validate \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-validate-html-pdf-request.json
|
||||
```
|
||||
|
||||
Eine erfolgreiche Antwort enthält unter anderem:
|
||||
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"templateName": "lieferschein_html_table",
|
||||
"renderMode": "PDF",
|
||||
"message": "HTML was rendered and normalized to XHTML successfully. It can be passed to openhtmltopdf."
|
||||
}
|
||||
```
|
||||
|
||||
Wenn die Vorlage versehentlich JSON oder PDF-Inhalt enthält, gibt der Service nun eine verständlichere Fehlermeldung aus, statt nur den SAX/XML-Fehler des Renderers weiterzugeben.
|
||||
|
||||
|
||||
## v2.4: Lieferschein-Demos und HTML->PDF Fehlerbehebung
|
||||
|
||||
### HTML->PDF Fehler "Markup im Dokument vor dem Root-Element"
|
||||
Der HTML->PDF Pfad normalisiert HTML jetzt vor dem openhtmltopdf Renderer. Dadurch werden typische Ursachen abgefangen: UTF-8 BOM, HTML-Fragmente ohne Root-Element, nicht XML-konforme Tags wie `<br>`, `<hr>` oder `<img>` ohne schließenden Slash.
|
||||
|
||||
Validierung vor dem Druck:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/html/validate \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Printservice-Token: YOUR_TOKEN" \
|
||||
-d @src/main/resources/examples/rest-validate-html-pdf-request.json
|
||||
```
|
||||
|
||||
### Einfache PDF-Lieferscheinvorlage
|
||||
|
||||
```text
|
||||
config-example/templates/lieferschein_pdf_simple/
|
||||
├── template.json
|
||||
├── document.pdf
|
||||
├── fields.json
|
||||
├── sample-data.json
|
||||
└── print-request.json
|
||||
```
|
||||
|
||||
### DOCX-Lieferscheinvorlage
|
||||
|
||||
```text
|
||||
config-example/templates/lieferschein_docx/
|
||||
├── template.json
|
||||
├── document.docx
|
||||
├── sample-data.json
|
||||
├── print-request.json
|
||||
└── validate-request.json
|
||||
```
|
||||
|
||||
Barcode-/QR-Platzhalter in DOCX müssen alleine in einem Absatz stehen:
|
||||
|
||||
```text
|
||||
{{barcode:CODE_128:serialNumber:360x90}}
|
||||
{{qr:serialNumber}}
|
||||
```
|
||||
|
||||
Für Druck ohne LibreOffice verwendet das Beispiel `docxConverter=DOCX4J_FO`. Jede DOCX-Vorlage sollte vor produktiver Nutzung validiert werden.
|
||||
BIN
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION_v2.4.pdf
Normal file
BIN
docs/PRINTSERVICE_STANDALONE_DOKUMENTATION_v2.4.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user