You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "John Hewson (JIRA)" <ji...@apache.org> on 2015/12/02 18:25:11 UTC

[jira] [Commented] (PDFBOX-3150) IllegalArgumentException in getStringWidth/showText

    [ https://issues.apache.org/jira/browse/PDFBOX-3150?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15036188#comment-15036188 ] 

John Hewson commented on PDFBOX-3150:
-------------------------------------

{quote}
As this is a quite common scenario, I suggest you provide a possibility to provide a fallback codepoint that can be used for all non-printable characters.
{quote}

Our philosophy is that we won't return broken values for strings which we can't measure.

{quote}
another issue is, that "PDFont.encode (int)" is not public - it would help to change this as well. Shall I create a separate issue?
{quote}

It's deliberate because people were constantly misusing that method. We don't allow PDFBox to create broken PDFs.

The PDF text model doesn't have a concept of newline characters, so that's something you need to address in your code - you're going to need to convert newlines into explicit text moving operators. 

If you have other Unicode characters which you're not sure if the font supports then you can retrieve the TTF's cmap via TrueTypeFont #getUnicodeCmap() then you can call getGlyphId(unicode) and if the result is non-zero then the glyph is present in the font.

> IllegalArgumentException in getStringWidth/showText
> ---------------------------------------------------
>
>                 Key: PDFBOX-3150
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-3150
>             Project: PDFBox
>          Issue Type: Bug
>          Components: PDModel
>    Affects Versions: 2.0.0
>         Environment: 2.0.0-RC2
>            Reporter: Philip Helger
>            Assignee: John Hewson
>
> I want to get the string width using a Type0 font. Because I'm using a character not in the font (e.g. '\n') I'm getting the following exception:
> {code}
> Exception in thread "main" java.lang.IllegalArgumentException: No glyph for U+000A in font OpenSans
> 	at org.apache.pdfbox.pdmodel.font.PDCIDFontType2.encode(PDCIDFontType2.java:401)
> 	at org.apache.pdfbox.pdmodel.font.PDType0Font.encode(PDType0Font.java:351)
> 	at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:283)
> 	at org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:312)
> {code}
> As this is a quite common scenario, I suggest you provide a possibility to provide a fallback codepoint that can be used for all non-printable characters.
> A similiar exception happens when trying to print the text via the PDPageContentStream:
> {code}
> Exception in thread "main" java.lang.IllegalArgumentException: No glyph for U+000A in font OpenSans
> 	at org.apache.pdfbox.pdmodel.font.PDCIDFontType2.encode(PDCIDFontType2.java:401)
> 	at org.apache.pdfbox.pdmodel.font.PDType0Font.encode(PDType0Font.java:351)
> 	at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:283)
> 	at org.apache.pdfbox.pdmodel.PDPageContentStream.showText(PDPageContentStream.java:341)
> {code}
> I finally ended up creating my own "font.encode" method (with a lot of other hacks) that basically does the following:
> {code}
>    final byte [] aFallbackBytes = aFont.encode (nFallbackCodepoint);
>        byte [] aCPBytes;
>       try
>       {
>         // This method is package private
>         aCPBytes = aFont.encode (nCP);
>       }
>       catch (final IllegalArgumentException ex) {
>         aCPBytes = aFallbackBytes;
>       }
> {code}
> -> another issue is, that "PDFont.encode (int)" is not public - it would help to change this as well. Shall I create a separate issue?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org