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

Darren Croft commented on PDFBOX-4379:
--------------------------------------

Thanks for looking at this. It is still confusing to me. In a few simple tests, 
hasGlyph did return true for ASCII characters that are in a font and false when 
an emoji is not. It just doesn't tell me when an emoji is in the font.

Here is an expanded test that shows what I mean. hasGlyph appears to do what I 
want for normal characters but from what you're saying, I shouldn't depend on 
it....

Thanks!

 
{code:java}
import java.io.IOException;
import java.io.InputStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType0Font;

/**
*
* @author darren
*/
public class FontTest {

public static void main(String[] args) throws IOException {

try {
   PDDocument doc = new PDDocument();
   PDPage page = new PDPage(PDRectangle.LETTER);
   doc.addPage(page);

   InputStream in = FontTest.class.getResourceAsStream("/Symbola_hint.ttf");
   PDType0Font emojiFont = PDType0Font.load(doc, in);

   in = FontTest.class.getResourceAsStream("/Quicksand-Bold.ttf");
   PDType0Font font = PDType0Font.load(doc, in);

   //create a test string that has normal characters and an emoji
   int emojiCodepoint=0x1F609;
   String testString="Start " + new String(Character.toChars(emojiCodepoint)) + 
" End";


   PDPageContentStream stream = new PDPageContentStream(doc, page);
   stream.beginText();
   stream.setLeading(12 * 1.2f);


   //Loop through each character. Use normal font if it contains glyph 
otherwise use symbol font
   final int length = testString.length();
   for (int offset = 0; offset < length;) {

      //check if glyph is in main font
      final int codepoint = testString.codePointAt(offset);
      if (font.hasGlyph(codepoint)) {
         stream.setFont(font, 12);
      } else {
         //check if glyph is in the emojifont
         if (emojiFont.hasGlyph(codepoint)) {
            System.out.println("has Glyph");
         } else {
            System.out.println("no Glyph");
         }
         stream.setFont(emojiFont, 12);
      }
      stream.showText(new String(Character.toChars(codepoint)));

      offset += Character.charCount(codepoint);
   }

   stream.endText();
   stream.close();
   doc.save("emojiTest.pdf");
   } catch (Exception exception) {
      System.out.println(exception.getMessage());
      exception.printStackTrace();
   }
}
}

{code}
 

 

> hasGlyph returns false when a two character glyph does exist
> ------------------------------------------------------------
>
>                 Key: PDFBOX-4379
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-4379
>             Project: PDFBox
>          Issue Type: Bug
>          Components: FontBox
>    Affects Versions: 2.0.12
>            Reporter: Darren Croft
>            Priority: Major
>         Attachments: Symbola_hint.ttf
>
>
> The following codes runs without exception and adds the glyph to the page, 
> but it prints "no glyph" to standard output. It should print "has glyph" on 
> standard output.
> {code:java}
> public class FontTest {
>  public static void main(String[] args) throws IOException {
>    try {
>       PDDocument doc = new PDDocument();
>       PDPage page = new PDPage(PDRectangle.LETTER);
>       doc.addPage(page);
>       InputStream in =  
> FontTest.class.getResourceAsStream("/Symbola_hint.ttf");
>       PDType0Font emojiFont = PDType0Font.load(doc, in);
>       PDPageContentStream stream = new PDPageContentStream(doc, page);
>       stream.beginText();
>       stream.setFont(emojiFont, 12);
>       stream.setLeading(12 * 1.2f);
>       int codepoint=0x1F609;
>       if(emojiFont.hasGlyph(codepoint)) {
>          System.out.println("has Glyph");
>       } else {
>          System.out.println("no Glyph");
>       }
>       String s=new String(Character.toChars(codepoint));
>       stream.showText(s);
>       stream.close();
>       doc.save("emojiTest.pdf");
>    } catch (Exception exception) {
>       System.out.println(exception.getMessage());
>       exception.printStackTrace();
>    }
>   }
> }
> {code}
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

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

Reply via email to