2012-11-24 10 views
7

Ho una domanda riguardante la stampa di ulteriori informazioni sui codici a barre. Sto usando http://barbecue.sourceforge.net/ per creare i miei codici a barre.Come aumentare la qualità del testo di Graphics2D?

Dopo aver creato i codici a barre, desidero aggiungere ulteriori informazioni. Al momento lo faccio con il seguente modo! Per esempio:

Graphics2D g2d5 = container4Barcode.createGraphics(); 
g2d5.setBackground(Color.WHITE); 
g2d5.clearRect(0, 33, 200, 200); 
g2d5.setColor(Color.BLACK); 
g2d5.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
    RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
g2d5.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
    RenderingHints.VALUE_TEXT_ANTIALIAS_GASP); 
g2d5.setFont(new Font("Arial", Font.PLAIN, 8)); 
g2d5.drawString(barcode, 8, 40); 
g2d5.drawString(generateRandomNumber(ekPreis), 57, 40); 
String datumResult = datum; 
g2d5.drawString(location, 98, 40); 
g2d5.drawString(datum.substring(2), 114, 40); 
g2d5.dispose(); 

L'uscita è in un pdf i seguenti: enter image description here

Come si può vedere è la qualità del mio testo (sopra e sotto il codice a barre) è davvero male ... Come può Aumentare la qualità del testo per rendere il testo più agevole e non quello pixellato ?!

(Quando stampo i miei codici a barre, i codici a barre sembrano molto pixel ...)

Qualche consiglio?

UPDATE:

Così, ho aggiunto qui l'una foto del mio ultimo risultato ... Quando stampo questi codici a barre si guardano orribile! Quindi ecco il codice cosa ho fatto:

Graphics2D g2d6 = container4Barcode.createGraphics(); 
g2d6.setColor(Color.black); 
g2d6.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
    RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
g2d6.setFont(new Font("Verdana", Font.BOLD, 7)); 
g2d6.drawString("FLORETT", 9, 20); 
g2d6.drawString("50-521-60", 57, 20); 
Graphics2D g2d4 = container4Barcode.createGraphics(); 
g2d4.setColor(Color.black); 
g2d4.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
    RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
g2d4.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, 
    RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
g2d4.setFont(new Font("Verdana", Font.BOLD, 11)); 
g2d4.drawString("SSYYS", 105, 19); 
g2d4.dispose(); 

Con quel codice ottengo i migliori risultati! Naturalmente ho suonato con "Metrics, AA_GASP, LCS_HRGB, diversi tipi di carattere (Verdana è il migliore secondo me) ..." e molto altro, ma alcuni di loro non ho potuto usarli, perché il mio codice a barre si è offuscato! Quindi sto forzatamente costringendo il problema a non essere in grado di migliorare la qualità della mia qualità di testo del cordoncino da graphics2d!

Quindi, voglio chiedere se c'è la possibilità di lasciare che "SSYYS" (dimensione carattere 11) e "FLORETT" (dimensione carattere 7) siano molto più belli! C'è una possibilità in JAVA di disegnare un testo "liscio" su un'immagine con una dimensione del carattere inferiore a "12"? C'è una soluzione a questo? Come si può vedere nella foto le lettere "S e Y" sembrano molto orribile ...

2 ° Aggiornamento:

qualche esempio di codice fino ad ora ... Si prega di essere sicuri che esista la seguente cartella: C: \ TestBarcodes \

Speranza ho ridotto il mio codice al minimo che si può immaginare ciò che il mio problema è ...

package generator; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import net.sourceforge.barbecue.Barcode; 
import net.sourceforge.barbecue.BarcodeException; 
import net.sourceforge.barbecue.BarcodeFactory; 
import net.sourceforge.barbecue.output.OutputException; 

import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; 

public class BarcodeGen { 

    // sets the picWidth 
    private static int picWidth = 149; 
    // sets the picHeigth 
    private static int picHeigth = 60; 

    public static void main(String[] args) 
     throws BarcodeException, OutputException, COSVisitorException, IOException { 
    generateBarcode("11138500"); 
    } 

    public static void generateBarcode(String barcode) 
     throws IOException, COSVisitorException, BarcodeException, OutputException { 

    Barcode barcode2 = BarcodeFactory.createCode39(barcode, false); 
    int gw = barcode2.getWidth(); 
    // change this to suit if you want higher, default 50 
    // barcode2.setBarWidth(50); 
    // this sets DPI 
    barcode2.setResolution(100); 
    // barcode2.setFont(font); 
    int gh = barcode2.getHeight(); 
    // change this if you want a coloured background 
    // image = new BufferedImage(t, s, BufferedImage.TYPE_INT_RGB) 
    BufferedImage image = new BufferedImage(gw, gh, BufferedImage.TYPE_INT_RGB); 

    Graphics2D g2 = (Graphics2D) image.getGraphics(); 
    // default is black so draw a white box first 
    // change type to INT_RGB if you want a coloured background 
    g2.setColor(Color.white); 
    g2.fillRect(0, 0, gw, gh); 
    barcode2.draw(g2, 0, 0); 

    // CREATE ADDITIONAL INFORMATION ON BARCODE 

    BufferedImage container4Barcode = new BufferedImage(
     picWidth, picHeigth, image.getType()); 
    Graphics2D g2d = container4Barcode.createGraphics(); 

    g2d.setBackground(Color.WHITE); 
    g2d.clearRect(0, 0, picWidth, picHeigth); 
    g2d.setColor(Color.black); 
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
     RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); 
    g2d.drawImage(image, 8, 21, 130, 18, null); 
    g2d.dispose(); 

    Graphics2D g2d6 = container4Barcode.createGraphics(); 
    g2d6.setColor(Color.black); 
    g2d6.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
     RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
    g2d6.setFont(new Font("Verdana", Font.BOLD, 7)); 

    g2d6.drawString("FLORETT", 9, 20); 
    g2d6.drawString("50-521-60", 57, 20); 

    Graphics2D g2d4 = container4Barcode.createGraphics(); 
    g2d4.setColor(Color.black); 
    g2d4.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
     RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
    g2d4.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, 
     RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
    g2d4.setFont(new Font("Verdana", Font.BOLD, 11)); 
    g2d4.drawString("SSYYS", 105, 19); 
    g2d4.dispose(); 

    // PRINT PDF 

    int ver = 782; 

    PDDocument doc = new PDDocument(); 
    PDPage page = new PDPage(PDPage.PAGE_SIZE_A4); 
    doc.addPage(page); 

    PDXObjectImage image2 = new PDJpeg(doc, container4Barcode); 
    PDPageContentStream content = new PDPageContentStream(doc, page); 
    content.drawImage(image2, 5, ver); 
    content.close(); 

    doc.save(new FileOutputStream("C:\\TestBarcodes\\barcode.pdf")); 

    // opens the pdf file 
    Process p = Runtime 
     .getRuntime() 
     .exec("rundll32 url.dll,FileProtocolHandler C:\\TestBarcodes\\barcode.pdf"); 
    try { 
     p.waitFor(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 
} 

enter image description here

+2

Sperimenta facilmente le possibilità, utilizzando il codice su [questa risposta] (http://stackoverflow.com/questions/5995798/java-text-on-image/5998015#5998015). –

+0

Grazie per il tuo post, ma questo non ha aiutato:/Ho giocato negli ultimi 5 giorni per aumentare la qualità del testo ... MA non ce l'ho fatta ... È molto pixelato !! C'è un'altra opportunità per aumentare la qualità del testo?! Qualcos'altro oltre a Graphics2D?! O non può java trattare con una dimensione del carattere così piccola ?! Ho aggiornato il mio post per vedere che cosa ho fino ad ora, ma anche per "SSYYS" (la dimensione del carattere 13 è molto pixelata) ... – Sway

+0

Il prossimo livello di aiuto. Per un aiuto migliore prima, pubblica un [SSCCE] (http://sscce.org/). –

risposta

2

Se qualcuno vuole usare immagini pixel in questi casi, e non vettoriale, quindi immagine dovrebbero essere modificate in scala per una migliore qualità di stampa:

static final int PIXELS_PER_POINT = 4; // 4x 

quindi definire tutte le dimensioni in punti, non in pixel:

// Image size in points 
static final int IMAGE_WIDTH = 150; 
static final int IMAGE_HEIGHT = 60; 
// Font size in points 
static final int FONT_SIZE = 11; 

Ora, quando fare qualsiasi disegno, utilizzare sempre i punti convertiti in pixel:

static int toPixels(int value) { 
    return value * PIXELS_PER_POINT; 
} 

BufferedImage draw() { 
    BufferedImage image = 
     new BufferedImage(toPixels(IMAGE_WIDTH), toPixels(IMAGE_HEIGHT), TYPE_INT_ARGB); 
    Graphics2D g = image.createGraphics(); 
    // <graphics init code goes here> 

    Font font = new Font("Arial", Font.PLAIN, toPixels(FONT_SIZE)); 
    g.setFont(font); 
    g.drawString("Grapes", toPixels(5), toPixels(40)); // coordinates are in points 

    g.dispose() 
    return image; 
} 

Quindi, con questo approccio è possibile operare con dimensioni 'standard'.Questo approccio funziona abbastanza bene per i disegni a bassa e media complessità.

si può andare oltre e convertire PIXELS_PER_POINT a un parametro: utilizzare 1x per le immagini sulle pagine web con visualizzazione normale, 2x per i display Retina e 4x per stampare!

+0

Se PIXELS_PER_POINT non è di tipo double, calcolato da qualcosa come: PIXELS_PER_POINT = 300./90. per una stampa a 300 dpi (supponendo che i monitor standard abbiano 90 dpi) PIXELS_PER_POINT = 600./90. per una stampa di 600 dpi ... e così via – alfonx

Problemi correlati