/** * Defines a glyph. If the character was already defined it will return the same content * @param c the character to match this glyph. * @param wx the advance this character will have * @param llx the X lower left corner of the glyph bounding box. If the <CODE>colorize</CODE> option is * <CODE>true</CODE> the value is ignored * @param lly the Y lower left corner of the glyph bounding box. If the <CODE>colorize</CODE> option is * <CODE>true</CODE> the value is ignored * @param urx the X upper right corner of the glyph bounding box. If the <CODE>colorize</CODE> option is * <CODE>true</CODE> the value is ignored * @param ury the Y upper right corner of the glyph bounding box. If the <CODE>colorize</CODE> option is * <CODE>true</CODE> the value is ignored * @return a content where the glyph can be defined */ public PdfContentByte DefineGlyph(char c, float wx, float llx, float lly, float urx, float ury) { if (c == 0 || c > 255) { throw new ArgumentException("The char " + (int)c + " doesn't belong in this Type3 font"); } usedSlot[c] = true; Type3Glyph glyph = (Type3Glyph)char2glyph[c]; if (glyph != null) { return(glyph); } widths3[c] = (int)wx; if (!colorized) { if (float.IsNaN(this.llx)) { this.llx = llx; this.lly = lly; this.urx = urx; this.ury = ury; } else { this.llx = Math.Min(this.llx, llx); this.lly = Math.Min(this.lly, lly); this.urx = Math.Max(this.urx, urx); this.ury = Math.Max(this.ury, ury); } } glyph = new Type3Glyph(writer, pageResources, wx, llx, lly, urx, ury, colorized); char2glyph[c] = glyph; return(glyph); }
public PdfContentByte GetDuplicate() { Type3Glyph dup = new Type3Glyph(); dup.writer = writer; dup.pdf = pdf; dup.pageResources = pageResources; dup.colorized = colorized; return(dup); }
internal override void WriteFont(PdfWriter writer, PdfIndirectReference piRef, Object[] oParams) { if (this.writer != writer) { throw new ArgumentException("Type3 font used with the wrong PdfWriter"); } // Get first & lastchar ... int firstChar = 0; while (firstChar < usedSlot.Length && !usedSlot[firstChar]) { firstChar++; } if (firstChar == usedSlot.Length) { throw new DocumentException("No glyphs defined for Type3 font"); } int lastChar = usedSlot.Length - 1; while (lastChar >= firstChar && !usedSlot[lastChar]) { lastChar--; } int[] widths = new int[lastChar - firstChar + 1]; int[] invOrd = new int[lastChar - firstChar + 1]; int invOrdIndx = 0, w = 0; for (int u = firstChar; u <= lastChar; u++, w++) { if (usedSlot[u]) { invOrd[invOrdIndx++] = u; widths[w] = widths3[u]; } } PdfArray diffs = new PdfArray(); PdfDictionary charprocs = new PdfDictionary(); int last = -1; for (int k = 0; k < invOrdIndx; ++k) { int c = invOrd[k]; if (c > last) { last = c; diffs.Add(new PdfNumber(last)); } ++last; int c2 = invOrd[k]; String s = GlyphList.UnicodeToName(c2); if (s == null) { s = "a" + c2; } PdfName n = new PdfName(s); diffs.Add(n); Type3Glyph glyph = (Type3Glyph)char2glyph[(char)c2]; PdfStream stream = new PdfStream(glyph.ToPdf(null)); stream.FlateCompress(compressionLevel); PdfIndirectReference refp = writer.AddToBody(stream).IndirectReference; charprocs.Put(n, refp); } PdfDictionary font = new PdfDictionary(PdfName.FONT); font.Put(PdfName.SUBTYPE, PdfName.TYPE3); if (colorized) { font.Put(PdfName.FONTBBOX, new PdfRectangle(0, 0, 0, 0)); } else { font.Put(PdfName.FONTBBOX, new PdfRectangle(llx, lly, urx, ury)); } font.Put(PdfName.FONTMATRIX, new PdfArray(new float[] { 0.001f, 0, 0, 0.001f, 0, 0 })); font.Put(PdfName.CHARPROCS, writer.AddToBody(charprocs).IndirectReference); PdfDictionary encoding = new PdfDictionary(); encoding.Put(PdfName.DIFFERENCES, diffs); font.Put(PdfName.ENCODING, writer.AddToBody(encoding).IndirectReference); font.Put(PdfName.FIRSTCHAR, new PdfNumber(firstChar)); font.Put(PdfName.LASTCHAR, new PdfNumber(lastChar)); font.Put(PdfName.WIDTHS, writer.AddToBody(new PdfArray(widths)).IndirectReference); if (pageResources.HasResources()) { font.Put(PdfName.RESOURCES, writer.AddToBody(pageResources.Resources).IndirectReference); } writer.AddToBody(font, piRef); }
public PdfContentByte GetDuplicate() { Type3Glyph dup = new Type3Glyph(); dup.writer = writer; dup.pdf = pdf; dup.pageResources = pageResources; dup.colorized = colorized; return dup; }
/** * Defines a glyph. If the character was already defined it will return the same content * @param c the character to match this glyph. * @param wx the advance this character will have * @param llx the X lower left corner of the glyph bounding box. If the <CODE>colorize</CODE> option is * <CODE>true</CODE> the value is ignored * @param lly the Y lower left corner of the glyph bounding box. If the <CODE>colorize</CODE> option is * <CODE>true</CODE> the value is ignored * @param urx the X upper right corner of the glyph bounding box. If the <CODE>colorize</CODE> option is * <CODE>true</CODE> the value is ignored * @param ury the Y upper right corner of the glyph bounding box. If the <CODE>colorize</CODE> option is * <CODE>true</CODE> the value is ignored * @return a content where the glyph can be defined */ public PdfContentByte DefineGlyph(char c, float wx, float llx, float lly, float urx, float ury) { if (c == 0 || c > 255) throw new ArgumentException("The char " + (int)c + " doesn't belong in this Type3 font"); usedSlot[c] = true; Type3Glyph glyph = (Type3Glyph)char2glyph[c]; if (glyph != null) return glyph; widths3[c] = (int)wx; if (!colorized) { if (float.IsNaN(this.llx)) { this.llx = llx; this.lly = lly; this.urx = urx; this.ury = ury; } else { this.llx = Math.Min(this.llx, llx); this.lly = Math.Min(this.lly, lly); this.urx = Math.Max(this.urx, urx); this.ury = Math.Max(this.ury, ury); } } glyph = new Type3Glyph(writer, pageResources, wx, llx, lly, urx, ury, colorized); char2glyph[c] = glyph; return glyph; }