Пример #1
0
        /**
         * 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);
        }
Пример #2
0
        public PdfContentByte GetDuplicate()
        {
            Type3Glyph dup = new Type3Glyph();

            dup.writer        = writer;
            dup.pdf           = pdf;
            dup.pageResources = pageResources;
            dup.colorized     = colorized;
            return(dup);
        }
Пример #3
0
        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);
        }
Пример #4
0
 public PdfContentByte GetDuplicate()
 {
     Type3Glyph dup = new Type3Glyph();
     dup.writer = writer;
     dup.pdf = pdf;
     dup.pageResources = pageResources;
     dup.colorized = colorized;
     return dup;
 }
Пример #5
0
 /**
 * 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;
 }