@Override public int appendAnyGlyph(String text, int from, List<Glyph> glyphs) { Glyph glyph; if (fontEncoding.isFontSpecific()) { glyph = fontProgram.getGlyphByCode(text.charAt(from)); } else { glyph = getGlyph((int) text.charAt(from)); } if (glyph != null) { glyphs.add(glyph); } return 1; }
@Override public GlyphLine createGlyphLine(String content) { List<Glyph> glyphs = new ArrayList<>(content.length()); if (fontEncoding.isFontSpecific()) { for (int i = 0; i < content.length(); i++) { Glyph glyph = fontProgram.getGlyphByCode(content.charAt(i)); if (glyph != null) { glyphs.add(glyph); } } } else { for (int i = 0; i < content.length(); i++) { Glyph glyph = getGlyph((int) content.charAt(i)); if (glyph != null) { glyphs.add(glyph); } } } return new GlyphLine(glyphs); }
@Override public int appendGlyphs(String text, int from, int to, List<Glyph> glyphs) { int processed = 0; if (fontEncoding.isFontSpecific()) { for (int i = from; i <= to; i++) { Glyph glyph = fontProgram.getGlyphByCode(text.charAt(i) & 0xFF); if (glyph != null) { glyphs.add(glyph); processed++; } else { break; } } } else { for (int i = from; i <= to; i++) { Glyph glyph = getGlyph((int) text.charAt(i)); if (glyph != null && (containsGlyph(glyph.getUnicode()) || isAppendableGlyph(glyph))) { glyphs.add(glyph); processed++; } else if (glyph == null && TextUtil.isWhitespaceOrNonPrintable((int) text.charAt(i))) { processed++; } else { break; } } } return processed; }
@Override public boolean containsGlyph(int unicode) { if (fontEncoding.isFontSpecific()) { return fontProgram.getGlyphByCode(unicode) != null; } else { return fontEncoding.canEncode(unicode) && getFontProgram().getGlyph(fontEncoding.getUnicodeDifference(unicode)) != null; } }
@Override public Glyph getGlyph(int unicode) { if (fontEncoding.canEncode(unicode)) { Glyph glyph; if (fontEncoding.isFontSpecific()) { glyph = getFontProgram().getGlyphByCode(unicode); } else { glyph = getFontProgram().getGlyph(fontEncoding.getUnicodeDifference(unicode)); if (glyph == null && (glyph = notdefGlyphs.get(unicode)) == null) { // Handle special layout characters like sfthyphen (00AD). // This glyphs will be skipped while converting to bytes glyph = new Glyph(-1, 0, unicode); notdefGlyphs.put(unicode, glyph); } } return glyph; } return null; }
@Override public boolean containsGlyph(int unicode) { if (fontEncoding.canEncode(unicode)) { if (fontEncoding.isFontSpecific()) { return getFontProgram().getGlyphByCode(unicode) != null; } else { return getFontProgram().getGlyph(fontEncoding.getUnicodeDifference(unicode)) != null; } } else { return false; } }
@Override public byte[] convertToBytes(Glyph glyph) { byte[] bytes = new byte[1]; if (fontEncoding.isFontSpecific()) { bytes[0] = (byte) glyph.getCode(); } else { if (fontEncoding.canEncode(glyph.getUnicode())) { bytes[0] = (byte) fontEncoding.convertToByte(glyph.getUnicode()); } else { return EMPTY_BYTES; } } shortTag[bytes[0] & 0xff] = 1; return bytes; }
@Override public void checkFont(PdfFont pdfFont) { if (!pdfFont.isEmbedded()) { throw new PdfAConformanceException(PdfAConformanceException.ALL_THE_FONTS_MUST_BE_EMBEDDED_THIS_ONE_IS_NOT_0) .setMessageParams(pdfFont.getFontProgram().getFontNames().getFontName()); } if (pdfFont instanceof PdfTrueTypeFont) { PdfTrueTypeFont trueTypeFont = (PdfTrueTypeFont) pdfFont; boolean symbolic = trueTypeFont.getFontEncoding().isFontSpecific(); if (symbolic) { checkSymbolicTrueTypeFont(trueTypeFont); } else { checkNonSymbolicTrueTypeFont(trueTypeFont); } } }
@Override public void checkFont(PdfFont pdfFont) { if (!pdfFont.isEmbedded()) { throw new PdfAConformanceException(PdfAConformanceException.ALL_THE_FONTS_MUST_BE_EMBEDDED_THIS_ONE_IS_NOT_0) .setMessageParams(pdfFont.getFontProgram().getFontNames().getFontName()); } if (pdfFont instanceof PdfTrueTypeFont) { PdfTrueTypeFont trueTypeFont = (PdfTrueTypeFont) pdfFont; boolean symbolic = trueTypeFont.getFontEncoding().isFontSpecific(); if (symbolic) { checkSymbolicTrueTypeFont(trueTypeFont); } else { checkNonSymbolicTrueTypeFont(trueTypeFont); } } }
@Override public void writeText(GlyphLine text, int from, int to, PdfOutputStream stream) { byte[] bytes = new byte[to - from + 1]; int ptr = 0; if (fontEncoding.isFontSpecific()) { for (int i = from; i <= to; i++) { bytes[ptr++] = (byte) text.get(i).getCode(); } } else { for (int i = from; i <= to; i++) { if (fontEncoding.canEncode(text.get(i).getUnicode())) { bytes[ptr++] = (byte) fontEncoding.convertToByte(text.get(i).getUnicode()); } } } bytes = ArrayUtil.shortenArray(bytes, ptr); for (byte b : bytes) { shortTag[b & 0xff] = 1; } StreamUtil.writeEscapedString(stream, bytes); }
@Override public byte[] convertToBytes(GlyphLine glyphLine) { if (glyphLine != null) { byte[] bytes = new byte[glyphLine.size()]; int ptr = 0; if (fontEncoding.isFontSpecific()) { for (int i = 0; i < glyphLine.size(); i++) { bytes[ptr++] = (byte) glyphLine.get(i).getCode(); } } else { for (int i = 0; i < glyphLine.size(); i++) { if (fontEncoding.canEncode(glyphLine.get(i).getUnicode())) { bytes[ptr++] = (byte) fontEncoding.convertToByte(glyphLine.get(i).getUnicode()); } } } bytes = ArrayUtil.shortenArray(bytes, ptr); for (byte b : bytes) { shortTag[b & 0xff] = 1; } return bytes; } else { return EMPTY_BYTES; } }
@Override protected PdfDictionary getFontDescriptor(String fontName) { if (fontName != null && fontName.length() > 0) { PdfDictionary fontDescriptor = new PdfDictionary(); makeObjectIndirect(fontDescriptor); fontDescriptor.put(PdfName.Type, PdfName.FontDescriptor); FontMetrics fontMetrics = fontProgram.getFontMetrics(); fontDescriptor.put(PdfName.CapHeight, new PdfNumber(fontMetrics.getCapHeight())); fontDescriptor.put(PdfName.ItalicAngle, new PdfNumber(fontMetrics.getItalicAngle())); FontNames fontNames = fontProgram.getFontNames(); fontDescriptor.put(PdfName.FontWeight, new PdfNumber(fontNames.getFontWeight())); fontDescriptor.put(PdfName.FontName, new PdfName(fontName)); if (fontNames.getFamilyName() != null && fontNames.getFamilyName().length > 0 && fontNames.getFamilyName()[0].length >= 4) { fontDescriptor.put(PdfName.FontFamily, new PdfString(fontNames.getFamilyName()[0][3])); } int flags = fontProgram.getPdfFontFlags(); flags &= ~(FontDescriptorFlags.Symbolic | FontDescriptorFlags.Nonsymbolic); // reset both flags flags |= fontEncoding.isFontSpecific() ? // set based on font encoding FontDescriptorFlags.Symbolic : FontDescriptorFlags.Nonsymbolic; fontDescriptor.put(PdfName.Flags, new PdfNumber(flags)); return fontDescriptor; } else if (getPdfObject().getIndirectReference() != null && getPdfObject().getIndirectReference().getDocument().isTagged()) { Logger logger = LoggerFactory.getLogger(PdfType3Font.class); logger.warn(LogMessageConstant.TYPE3_FONT_ISSUE_TAGGED_PDF); } return null; }
} else if (!fontEncoding.isFontSpecific()) { getPdfObject().put(PdfName.Encoding, PdfEncodings.CP1252.equals(fontEncoding.getBaseEncoding()) ? PdfName.WinAnsiEncoding
int flags = fontProgram.getPdfFontFlags(); flags |= fontEncoding.isFontSpecific() ? // set based on font encoding FontDescriptorFlags.Symbolic : FontDescriptorFlags.Nonsymbolic;