2012-11-24 13 views
7

Mam pytanie dotyczące drukowania dodatkowych informacji na temat kodów kreskowych. Używam http://barbecue.sourceforge.net/ do tworzenia moich kodów kreskowych.Jak zwiększyć jakość tekstu Graphics2D?

Po utworzeniu kodów kreskowych chcę dodać dodatkowe informacje. W tej chwili robię to w następujący sposób! Na przykład:

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(); 

Wyjście jest w formacie pdf następujące: enter image description here

Jak widać jest jakość mojego tekstu (nad i pod kodem kreskowym) jest naprawdę źle ... Jak Podnoszę jakość tekstu, aby tekst był bardziej płynny, a nie pikselowany ?!

(Kiedy drukować moje kody kreskowe, kody kreskowe wyglądają bardzo piksele ...)

Wszelkie wskazówki?

UPDATE:

Więc dodałem tu zdjęcie mojego najnowszego rezultatu ... Kiedy wydrukować te kody kreskowe wyglądają straszne! Oto kod, który zrobiłem:

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(); 

Dzięki temu kodowi uzyskuję najlepsze wyniki! Oczywiście grałem z "Metrics, AA_GASP, LCS_HRGB, różne czcionki (Verdana jest moim zdaniem najlepsza) ..." i wiele więcej, ale niektórych z nich nie mogłem użyć, bo wtedy mój kod kreskowy się zatarł! Tak więc w rzeczywistości zmuszam problem, że nie jestem w stanie poprawić jakości mojej jakości tekstowej sznurka z graphics2d!

Chciałbym zapytać, czy istnieje możliwość, aby "SSYYS" (rozmiar czcionki 11) i "FLORETT" (rozmiar czcionki 7) wyglądały o wiele ładniej! Czy w JAVA istnieje możliwość narysowania "gładkiego" tekstu na obrazie o wielkości czcionki mniejszej niż "12"? Czy istnieje obejście tego? Jak widać na rysunku litery „S i Y” wyglądają bardzo straszne ...

2-ty Aktualizacja:

Niektóre Przykład kodu tak daleko ... Proszę się upewnić, że istnieje następujący folder: C: \ TestBarcodes \

nadzieję, że mój kod zredukowane do minimum, które można sobie wyobrazić, co mój problem ...

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

Eksperymentuj z możliwościami łatwo, używając kodu na [ta odpowiedź] (http://stackoverflow.com/questions/5995798/java-text-on-image/5998015#5998015). –

+0

Dziękuję za twój post, ale to nie pomogło:/Grałem przez ostatnie 5 dni, aby poprawić jakość tekstu ... ALE nie mogłem tego zarządzać ... Jest bardzo pikselowane !! Czy istnieje kolejna okazja, aby podnieść jakość tekstu?! Coś innego niż Graphics2D?! Czy java nie może obsługiwać tak małego rozmiaru czcionki?! Zaktualizowałem swój post, że możesz zobaczyć, co mam do tej pory, ale nawet "SSYYS" (rozmiar czcionki 13 jest bardzo pikselowany) ... – Sway

+0

Następny poziom pomocy. Aby uzyskać lepszą pomoc wcześniej, opublikuj [SSCCE] (http://sscce.org/). –

Odpowiedz

2

Jeśli ktoś chce użyć wizerunki piksela w takich przypadkach, a nie wektor, następnie obraz powinien być skalowany dla lepszej jakości druku:

static final int PIXELS_PER_POINT = 4; // 4x 

Następnie określić wszystkie wymiary w punktach, nie w pikselach:

// 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; 

teraz, kiedy wykonywał żadnej rysunek, zawsze wykorzystać punkty zamienione na piksele:

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; 
} 

Dzięki temu podejściu można operować przy użyciu "standardowych" wymiarów.To podejście sprawdza się całkiem dobrze w przypadku rysunków o małej i średniej złożoności.

Można pójść dalej i konwertować PIXELS_PER_POINT do parametru: użyj 1x dla obrazów na stronach internetowych ze zwykłego wyświetlacza 2x dla wyświetlaczy Retina i 4x do druku!

+0

Nie należy PIXELS_PER_POINT być typu double, obliczane przez coś podobnego: PIXELS_PER_POINT = 300./90. dla wydruku 300 dpi (zakładając, że standardowe monitory mają 90dpi) PIXELS_PER_POINT = 600./90. na wydruk 600dpi ... i tak dalej – alfonx