[java] afdrukken op afwijkend (tov ISO) formaat (labels)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Ik maak gebruik van een labelprinter waarmee ik informatie moet afdrukken op labels van een formaat van 31.8 mm breed en 9.5 mm hoog. De labelprinter waarmee ik dit afdruk gaat niet uit van de labels die aanwezig zijn, maar drukt af aan de hand van de hoogte-informatie over de pagina die wordt gestuurd door programma's (een A4 resulteert in zo'n 30 labels.
Voor het afdrukken vanuit java maak ik gebruik van de javax.print-api icm een Printable-object dat afgedrukt wordt.
Om af te drukken wordt er vanuit java op 2 manieren een grootte doorgegeven, namelijk het gebied waarbinnen afgedrukt wordt en het formaat van de pagina waarop afgedrukt wordt.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Custom extends MediaSizeName { public Custom(int id) { super(id); } }
Custom LABEL = new Custom(100);
PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
[..]
MediaPrintableArea mpa = new MediaPrintableArea(0f, 0f, width, height, MediaPrintableArea.MM);
MediaSize ms = new MediaSize(width, height, MediaSize.MM, LABEL);

attributeSet.add(LABEL);
attributeSet.add(mpa);
[...]
DocPrintJob dbj = aPrintService.createPrintJob();
Doc doc = new SimpleDoc(pr, DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);
dpj.print(doc, attributeSet);

Het doorgeven van het formaat van een pagina gaat via de class Custom (aanpak hiervandaan (duits, 2006))
Het probleem is dat als ik afdruk dat er dan in totaal 4 labels wordt afgedrukt terwijl het formaat klopt, om het verder te testen (en ribbon + labels een beetje te sparen) maak ik gebruik van PDFCreator om het resultaat te zien. In PDFCreator wordt een formaat opgegeven van 1.01*1.46 inch (25.7*37.1 mm), afgerond is het het A10 formaat.
Hoe kan ik via java doorgeven wat het formaat van de pagina (label) is die afgedrukt moet worden als deze afwijkt van standaard formaten?

MediaSize.findMedia(width, height, MediaSize.MM) levert een NPE op.

[ Voor 0% gewijzigd door Shadowman op 05-07-2010 14:55 . Reden: extends vergeten ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13-09 09:39

Janoz

Moderator Devschuur®

!litemod

Waarom maak je eigenlijk die omweg via de Custom class? Zoals de code nu is compileert het volgens mij niet eens (of heb je om de code in te korten de extends bij de Custom weggelaten).

Werkt het niet gewoon wanneer je iets doet als :

Java:
1
2
MediaSize ms = new MediaSize(width, height, Size2DSyntax.MM);
attributeSet.add(ms);


MediaSize implementeerd immers gewoon de Attribute interface.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Die had ik nog niet toegelicht hierin (wel geprobeerd).

Uit de documentatie:
ClassCastException - (unchecked exception) Thrown if the attribute is not an instance of interface PrintRequestAttribute.

De add-functie verwacht als parameter een PrintRequestAttribute, maar heeft (ik neem aan dat het is overgenomen van een meer algemene interface) als parameter het type Attribute.

Custom is dus een subclass van MediaSizeName (nog even goed in de topicstart gezet)

[ Voor 10% gewijzigd door Shadowman op 05-07-2010 14:55 ]


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Schopje

Acties:
  • 0 Henk 'm!

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 24-08 23:40

Killemov

Ik zoek nog een mooi icooi =)

Hmmm, lastig ... native printen vanuit Java heeft altijd al wat haken en ogen gehad.
Moet je een specifieke driver gebruiken voor de labelprinter?
Ik heb zelf goeie ervaringen met het gebruikt van iText icm diverse labelprinters. Je kunt met iText een pdf vanaf scratch maken maar ook een bestaande pdf aanpassen.

Hey ... maar dan heb je ook wat!


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Geen echte ervaring met deze API, maar zou je niet MediaPrintableArea moeten gebruiken ipv MediaSize? Als ik het goed begrijp, is MediaSize alleen bedoeld om de juiste tray van de printer te kiezen, en heeft het verder weinig te maken met het echte formaat van het papier.

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Ik gebruik MediaPrintableArea (regel 5 & 9), maar die geeft voor zover ik kan zien aan op welk gebied van het papier geprint moet worden, de printer neemt dan aan dat het A4 is, of anders als ik het opgeef, waardoor er 1 label wordt geprint + stel lege labels en verkeerd uitgelijnd voor de volgende print (begint halverwege de label bij de volgende print).

@Killemov: Ik zal maandag naar iText kijken. De driver die ik gebruik is de windowsdriver voor de labelprinter.

De printer ziet er zo uit, kan nu niet controleren of het exact hetzelfde type is.
Pagina: 1