Hello,

I have got some problems to render the word "Cœur" (that means "heart" in
French) because of the "œ" character, the glyph width is not the good value.

I am using FreeSerif truetype font downloadable from here :
http://packages.debian.org/squeeze/all/ttf-freefont
Generated PDFs can be accesed here:
http://www.4shared.com/office/mOkLEPGd/out2.html
http://www.4shared.com/office/kngqxy7X/out1.html

I am using version 1.6 of PDFBOX

First I try :
        String message = "Cœur";
        PDDocument doc = null;
        try
        {
            doc = new PDDocument();
            PDPage page = new PDPage();
            doc.addPage(page);
            PDTrueTypeFont font = PDTrueTypeFont.loadTTF(doc,
                    "/usr/share/fonts/truetype/
freefont/FreeSerif.ttf");

            Encoding e = EncodingManager.INSTANCE.getEncoding(
                    COSName.WIN_ANSI_ENCODING);
            PDPageContentStream contentStream = new PDPageContentStream(doc,
                    page);
            contentStream.beginText();
            contentStream.setFont(font, 24);
            contentStream.moveTextPositionByAmount(100, 700);
            contentStream.drawString(message);
            contentStream.endText();
            contentStream.close();
            doc.save("out1.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (COSVisitorException e) {
            e.printStackTrace();
        }
        finally
        {
            if (doc != null)
            {
                try {
                    doc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

But the result out1.pdf facin the bug PDFBOX-1242 (
https://issues.apache.org/jira/browse/PDFBOX-1242)

So I am using code points to render the pdf:

        String message = "Cœur";
        PDDocument doc = null;
        try
        {
            doc = new PDDocument();
            PDPage page = new PDPage();
            doc.addPage(page);
            PDTrueTypeFont font = PDTrueTypeFont.loadTTF(doc,
                    "/usr/share/fonts/truetype/freefont/FreeSerif.ttf");

            Encoding e = EncodingManager.INSTANCE.getEncoding(
                    COSName.WIN_ANSI_ENCODING);
            PDPageContentStream contentStream = new PDPageContentStream(doc,
                    page);
            contentStream.beginText();
            contentStream.setFont(font, 24);
            contentStream.moveTextPositionByAmount(100, 700);
            char[] mechars = message.toCharArray();
            StringBuilder codesstring = new StringBuilder();
            Map<String, Integer> m = e.getNameToCodeMap();
            for (int i = 0; i < mechars.length; i++) {
                char c = mechars[i];
                String name = e.getNameFromCharacter(c);
                int code = e.getCode(name);
                codesstring.appendCodePoint(code);
            }
            contentStream.drawString(codesstring.toString());
            contentStream.endText();
            contentStream.close();
            doc.save("out2.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (COSVisitorException e) {
            e.printStackTrace();
        }
        finally
        {
            if (doc != null)
            {
                try {
                    doc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

The glyph "œ" is correct now but the next letter partially recovert it (see
out2.pdf).

The character "EM DASH" have the same problem.

I looked at the PDTrueTypeFont class and the width looks correctly parsed
by PDFBOX:

339 : œ : 709 : 709.0

(inserting this in the class:
for( int i=0; i<widthValues.length ; i++ )
            {
                if(glyphToCCode[i]-firstChar < widths.size() &&
glyphToCCode[i]-firstChar >= 0
                        && widths.get( glyphToCCode[i]-firstChar) == zero )
                {
                    System.out.println(glyphToCCode[i] + " : " +(new
StringBuilder()).appendCodePoint(glyphToCCode[i]) + " : " + widthValues[i]
+ " : " + widthValues[i]*scaling);
                    widths.set( glyphToCCode[i]-firstChar,
widthValues[i]*scaling );
                }
            }
)

I also notice that the width used to render the glyph is the "zero" value :
float zero = 250;
defined in the method loadDescriptorDictionary of class PDTrueTypeFont.

I have no more clue to investigate as the glyph have is width correctly
defined, so help will be greatly appreciated!

Regards,
Kévin

Reply via email to