iText only paints what java.awt.Font.layoutGlyphVector() returns, other methods may give other results. I'm curious as to where does it get the symbols as arialuni.ttf only has plane 1 Unicode.
Paulo ----- Original Message ----- From: "Justin Dolezy" <[email protected]> To: "Post all your questions about iText here" <[email protected]> Sent: Sunday, November 15, 2009 2:12 PM Subject: Re: [iText-questions] Some unicode chars incorrect whenpainteddirectly (Double sharp and double flat musical symbols) > Hmm... but in that case wouldn't it also paint incorrectly on screen, no? > > It looks fine when painted on a JFrame! > > Justin > > > On 15 Nov 2009, at 13:58, Paulo Soares wrote: > >> It may be a limitation of the java.awt.Font.layoutGlyphVector() on >> surrogates. >> >> Paulo >> >> ----- Original Message ----- >> From: "Justin Dolezy" <[email protected]> >> To: <[email protected]> >> Sent: Saturday, November 14, 2009 6:21 PM >> Subject: [iText-questions] Some unicode chars incorrect when >> painteddirectly >> (Double sharp and double flat musical symbols) >> >> >>> Hi, >>> >>> I'm creating PDF content by drawing direct to the Graphics2D surface >>> (via >>> PdfTemplate.createGraphicsShapes). It's my understanding that no fonts >>> are >>> (or even need to be) embedded, so what is draw to the Graphics2D is what >>> will appear on the PDF. >>> >>> However there are 2 unicode musical symbol chars (double flat: 𝄫 and >>> double sharp: 𝄪) which do not appear correctly - they actually appear >>> as >>> Far Eastern characters (looks Chinese to my uneducated guess!). The >>> regular flat and sharp musical symbols are fine. >>> >>> I'm running this on Mac OS X - code pasted below so you can reproduce >>> this >>> easily. Windows machines will need the Arial Unicode MS font installed. >>> >>> All the symbols appear fine if I put the StringPainter widget below in a >>> JFrame, but make them paint to the PDF and it goes wrong. >>> >>> I'm guessing this is an iText bug? Or am I doing something wrong here? >>> Seems pretty straightforward! >>> >>> Thanks for any tips or confirmation that it's a bug :) >>> Justin >>> >>> >>> --- EXAMPLE CODE DEMONSTRATING THE PROBLEM IN THE OUTPUT PDF: ---- >>> >>> package com.neckdiagrams.exporters; >>> >>> import java.awt.Dimension; >>> import java.awt.Font; >>> import java.awt.Graphics; >>> import java.awt.Graphics2D; >>> import java.io.FileOutputStream; >>> >>> import javax.swing.JComponent; >>> >>> import com.lowagie.text.Chunk; >>> import com.lowagie.text.Document; >>> import com.lowagie.text.DocumentException; >>> import com.lowagie.text.pdf.PdfContentByte; >>> import com.lowagie.text.pdf.PdfTemplate; >>> import com.lowagie.text.pdf.PdfWriter; >>> >>> public class PdfUnicodeTextImageTest >>> { >>> public static final String FLAT_SYMBOL = "\u266D"; >>> public static final String SHARP_SYMBOL = "\u266F"; >>> >>> public static final String DOUBLE_FLAT_SYMBOL = "\uD834\uDD2B"; >>> public static final String DOUBLE_SHARP_SYMBOL = "\uD834\uDD2A"; >>> >>> >>> >>> >>> >>> public static void main(String[] args) throws InterruptedException >>> { >>> new PdfUnicodeTextImageTest(); >>> Thread.sleep(2000); >>> System.exit(0); >>> } >>> >>> >>> >>> public PdfUnicodeTextImageTest() >>> { >>> try >>> { >>> final FileOutputStream fileOutputStream = new >>> FileOutputStream("/tmp/unicode_test.pdf"); >>> final Document document = new Document(); >>> final PdfWriter pdf = PdfWriter.getInstance(document, >>> fileOutputStream); >>> >>> >>> >>> try >>> { >>> document.open(); >>> document.setPageSize(new >>> com.lowagie.text.Rectangle(500,800)); >>> document.newPage(); >>> >>> >>> >>> printPage(document, pdf); >>> } >>> finally >>> { >>> document.close(); >>> fileOutputStream.flush(); >>> fileOutputStream.close(); >>> } >>> } >>> catch (Exception e) >>> { >>> e.printStackTrace(); >>> } >>> } >>> >>> private void printPage(Document document, PdfWriter pdf) throws >>> DocumentException >>> { >>> document.add(new Chunk(" ")); >>> final PdfContentByte contentbytes = pdf.getDirectContent(); >>> final PdfTemplate template = contentbytes.createTemplate(500, >>> 800); >>> final Graphics2D graphics2d = template.createGraphicsShapes(500, >>> 800); >>> >>> StringPainter painter = new StringPainter(new Font("Arial Unicode >>> MS", Font.PLAIN, 16)); >>> painter.setBounds(50,50,200,100); >>> painter.paint(graphics2d); >>> >>> >>> >>> graphics2d.dispose(); >>> contentbytes.addTemplate(template, 0, 0); >>> } >>> >>> class StringPainter extends JComponent >>> { >>> private Font font; >>> >>> >>> >>> public StringPainter(Font font) >>> { >>> this.font = font; >>> } >>> >>> >>> >>> @Override >>> protected void paintComponent(Graphics g) >>> { >>> super.paintComponent(g); >>> >>> >>> >>> Graphics2D g2 = (Graphics2D) g; >>> >>> >>> >>> g2.setFont(font); >>> >>> >>> >>> g2.drawString("TEST: " + FLAT_SYMBOL + " " + >>> DOUBLE_FLAT_SYMBOL, 10, 50); >>> g2.drawString("TEST: " + SHARP_SYMBOL + " " + >>> DOUBLE_SHARP_SYMBOL, 10, 80); >>> } >>> } >>> } ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ iText-questions mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/itext-questions Buy the iText book: http://www.1t3xt.com/docs/book.php Check the site with examples before you ask questions: http://www.1t3xt.info/examples/ You can also search the keywords list: http://1t3xt.info/tutorials/keywords/
