EAN13 Font auf graphics g erzeugt Monospaces

amasingh

Mitglied
Hallo zusammen,

ich habe ein Programm zum drucken von Barcodes geschrieben.
Leider erzeugt die verwendete Schrift bei mir Abstände zwischen den Zeichen die dort nicht sein dürften.
Es werden einfach alle Zeichen gleich breit gemacht - doch manche dürfen nicht so breit sein.

Hier habe ich die Schrift her:
Stuff here!: Creating high quality EAN-13 barcodes for free with Microsoft Excel, Word

So setze ich Sie:
Java:
Font font = new Font("Code EAN13", Font.TRUETYPE_FONT, 30);
g.setFont(font);

Es müsste sowas wie "non-monospace" oder so geben.

Vielleicht weiß ja jemand was man machen könnte. Schonmal vielen Dank!
 

amasingh

Mitglied
Genau - monospace lässt alle Zeichen eben gleichen Platz verbrauchen.
Die Schrift scheint das aber nur bei Java zu machen - in Word zb nicht.

Du meinst sans serif anstatt der ean13 Schrift nutzen

[EDIT]Hat keiner ne Ahnung?[/EDIT]
 

Pentalon

Bekanntes Mitglied
Dem ganzen ist auch ein Excel Worksheet beigefügt, dass aus einer 12-Stelligen Zahl einen EAN13 Code macht.
Der Quellcode des VB Programmes ist da auch dabei:

Code:
Public Function ean13$(chaine$)
  'V 1.0
  'Paramètres : une chaine de 12 chiffres
  'Retour : * une chaine qui, affichée avec la police EAN13.TTF, donne le code barre
  '         * une chaine vide si paramètre fourni incorrect
  Dim i%, checksum%, first%, CodeBarre$, tableA As Boolean
  ean13$ = ""
  'Vérifier qu'il y a 12 caractères
  If Len(chaine$) = 12 Then
    'Et que ce sont bien des chiffres
    For i% = 1 To 12
      If Asc(Mid$(chaine$, i%, 1)) < 48 Or Asc(Mid$(chaine$, i%, 1)) > 57 Then
        i% = 0
        Exit For
      End If
    Next
    If i% = 13 Then
      'Calcul de la clé de contrôle
      For i% = 2 To 12 Step 2
        checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
      Next
      checksum% = checksum% * 3
      For i% = 1 To 11 Step 2
        checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
      Next
      chaine$ = chaine$ & (10 - checksum% Mod 10) Mod 10
      'Le premier chiffre est pris tel quel, le deuxième vient de la table A
      CodeBarre$ = Left$(chaine$, 1) & Chr$(65 + Val(Mid$(chaine$, 2, 1)))
      first% = Val(Left$(chaine$, 1))
      For i% = 3 To 7
        tableA = False
         Select Case i%
         Case 3
           Select Case first%
           Case 0 To 3
             tableA = True
           End Select
         Case 4
           Select Case first%
           Case 0, 4, 7, 8
             tableA = True
           End Select
         Case 5
           Select Case first%
           Case 0, 1, 4, 5, 9
             tableA = True
           End Select
         Case 6
           Select Case first%
           Case 0, 2, 5, 6, 7
             tableA = True
           End Select
         Case 7
           Select Case first%
           Case 0, 3, 6, 8, 9
             tableA = True
           End Select
         End Select
       If tableA Then
         CodeBarre$ = CodeBarre$ & Chr$(65 + Val(Mid$(chaine$, i%, 1)))
       Else
         CodeBarre$ = CodeBarre$ & Chr$(75 + Val(Mid$(chaine$, i%, 1)))
       End If
     Next
      CodeBarre$ = CodeBarre$ & "*"   'Ajout séparateur central
      For i% = 8 To 13
        CodeBarre$ = CodeBarre$ & Chr$(97 + Val(Mid$(chaine$, i%, 1)))
      Next
      CodeBarre$ = CodeBarre$ & "+"   'Ajout de la marque de fin
      ean13$ = CodeBarre$
    End If
  End If
End Function

Pentalon
 

amasingh

Mitglied
Danke für den Hinweis - das passt nur leider garnicht zum Topic ;)
Der von dir gepostete Code erzeugt aus der EAN die entsprechenden Zeichen damit man die Schrift korrekt nutzen kann - das habe ich aber schon längst umgesetzt.

Problem ist einfach wenn ich die Schrift auf ein graphics Object zeichne, dass zwischen den einzelnen Zeichen viel zu große Abstände gelassen werden, nur bei breiteren Zeichen ist der Abstand nicht vorhanden (Java macht einfach alle Zeichen gleich breit)
 
S

Spacerat

Gast
1. Einen Font mit der Konstante Font.TRUETYPE_FONT zu instanzieren ist Käse.
2. Der von dir gewählte Konstruktor erkennt nur installierte System-Fonts. Willst du 'ne anwendungsspezifische Fontdatei aus einem beliebigen Verzeichnis laden musst du das mit "Font.createFont(int type, File datei)" machen. Dazu ist dann im übrigen auch die von dir verwendete Konstante gedacht.
 

amasingh

Mitglied
Zu 1. welche Konstante soll ich stattdessen nehmen?
Zu 2. das ist mir klar - habs schon mit Font.createFont versucht - funktioniert soweit einwandfrei - nur fügt er damit nach wie vor die freien "Bereiche" hinzu. Er macht es aber scheinbar nur mit genau dieser Schrift - mit keiner anderen.

[EDIT]Male nun jedes Barcode Zeichen einzeln. So kann ich den Abstand wenigstens selbst bestimmen - zwar ne extremst unschöne Lösung aber keine Ahnung was ich sonst tun soll. Falls jemand doch noch ne Idee hat - gerne her damit ;)
Denn mit der Lösung kann ich jetzt zB die Schriftgröße des Barcode nicht ändern ohne alle Abstände wieder anzupassen.[/EDIT]
 
S

Spacerat

Gast
Also in den von dir verwendeten Konstruktor gehört definitiv eine STYLE-Konstante, also BOLD, PLAIN, ITALIC.
Monospaced (DIALOG) ist Javas Fallback-Font, wenn der angegebene Font nicht gefunden wurde. Wenn die TTF-Datei vorhanden ist und das angegebene Verzeichnis stimmt, sollte der Font auch per createFont geladen werden können.
Alternativ dazu kannst du den Font auch als Systemfont installieren (Anleitungen dazu gibt es im Netz zu häuf) und mit getAvailableFonts (oder war's getFontAvailabe ???:L) nachsehen, ob er Java dann zur Verfügung steht.
 

amasingh

Mitglied
Wie gesagt - mit dem Laden des Fonts habe ich keine Probleme ;) Nur damit dass Java die Zeichen als "monospace" behandelt und alle Zeichen so breit macht wie das breiteste Zeichen, welches die Schrift bietet. Doch einige Zeichen sind nur halb so breit und das versteht Java nicht.
 
S

Spacerat

Gast
Okay... Ich hab' mir den Font mal besorgt und ähhh... hast du dir den schon mal im Preview oder besser in der Zeichentabelle angesehen? Das ist so ungefähr eine Art "WingDings"-Font. Mit nomalen Buchstaben- oder Zahlenfolgen wird man damit wohl nur eher zufällig 'ne korrekte Anzeige bekommen. Der Zeichentabelle kannst du die Codes für die jeweiligen Zeichen entnehmen, die du in Java als Unicode ('\u00ab' z.B.) verwenden musst, um das gewünschte anzuzeigen.
 

amasingh

Mitglied
Das hört sich ja schonmal nach nem funktionierenden Ansatz an ;)
Wo kann ich mir die Zeichentabelle anschauen? Hast du das getestet mit den Unicodes? Verstehe aber nicht wieso man das bei Java so machen muss wenn es denn klappt!?

[EDIT]So - habe es nun getestet - auch mit Unicodes liefert Java nicht das gewünschte Ergebnis. Es wird nach wie vor freier Platz zwischen den Zeichen erzeugt wo keiner sein darf. Sämtliche Schreibprogramme die ich getestet hab machen dies nicht. Scheinbar nur Java (auch HTML macht es korrekt ;) )

Java:
g.drawString("\u0030\u0044\u0042\u0041", 10, 10 );
[/EDIT]
 
S

Spacerat

Gast
Aber Java nicht... diese Art Wingdings-Fonts (recherchiert: Symbolfonts) nutzen, so wie ich das verstanden habe, eine andere Unicode-Range (z.B. '\u26xx' bis '\u27xx') damit sie sich nicht mit normalen Charachtern beissen. Leider funktioniert das beim EAN13-Font irgendwie nicht. Evtl. muss man erst die korrekte Range suchen.
Java:
		Font f;
		try {
			f = Font.createFont(Font.TRUETYPE_FONT, new File("ean13.ttf"));
		} catch(Exception e) {
			f = Font.getFont(Font.MONOSPACED);
		}
		f = f.deriveFont(24.0F);
		List<Integer> g = new ArrayList<>();
		int c = 0;
		for(; c < 0x10000; c++) {
			if(f.canDisplay((char) c)) {
				g.add(c);
			}
		}
		c = 0;
		char[] glyphs = new char[g.size()];
		for(Integer i : g) {
			glyphs[c++] = (char) i.intValue();
		}
"glyphs" enhält nun alle für ean13 gültigen Zeichen (aber frag' mich nicht, wie man die korrekt mapped ;)).
 
Zuletzt bearbeitet von einem Moderator:

amasingh

Mitglied
Werd das direkt mal testen.

[EDIT]Geil :) Wäre ich nie drauf gekommen - aber mit den "glyphs" geht es - dann behandelt Java es bei der Ausgabe scheinbar nicht mehr als normale Zeichen.
Jetzt ist wirklich nur noch die Frage nach dem Mapping. Aktuell gebe ich einfach alle hintereinander aus zum testen.
Aber schon mal VIELEN Dank!!!

Java:
Font f = new Font(eanFont, Font.TRUETYPE_FONT, 36);
        f = f.deriveFont(24.0F);
        ArrayList<Integer> myList = new ArrayList<>();
        int c = 0;
        for(; c < 0x10000; c++) {
            if(f.canDisplay((char) c)) {
                myList.add(c);
            }
        }
        c = 0;
        char[] glyphs = new char[myList.size()];
        for(Integer i : myList) {
            glyphs[c++] = (char) i.intValue();
        }
        g.drawString(new String(glyphs), x-200, y + 21);
[/EDIT]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Erste Schritte Java not setting Font?? Java Basics - Anfänger-Themen 2
U PDFbox boxable font awesome-webfont Java Basics - Anfänger-Themen 3
K Font mit gleichem Zeichenabstand Java Basics - Anfänger-Themen 2
L Standard Font ändern Java Basics - Anfänger-Themen 4
B Font Namen ermitteln Java Basics - Anfänger-Themen 7
Y performanceProblem mit Font in applet Java Basics - Anfänger-Themen 8
V Text Unterstreichen/Fett/Kursiv/Font ändern? Java Basics - Anfänger-Themen 8
hdi font.getBounds(String) Java Basics - Anfänger-Themen 21
D Truetype Font einlesen Java Basics - Anfänger-Themen 2
G iText mehrdeutiges Font Java Basics - Anfänger-Themen 2
N Font resizen funktioniert nicht? Java Basics - Anfänger-Themen 12
T Globale Variable (Font) Java Basics - Anfänger-Themen 21
G Font Color von JLabel verändern Java Basics - Anfänger-Themen 1
S button font Java Basics - Anfänger-Themen 4
F Font-Objekt mit z.B. Italic und Bold ? Java Basics - Anfänger-Themen 3
V JLabel Mehrzeilig und Font ändern Java Basics - Anfänger-Themen 4
C font color Java Basics - Anfänger-Themen 5
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
H Eingabe tätigen bevor Graphics g Fenster öffnet Java Basics - Anfänger-Themen 5
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
CptK Interface Bilder mit Graphics g zeichnen Java Basics - Anfänger-Themen 7
J Erste Schritte drawLine Methode der Graphics Klasse Java Basics - Anfänger-Themen 2
J GUI / Graphics Java Basics - Anfänger-Themen 2
H Graphics / repaint Java Basics - Anfänger-Themen 8
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
R Cast java.awt.Graphics Java Basics - Anfänger-Themen 7
Azazel (Anfängerhilfe) awt.Graphics Schwierigkeiten Java Basics - Anfänger-Themen 6
I Methoden public void paintComponent (Graphics g) Java Basics - Anfänger-Themen 4
B Erste Schritte Anzeige von Graphics Objekten einzeln aktualisieren Java Basics - Anfänger-Themen 1
S Farbige Lebensleiste mit Graphics? Java Basics - Anfänger-Themen 10
S Ein Graphics Obejct mehrmals mit denselben Eigenschaften zeichnen lassen?!?!? Java Basics - Anfänger-Themen 4
S G Graphics Java Basics - Anfänger-Themen 1
thet1983 g.Graphics löschen? Java Basics - Anfänger-Themen 1
M Probleme mit paint() aus java.awt.Graphics Java Basics - Anfänger-Themen 2
N Graphics to png Java Basics - Anfänger-Themen 10
N Methode draw(Graphics g) aufrufen Java Basics - Anfänger-Themen 6
Dogge Problem mit paint(Graphics g) im Applet Java Basics - Anfänger-Themen 13
J Problem mit paint(Graphics g) Java Basics - Anfänger-Themen 4
J Jtable änderung soll graphics aktualisieren Java Basics - Anfänger-Themen 4
J JAVA Graphics Java Basics - Anfänger-Themen 5
A Graphics Objekt verhält sich merkwürdig Java Basics - Anfänger-Themen 2
G DRUCKEN von z.B. eines JFrame über print(Graphics g) Java Basics - Anfänger-Themen 9
Maxim6394 Probleme mit Graphics Java Basics - Anfänger-Themen 7
W von Graphics in BufferedImage Java Basics - Anfänger-Themen 10
M OOP Graphics immer selbstbezihend Java Basics - Anfänger-Themen 12
K Problem mit Parameter von paint(Graphics g) Java Basics - Anfänger-Themen 3
T Transparente Bilder mit Graphics zeichnen Java Basics - Anfänger-Themen 17
H Probleme mit Graphics G Java Basics - Anfänger-Themen 2
M Schiebepuzzle: MouseListener und Graphics? Java Basics - Anfänger-Themen 6
J Graphics g Java Basics - Anfänger-Themen 4
H Probleme mit Graphics Java Basics - Anfänger-Themen 5
B MouseListener & Graphics Java Basics - Anfänger-Themen 10
M Graphics zeichnen Java Basics - Anfänger-Themen 2
F Graphics PDFBox Java Basics - Anfänger-Themen 9
M kurze Frage zu Graphics Java Basics - Anfänger-Themen 5
Luk10 Buch für Swing/Awt/Graphics Java Basics - Anfänger-Themen 4
M Java Graphics etc. Java Basics - Anfänger-Themen 2
M Concurrency und Graphics Java Basics - Anfänger-Themen 9
F Was ist Graphics g wirklich? Java Basics - Anfänger-Themen 5
J Klasse Graphics Nullpointerexception Java Basics - Anfänger-Themen 8
P Frage zu Graphics Java Basics - Anfänger-Themen 2
O graphics methode zeigt mein bild nicht an Java Basics - Anfänger-Themen 7
F Zweite Graphics-Methode wird nicht ausgeführt Java Basics - Anfänger-Themen 4
T rotes herz public void paint(Graphics g) Java Basics - Anfänger-Themen 2
G paintComponent(Graphics g) Java Basics - Anfänger-Themen 2
eQui Oberfläche mit Graphics zeichnen Java Basics - Anfänger-Themen 11
S Dicke bei Graphics Ovject einstellen Java Basics - Anfänger-Themen 2
V KSKB zum Verständnis von Graphics und paintComponent Java Basics - Anfänger-Themen 6
G mit Graphics erzeugte Strings verschwinden sofort wieder Java Basics - Anfänger-Themen 7
T Graphics von java.awt.Frame soll sich inhalt merken Java Basics - Anfänger-Themen 3
G Graphics-Object skalieren Java Basics - Anfänger-Themen 9
G Constructor & Graphics g Java Basics - Anfänger-Themen 5
F Frage zum Graphics Objekt Java Basics - Anfänger-Themen 3
D Instanz von Graphics in run() Java Basics - Anfänger-Themen 8
B Mouseevents und Graphics Java Basics - Anfänger-Themen 11
D Abstrakte Klasse Graphics Java Basics - Anfänger-Themen 3
W Verständisfrage zu Graphics Objekt Java Basics - Anfänger-Themen 3
P umwandeln von graphics nach image Java Basics - Anfänger-Themen 4
A Graphics g, AdjustmentEvent e Java Basics - Anfänger-Themen 5
Dilandau paint(Graphics g) { unbekannt in try{} / catch{} }? Java Basics - Anfänger-Themen 5
S Graphics Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben