Example #1
0
        /**
         *  Constructor for the 14 standard fonts.
         *  Creates a font object and adds it to the PDF.
         *
         *  <pre>
         *  Examples:
         *      Font font1 = new Font(pdf, CoreFont.HELVETICA);
         *      Font font2 = new Font(pdf, CoreFont.TIMES_ITALIC);
         *      Font font3 = new Font(pdf, CoreFont.ZAPF_DINGBATS);
         *      ...
         *  </pre>
         *
         *  @param pdf the PDF to add this font to.
         *  @param coreFont the core font. Must be one the names defined in the CoreFont class.
         */
        public Font(PDF pdf, CoreFont coreFont)
        {
            StandardFont font = StandardFont.GetInstance(coreFont);

            this.isCoreFont             = true;
            this.name                   = font.name;
            this.bBoxLLx                = font.bBoxLLx;
            this.bBoxLLy                = font.bBoxLLy;
            this.bBoxURx                = font.bBoxURx;
            this.bBoxURy                = font.bBoxURy;
            this.metrics                = font.metrics;
            this.fontUnderlinePosition  = font.underlinePosition;
            this.fontUnderlineThickness = font.underlineThickness;
            this.fontAscent             = font.bBoxURy;
            this.fontDescent            = font.bBoxLLy;
            SetSize(size);

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type1\n");
            pdf.Append("/BaseFont /");
            pdf.Append(this.name);
            pdf.Append('\n');
            if (!this.name.Equals("Symbol") && !this.name.Equals("ZapfDingbats"))
            {
                pdf.Append("/Encoding /WinAnsiEncoding\n");
            }
            pdf.Append(">>\n");
            pdf.Endobj();
            objNumber = pdf.GetObjNumber();

            pdf.fonts.Add(this);
        }
Example #2
0
        private void AddCoreFont(PDF pdf, CoreFont coreFont)
        {
            StandardFont instance = StandardFont.GetInstance(coreFont);

            this.name    = instance.name;
            this.bBoxLLx = (float)instance.bBoxLLx;
            this.bBoxLLy = (float)instance.bBoxLLy;
            this.bBoxURx = (float)instance.bBoxURx;
            this.bBoxURy = (float)instance.bBoxURy;
            this.fontUnderlinePosition  = instance.underlinePosition;
            this.fontUnderlineThickness = instance.underlineThickness;
            this.metrics = instance.metrics;
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type1\n");
            pdf.Append("/BaseFont /");
            pdf.Append(this.name);
            pdf.Append('\n');
            if (!this.name.Equals("Symbol") && !this.name.Equals("ZapfDingbats"))
            {
                pdf.Append("/Encoding /WinAnsiEncoding\n");
            }
            pdf.Append(">>\n");
            pdf.Endobj();
            this.objNumber          = pdf.objNumber;
            this.ascent             = this.bBoxURy * this.size / (float)this.unitsPerEm;
            this.descent            = this.bBoxLLy * this.size / (float)this.unitsPerEm;
            this.body_height        = this.ascent - this.descent;
            this.underlineThickness = (float)this.fontUnderlineThickness * this.size / (float)this.unitsPerEm;
            this.underlinePosition  = (float)this.fontUnderlinePosition * this.size / (float)(-(float)this.unitsPerEm) + this.underlineThickness / 2f;
            pdf.fonts.Add(this);
        }
Example #3
0
        /**
         *  Constructor for the 14 standard fonts.
         *  Creates a font object and adds it to the PDF.
         *
         *  <pre>
         *  Examples:
         *      Font font1 = new Font(pdf, CoreFont.HELVETICA);
         *      Font font2 = new Font(pdf, CoreFont.TIMES_ITALIC);
         *      Font font3 = new Font(pdf, CoreFont.ZAPF_DINGBATS);
         *      ...
         *  </pre>
         *
         *  @param pdf the PDF to add this font to.
         *  @param coreFont the core font. Must be one the names defined in the CoreFont class.
         */
        public Font(PDF pdf, CoreFont coreFont)
        {
            StandardFont font = StandardFont.GetInstance(coreFont);

            this.name    = font.name;
            this.bBoxLLx = font.bBoxLLx;
            this.bBoxLLy = font.bBoxLLy;
            this.bBoxURx = font.bBoxURx;
            this.bBoxURy = font.bBoxURy;
            this.fontUnderlinePosition  = font.underlinePosition;
            this.fontUnderlineThickness = font.underlineThickness;
            this.metrics            = font.metrics;
            this.ascent             = bBoxURy * size / unitsPerEm;
            this.descent            = bBoxLLy * size / unitsPerEm;
            this.body_height        = ascent - descent;
            this.underlineThickness = fontUnderlineThickness * size / unitsPerEm;
            this.underlinePosition  = fontUnderlinePosition * size / -unitsPerEm + underlineThickness / 2.0f;

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type1\n");
            pdf.Append("/BaseFont /");
            pdf.Append(this.name);
            pdf.Append('\n');
            if (!this.name.Equals("Symbol") && !this.name.Equals("ZapfDingbats"))
            {
                pdf.Append("/Encoding /WinAnsiEncoding\n");
            }
            pdf.Append(">>\n");
            pdf.Endobj();
            objNumber = pdf.objNumber;

            pdf.fonts.Add(this);
        }
Example #4
0
        internal void RegisterAsSimple(
            PDF pdf,
            Font font,
            Stream inputStream,
            int codePage,
            bool embed)
        {
            otf = new OTF(inputStream);
            if (embed) {
            EmbedFontFile(pdf, font, otf, true);
            }

            AddFontDescriptorObject(pdf, font, otf, embed);
            AddWidthsArrayObject(pdf, font, otf, codePage);
            AddEncodingObject(pdf, font, codePage);

            // Simple font object
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            if (otf.cff) {
            pdf.Append("/Subtype /Type1\n");
            } else {
            pdf.Append("/Subtype /TrueType\n");
            }
            pdf.Append("/BaseFont /");
            pdf.Append(otf.fontName);
            pdf.Append('\n');
            pdf.Append("/FirstChar ");
            pdf.Append(otf.firstChar);
            pdf.Append('\n');
            pdf.Append("/LastChar ");
            pdf.Append(255);
            pdf.Append('\n');
            pdf.Append("/Encoding ");
            pdf.Append(font.GetEncodingObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append("/Widths ");
            pdf.Append(font.GetWidthsArrayObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append("/FontDescriptor ");
            pdf.Append(font.GetFontDescriptorObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.objNumber = pdf.objNumber;
        }
Example #5
0
        // Constructor for standard fonts
        public Font(PDF pdf, String fontName)
        {
            this.pdf  = pdf;
            this.name = fontName;

            pdf.newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type1\n");
            pdf.Append("/BaseFont /");
            pdf.Append(fontName);
            pdf.Append('\n');
            if (fontName.Equals("Symbol") || fontName.Equals("ZapfDingbats"))
            {
                // Use the built-in encoding
            }
            else
            {
                pdf.Append("/Encoding /WinAnsiEncoding\n");
            }
            pdf.Append(">>\n");
            pdf.endobj();
            objNumber = pdf.objNumber;

            CoreFont font = (CoreFont)Activator.CreateInstance(Type.GetType("PDFjet.NET." + name.Replace('-', '_')));

            bBoxLLx     = font.getBBoxLLx();
            bBoxLLy     = font.getBBoxLLy();
            bBoxURx     = font.getBBoxURx();
            bBoxURy     = font.getBBoxURy();
            metrics     = font.getMetrics();
            ascent      = bBoxURy * size / unitsPerEm;
            descent     = bBoxLLy * size / unitsPerEm;
            body_height = ascent - descent;

            fontUnderlineThickness = font.getUnderlineThickness();
            fontUnderlinePosition  = font.getUnderlinePosition();

            underlineThickness = fontUnderlineThickness * size / unitsPerEm;
            underlinePosition  = fontUnderlinePosition * size / -unitsPerEm + underlineThickness / 2.0;

            pdf.fonts.Add(this);
        }
Example #6
0
        internal void RegisterAsComposite(
            PDF pdf,
            Font font,
            Stream inputStream,
            bool embed)
        {
            otf = new OTF(inputStream);
            if (embed)
            {
                EmbedFontFile(pdf, font, otf, false);
            }

            AddFontDescriptorObject(pdf, font, otf, embed);
            AddCIDFontDictionaryObject(pdf, font, otf);
            AddToUnicodeCMapObject(pdf, font, otf);

            // Type0 Font Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(otf.fontName);
            pdf.Append('\n');
            pdf.Append("/Encoding /Identity-H\n");
            pdf.Append("/DescendantFonts [");
            pdf.Append(font.GetCidFontDictObjNumber());
            pdf.Append(" 0 R]\n");
            pdf.Append("/ToUnicode ");
            pdf.Append(font.GetToUnicodeCMapObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.objNumber = pdf.objNumber;
        }
Example #7
0
        private void AddWidthsArrayObject(
            PDF pdf,
            Font font,
            OTF otf,
            int codePage)
        {
            pdf.Newobj();
            pdf.Append("[ ");
            int n = 1;

            for (int c = otf.firstChar; c < 256; c++)
            {
                if (c < 127)
                {
                    pdf.Append((int)
                               ((1000.0f / otf.unitsPerEm) * otf.glyphWidth[c]));
                }
                else
                {
                    if (codePage == 0)
                    {
                        pdf.Append((int)((1000.0f / otf.unitsPerEm)
                                         * otf.glyphWidth[CP1250.codes[c - 127]]));
                    }
                    else if (codePage == 1)
                    {
                        pdf.Append((int)((1000.0f / otf.unitsPerEm)
                                         * otf.glyphWidth[CP1251.codes[c - 127]]));
                    }
                    else if (codePage == 2)
                    {
                        pdf.Append((int)((1000.0f / otf.unitsPerEm)
                                         * otf.glyphWidth[CP1252.codes[c - 127]]));
                    }
                    else if (codePage == 3)
                    {
                        pdf.Append((int)((1000.0f / otf.unitsPerEm)
                                         * otf.glyphWidth[CP1253.codes[c - 127]]));
                    }
                    else if (codePage == 4)
                    {
                        pdf.Append((int)((1000.0f / otf.unitsPerEm)
                                         * otf.glyphWidth[CP1254.codes[c - 127]]));
                    }
                    else if (codePage == 7)
                    {
                        pdf.Append((int)((1000.0f / otf.unitsPerEm)
                                         * otf.glyphWidth[CP1257.codes[c - 127]]));
                    }
                }
                if (n < 10)
                {
                    pdf.Append(' ');
                    ++n;
                }
                else
                {
                    pdf.Append('\n');
                    n = 1;
                }
            }
            pdf.Append("]\n");
            pdf.Endobj();

            font.SetWidthsArrayObjNumber(pdf.objNumber);
        }
Example #8
0
        private void EmbedFontFile(
            PDF pdf,
            Font font,
            OTF otf,
            bool simpleFont)
        {
            // Check if the font file is already embedded
            for (int i = 0; i < pdf.fonts.Count; i++)
            {
                Font f = pdf.fonts[i];
                if (f.name.Equals(otf.fontName) && f.fileObjNumber != -1)
                {
                    font.fileObjNumber = f.fileObjNumber;
                    return;
                }
            }

            int metadataObjNumber = -1;

            if (otf.fontName.ToLower().IndexOf("droid") != -1 ||
                otf.fontName.ToLower().IndexOf("roboto") != -1)
            {
                metadataObjNumber = pdf.AddMetadataObject(AndroidFontsCopyright.NOTICE, true);
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            if (otf.cff)
            {
                if (simpleFont)
                {
                    pdf.Append("/Subtype /Type1C\n");
                }
                else
                {
                    pdf.Append("/Subtype /CIDFontType0C\n");
                }
            }
            pdf.Append("/Filter /FlateDecode\n");

            pdf.Append("/Length ");
            pdf.Append(otf.baos.Length);
            pdf.Append("\n");

            if (!otf.cff)
            {
                pdf.Append("/Length1 ");
                pdf.Append(otf.buf.Length);
                pdf.Append('\n');
            }

            if (metadataObjNumber != -1)
            {
                pdf.Append("/Metadata ");
                pdf.Append(metadataObjNumber);
                pdf.Append(" 0 R\n");
            }

            pdf.Append(">>\n");
            pdf.Append("stream\n");
            pdf.Append(otf.baos);
            pdf.Append("\nendstream\n");
            pdf.Endobj();

            font.fileObjNumber = pdf.objNumber;
        }
Example #9
0
        private void AddImage(PDF pdf, Stream inputStream)
        {
            w = GetInt(inputStream);               // Width
            h = GetInt(inputStream);               // Height
            byte c = (byte)inputStream.ReadByte(); // Color Space
            byte a = (byte)inputStream.ReadByte(); // Alpha

            if (a != 0)
            {
                pdf.Newobj();
                pdf.Append("<<\n");
                pdf.Append("/Type /XObject\n");
                pdf.Append("/Subtype /Image\n");
                pdf.Append("/Filter /FlateDecode\n");
                pdf.Append("/Width ");
                pdf.Append(w);
                pdf.Append('\n');
                pdf.Append("/Height ");
                pdf.Append(h);
                pdf.Append('\n');
                pdf.Append("/ColorSpace /DeviceGray\n");
                pdf.Append("/BitsPerComponent 8\n");
                int length = GetInt(inputStream);
                pdf.Append("/Length ");
                pdf.Append(length);
                pdf.Append('\n');
                pdf.Append(">>\n");
                pdf.Append("stream\n");
                byte[] buf1 = new byte[length];
                inputStream.Read(buf1, 0, length);
                pdf.Append(buf1, 0, length);
                pdf.Append("\nendstream\n");
                pdf.Endobj();
                objNumber = pdf.objNumber;
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /XObject\n");
            pdf.Append("/Subtype /Image\n");
            pdf.Append("/Filter /FlateDecode\n");
            if (a != 0)
            {
                pdf.Append("/SMask ");
                pdf.Append(objNumber);
                pdf.Append(" 0 R\n");
            }
            pdf.Append("/Width ");
            pdf.Append(w);
            pdf.Append('\n');
            pdf.Append("/Height ");
            pdf.Append(h);
            pdf.Append('\n');
            pdf.Append("/ColorSpace /");
            if (c == 1)
            {
                pdf.Append("DeviceGray");
            }
            else if (c == 3 || c == 6)
            {
                pdf.Append("DeviceRGB");
            }
            pdf.Append('\n');
            pdf.Append("/BitsPerComponent 8\n");
            pdf.Append("/Length ");
            pdf.Append(GetInt(inputStream));
            pdf.Append('\n');
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            byte[] buf2 = new byte[2048];
            int    count;

            while ((count = inputStream.Read(buf2, 0, buf2.Length)) > 0)
            {
                pdf.Append(buf2, 0, count);
            }
            pdf.Append("\nendstream\n");
            pdf.Endobj();
            pdf.images.Add(this);
            objNumber = pdf.objNumber;
        }
Example #10
0
        private static void EmbedFontFile(PDF pdf, Font font, Stream inputStream)
        {
            // Check if the font file is already embedded
            for (int i = 0; i < pdf.fonts.Count; i++)
            {
                Font f = pdf.fonts[i];
                if (f.name.Equals(font.name) && f.fileObjNumber != -1)
                {
                    font.fileObjNumber = f.fileObjNumber;
                    return;
                }
            }

/*
 *      int metadataObjNumber = pdf.AddMetadataObject(DejaVu.FONT_LICENSE, true);
 */
            pdf.Newobj();
            pdf.Append("<<\n");

/*
 *      pdf.Append("/Metadata ");
 *      pdf.Append(metadataObjNumber);
 *      pdf.Append(" 0 R\n");
 */
            pdf.Append("/Filter /FlateDecode\n");
            pdf.Append("/Length ");
            pdf.Append(font.compressed_size);
            pdf.Append("\n");

            pdf.Append("/Length1 ");
            pdf.Append(font.uncompressed_size);
            pdf.Append('\n');

            pdf.Append(">>\n");
            pdf.Append("stream\n");
            byte[] buf = new byte[2048];
            int    len;

            while ((len = inputStream.Read(buf, 0, buf.Length)) > 0)
            {
                pdf.Append(buf, 0, len);
            }
            inputStream.Dispose();
            pdf.Append("\nendstream\n");
            pdf.Endobj();

            font.fileObjNumber = pdf.objNumber;
        }
Example #11
0
        internal static void Register(
            PDF pdf,
            Font font,
            Stream inputStream)
        {
            int len = inputStream.ReadByte();

            byte[] fontName = new byte[len];
            inputStream.Read(fontName, 0, len);
            font.name = System.Text.Encoding.UTF8.GetString(fontName);
            // Console.WriteLine(font.name);

            font.unitsPerEm         = GetInt32(inputStream);
            font.bBoxLLx            = GetInt32(inputStream);
            font.bBoxLLy            = GetInt32(inputStream);
            font.bBoxURx            = GetInt32(inputStream);
            font.bBoxURy            = GetInt32(inputStream);
            font.ascent             = GetInt32(inputStream);
            font.descent            = GetInt32(inputStream);
            font.firstChar          = GetInt32(inputStream);
            font.lastChar           = GetInt32(inputStream);
            font.capHeight          = GetInt32(inputStream);
            font.underlinePosition  = GetInt32(inputStream);
            font.underlineThickness = GetInt32(inputStream);

            len = GetInt32(inputStream);
            font.advanceWidth = new int[len];
            for (int i = 0; i < len; i++)
            {
                font.advanceWidth[i] = GetInt16(inputStream);
            }

            len             = GetInt32(inputStream);
            font.glyphWidth = new int[len];
            for (int i = 0; i < len; i++)
            {
                font.glyphWidth[i] = GetInt16(inputStream);
            }

            len = GetInt32(inputStream);
            font.unicodeToGID = new int[len];
            for (int i = 0; i < len; i++)
            {
                font.unicodeToGID[i] = GetInt16(inputStream);
            }

            font.uncompressed_size = GetInt32(inputStream);
            font.compressed_size   = GetInt32(inputStream);

            EmbedFontFile(pdf, font, inputStream);
            AddFontDescriptorObject(pdf, font);
            AddCIDFontDictionaryObject(pdf, font);
            AddToUnicodeCMapObject(pdf, font);

            // Type0 Font Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(font.name);
            pdf.Append('\n');
            pdf.Append("/Encoding /Identity-H\n");
            pdf.Append("/DescendantFonts [");
            pdf.Append(font.GetCidFontDictObjNumber());
            pdf.Append(" 0 R]\n");
            pdf.Append("/ToUnicode ");
            pdf.Append(font.GetToUnicodeCMapObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.objNumber = pdf.objNumber;
        }
Example #12
0
        private void AddImage(PDF pdf, Stream inputStream)
        {
            w = GetInt(inputStream);                // Width
            h = GetInt(inputStream);                // Height
            byte c = (byte) inputStream.ReadByte(); // Color Space
            byte a = (byte) inputStream.ReadByte(); // Alpha

            if (a != 0) {
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /XObject\n");
            pdf.Append("/Subtype /Image\n");
            pdf.Append("/Filter /FlateDecode\n");
            pdf.Append("/Width ");
            pdf.Append(w);
            pdf.Append('\n');
            pdf.Append("/Height ");
            pdf.Append(h);
            pdf.Append('\n');
            pdf.Append("/ColorSpace /DeviceGray\n");
            pdf.Append("/BitsPerComponent 8\n");
            int length = GetInt(inputStream);
            pdf.Append("/Length ");
            pdf.Append(length);
            pdf.Append('\n');
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            byte[] buf1 = new byte[length];
            inputStream.Read(buf1, 0, length);
            pdf.Append(buf1, 0, length);
            pdf.Append("\nendstream\n");
            pdf.Endobj();
            objNumber = pdf.objNumber;
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /XObject\n");
            pdf.Append("/Subtype /Image\n");
            pdf.Append("/Filter /FlateDecode\n");
            if (a != 0) {
            pdf.Append("/SMask ");
            pdf.Append(objNumber);
            pdf.Append(" 0 R\n");
            }
            pdf.Append("/Width ");
            pdf.Append(w);
            pdf.Append('\n');
            pdf.Append("/Height ");
            pdf.Append(h);
            pdf.Append('\n');
            pdf.Append("/ColorSpace /");
            if (c == 1) {
            pdf.Append("DeviceGray");
            }
            else if (c == 3 || c == 6) {
            pdf.Append("DeviceRGB");
            }
            pdf.Append('\n');
            pdf.Append("/BitsPerComponent 8\n");
            pdf.Append("/Length ");
            pdf.Append(GetInt(inputStream));
            pdf.Append('\n');
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            byte[] buf2 = new byte[2048];
            int count;
            while ((count = inputStream.Read(buf2, 0, buf2.Length)) > 0) {
            pdf.Append(buf2, 0, count);
            }
            pdf.Append("\nendstream\n");
            pdf.Endobj();
            pdf.images.Add(this);
            objNumber = pdf.objNumber;
        }
Example #13
0
 private void AddSoftMask(
     PDF pdf,
     byte[] data,
     String colorSpace,
     int bitsPerComponent)
 {
     pdf.Newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /XObject\n");
     pdf.Append("/Subtype /Image\n");
     pdf.Append("/Filter /FlateDecode\n");
     pdf.Append("/Width ");
     pdf.Append(( int ) w);
     pdf.Append('\n');
     pdf.Append("/Height ");
     pdf.Append(( int ) h);
     pdf.Append('\n');
     pdf.Append("/ColorSpace /");
     pdf.Append(colorSpace);
     pdf.Append('\n');
     pdf.Append("/BitsPerComponent ");
     pdf.Append(bitsPerComponent);
     pdf.Append('\n');
     pdf.Append("/Length ");
     pdf.Append(data.Length);
     pdf.Append('\n');
     pdf.Append(">>\n");
     pdf.Append("stream\n");
     pdf.Append(data, 0, data.Length);
     pdf.Append("\nendstream\n");
     pdf.Endobj();
     objNumber = pdf.objNumber;
 }
Example #14
0
        // Constructor for CJK fonts
        public Font(PDF pdf, String fontName, int codePage)
        {
            this.name = fontName;
            this.codePage = codePage;
            isCJK = true;
            isStandard = false;
            isComposite = true;

            firstChar = 0x0020;
            lastChar = 0xFFEE;

            // Font Descriptor
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /FontDescriptor\n");
            pdf.Append("/FontName /");
            pdf.Append(fontName);
            pdf.Append('\n');
            pdf.Append("/Flags 4\n");
            pdf.Append("/FontBBox [0 0 0 0]\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            // CIDFont Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /CIDFontType0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(fontName);
            pdf.Append('\n');
            pdf.Append("/FontDescriptor ");
            pdf.Append(pdf.objNumber - 1);
            pdf.Append(" 0 R\n");
            pdf.Append("/CIDSystemInfo <<\n");
            pdf.Append("/Registry (Adobe)\n");
            if (fontName.StartsWith("AdobeMingStd")) {
            pdf.Append("/Ordering (CNS1)\n");
            pdf.Append("/Supplement 4\n");
            } else if (fontName.StartsWith("AdobeSongStd")
                || fontName.StartsWith("STHeitiSC")) {
            pdf.Append("/Ordering (GB1)\n");
            pdf.Append("/Supplement 4\n");
            } else if (fontName.StartsWith("KozMinPro")) {
            pdf.Append("/Ordering (Japan1)\n");
            pdf.Append("/Supplement 4\n");
            } else if (fontName.StartsWith("AdobeMyungjoStd")) {
            pdf.Append("/Ordering (Korea1)\n");
            pdf.Append("/Supplement 1\n");
            } else {
            throw new Exception("Unsupported font: " + fontName);
            }
            pdf.Append(">>\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            // Type0 Font Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            if (fontName.StartsWith("AdobeMingStd")) {
            pdf.Append(fontName + "-UniCNS-UTF16-H\n");
            pdf.Append("/Encoding /UniCNS-UTF16-H\n");
            } else if (fontName.StartsWith("AdobeSongStd")
                || fontName.StartsWith("STHeitiSC")) {
            pdf.Append(fontName + "-UniGB-UTF16-H\n");
            pdf.Append("/Encoding /UniGB-UTF16-H\n");
            } else if (fontName.StartsWith("KozMinPro")) {
            pdf.Append(fontName + "-UniJIS-UCS2-H\n");
            pdf.Append("/Encoding /UniJIS-UCS2-H\n");
            } else if (fontName.StartsWith("AdobeMyungjoStd")) {
            pdf.Append(fontName + "-UniKS-UCS2-H\n");
            pdf.Append("/Encoding /UniKS-UCS2-H\n");
            } else {
            throw new Exception("Unsupported font: " + fontName);
            }
            pdf.Append("/DescendantFonts [");
            pdf.Append(pdf.objNumber - 1);
            pdf.Append(" 0 R]\n");
            pdf.Append(">>\n");
            pdf.Endobj();
            objNumber = pdf.objNumber;

            ascent = size;
            descent = -ascent/4;
            body_height = ascent - descent;

            pdf.fonts.Add(this);
        }
Example #15
0
 private void AddImage(
     PDF pdf,
     byte[] data,
     byte[] alpha,
     int imageType,
     String colorSpace,
     int bitsPerComponent)
 {
     if (alpha != null) {
     AddSoftMask(pdf, alpha, "DeviceGray", 8);
     }
     pdf.Newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /XObject\n");
     pdf.Append("/Subtype /Image\n");
     if (imageType == ImageType.JPG) {
     pdf.Append("/Filter /DCTDecode\n");
     }
     else if (imageType == ImageType.PNG || imageType == ImageType.BMP) {
     pdf.Append("/Filter /FlateDecode\n");
     if (alpha != null) {
         pdf.Append("/SMask ");
         pdf.Append(objNumber);
         pdf.Append(" 0 R\n");
     }
     }
     pdf.Append("/Width ");
     pdf.Append(( int ) w);
     pdf.Append('\n');
     pdf.Append("/Height ");
     pdf.Append(( int ) h);
     pdf.Append('\n');
     pdf.Append("/ColorSpace /");
     pdf.Append(colorSpace);
     pdf.Append('\n');
     pdf.Append("/BitsPerComponent ");
     pdf.Append(bitsPerComponent);
     pdf.Append('\n');
     if (colorSpace.Equals("DeviceCMYK")) {
     // If the image was created with Photoshop - invert the colors:
     pdf.Append("/Decode [1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0]\n");
     }
     pdf.Append("/Length ");
     pdf.Append(data.Length);
     pdf.Append('\n');
     pdf.Append(">>\n");
     pdf.Append("stream\n");
     pdf.Append(data, 0, data.Length);
     pdf.Append("\nendstream\n");
     pdf.Endobj();
     pdf.images.Add(this);
     objNumber = pdf.objNumber;
 }
Example #16
0
        /**
         *  Constructor for the 14 standard fonts.
         *  Creates a font object and adds it to the PDF.
         *
         *  <pre>
         *  Examples:
         *      Font font1 = new Font(pdf, CoreFont.HELVETICA);
         *      Font font2 = new Font(pdf, CoreFont.TIMES_ITALIC);
         *      Font font3 = new Font(pdf, CoreFont.ZAPF_DINGBATS);
         *      ...
         *  </pre>
         *
         *  @param pdf the PDF to add this font to.
         *  @param coreFont the core font. Must be one the names defined in the CoreFont class.
         */
        public Font(PDF pdf, CoreFont coreFont)
        {
            StandardFont font = StandardFont.GetInstance(coreFont);
            this.name = font.name;
            this.bBoxLLx = font.bBoxLLx;
            this.bBoxLLy = font.bBoxLLy;
            this.bBoxURx = font.bBoxURx;
            this.bBoxURy = font.bBoxURy;
            this.fontUnderlinePosition = font.underlinePosition;
            this.fontUnderlineThickness = font.underlineThickness;
            this.metrics = font.metrics;
            this.ascent = bBoxURy * size / unitsPerEm;
            this.descent = bBoxLLy * size / unitsPerEm;
            this.body_height = ascent - descent;
            this.underlineThickness = fontUnderlineThickness * size / unitsPerEm;
            this.underlinePosition = fontUnderlinePosition * size / -unitsPerEm + underlineThickness / 2.0f;

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type1\n");
            pdf.Append("/BaseFont /");
            pdf.Append(this.name);
            pdf.Append('\n');
            if (!this.name.Equals("Symbol") && !this.name.Equals("ZapfDingbats")) {
            pdf.Append("/Encoding /WinAnsiEncoding\n");
            }
            pdf.Append(">>\n");
            pdf.Endobj();
            objNumber = pdf.objNumber;

            pdf.fonts.Add(this);
        }
Example #17
0
        // Constructor for standard fonts
        public Font(PDF pdf, String fontName)
        {
            this.pdf = pdf;
            this.name = fontName;

            pdf.newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type1\n");
            pdf.Append("/BaseFont /");
            pdf.Append(fontName);
            pdf.Append('\n');
            if (fontName.Equals("Symbol") || fontName.Equals("ZapfDingbats")) {
            // Use the built-in encoding
            } else {
            pdf.Append("/Encoding /WinAnsiEncoding\n");
            }
            pdf.Append(">>\n");
            pdf.endobj();
            objNumber = pdf.objNumber;

            CoreFont font = (CoreFont) Activator.CreateInstance(Type.GetType("PDFjet.NET." + name.Replace('-', '_')));
            bBoxLLx = font.getBBoxLLx();
            bBoxLLy = font.getBBoxLLy();
            bBoxURx = font.getBBoxURx();
            bBoxURy = font.getBBoxURy();
            metrics = font.getMetrics();
            ascent = bBoxURy * size / unitsPerEm;
            descent = bBoxLLy * size / unitsPerEm;
            body_height = ascent - descent;

            fontUnderlineThickness = font.getUnderlineThickness();
            fontUnderlinePosition = font.getUnderlinePosition();

            underlineThickness = fontUnderlineThickness * size / unitsPerEm;
            underlinePosition = fontUnderlinePosition * size / -unitsPerEm + underlineThickness / 2.0;

            pdf.fonts.Add(this);
        }
Example #18
0
        private static void EmbedFontFile(PDF pdf, Font font, Stream inputStream)
        {
            // Check if the font file is already embedded
            foreach (Font f in pdf.fonts)
            {
                if (f.fileObjNumber != 0 && f.name.Equals(font.name))
                {
                    font.fileObjNumber = f.fileObjNumber;
                    return;
                }
            }

            int metadataObjNumber = pdf.AddMetadataObject(font.info, true);

            pdf.Newobj();
            pdf.Append("<<\n");

            pdf.Append("/Metadata ");
            pdf.Append(metadataObjNumber);
            pdf.Append(" 0 R\n");

            if (font.cff)
            {
                pdf.Append("/Subtype /CIDFontType0C\n");
            }
            pdf.Append("/Filter /FlateDecode\n");
            pdf.Append("/Length ");
            pdf.Append(font.compressedSize);
            pdf.Append("\n");

            if (!font.cff)
            {
                pdf.Append("/Length1 ");
                pdf.Append(font.uncompressedSize);
                pdf.Append('\n');
            }

            pdf.Append(">>\n");
            pdf.Append("stream\n");
            byte[] buf = new byte[4096];
            int    len;

            while ((len = inputStream.Read(buf, 0, buf.Length)) > 0)
            {
                pdf.Append(buf, 0, len);
            }
            inputStream.Dispose();
            pdf.Append("\nendstream\n");
            pdf.Endobj();

            font.fileObjNumber = pdf.GetObjNumber();
        }
Example #19
0
 public Image(PDF pdf, PDFobj obj)
 {
     pdf.Newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /XObject\n");
     pdf.Append("/Subtype /Image\n");
     pdf.Append("/Filter ");
     pdf.Append(obj.GetValue(PDFobj.FILTER));
     pdf.Append('\n');
     pdf.Append("/Width ");
     pdf.Append(obj.GetValue(PDFobj.WIDTH));
     pdf.Append('\n');
     pdf.Append("/Height ");
     pdf.Append(obj.GetValue(PDFobj.HEIGHT));
     pdf.Append('\n');
     pdf.Append("/ColorSpace ");
     pdf.Append(obj.GetValue(PDFobj.COLORSPACE));
     pdf.Append('\n');
     pdf.Append("/BitsPerComponent ");
     pdf.Append(obj.GetValue(PDFobj.BITSPERCOMPONENT));
     pdf.Append('\n');
     pdf.Append("/Length ");
     pdf.Append(obj.stream.Length);
     pdf.Append('\n');
     pdf.Append(">>\n");
     pdf.Append("stream\n");
     pdf.Append(obj.stream, 0, obj.stream.Length);
     pdf.Append("\nendstream\n");
     pdf.Endobj();
     pdf.images.Add(this);
     this.objNumber = pdf.objNumber;
 }
Example #20
0
        internal static void Register(
            PDF pdf,
            Font font,
            Stream inputStream)
        {
            font.name               = DejaVuLGCSerif.name;
            font.unitsPerEm         = DejaVuLGCSerif.unitsPerEm;
            font.bBoxLLx            = DejaVuLGCSerif.bBoxLLx;
            font.bBoxLLy            = DejaVuLGCSerif.bBoxLLy;
            font.bBoxURx            = DejaVuLGCSerif.bBoxURx;
            font.bBoxURy            = DejaVuLGCSerif.bBoxURy;
            font.ascent             = DejaVuLGCSerif.ascent;
            font.descent            = DejaVuLGCSerif.descent;
            font.capHeight          = DejaVuLGCSerif.capHeight;
            font.firstChar          = DejaVuLGCSerif.firstChar;
            font.lastChar           = DejaVuLGCSerif.lastChar;
            font.underlinePosition  = DejaVuLGCSerif.underlinePosition;
            font.underlineThickness = DejaVuLGCSerif.underlineThickness;
            font.compressed_size    = DejaVuLGCSerif.compressed_size;
            font.uncompressed_size  = DejaVuLGCSerif.uncompressed_size;
            font.advanceWidth       = DecodeRLE(DejaVuLGCSerif.advanceWidth);
            font.glyphWidth         = DecodeRLE(DejaVuLGCSerif.glyphWidth);
            font.unicodeToGID       = DecodeRLE(DejaVuLGCSerif.unicodeToGID);

            EmbedFontFile(pdf, font, inputStream);
            AddFontDescriptorObject(pdf, font);
            AddCIDFontDictionaryObject(pdf, font);
            AddToUnicodeCMapObject(pdf, font);

            // Type0 Font Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(font.name);
            pdf.Append('\n');
            pdf.Append("/Encoding /Identity-H\n");
            pdf.Append("/DescendantFonts [");
            pdf.Append(font.GetCidFontDictObjNumber());
            pdf.Append(" 0 R]\n");
            pdf.Append("/ToUnicode ");
            pdf.Append(font.GetToUnicodeCMapObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.objNumber = pdf.objNumber;
        }
Example #21
0
 private void AddImage(PDF pdf, byte[] data, byte[] alpha, int imageType, string colorSpace, int bitsPerComponent)
 {
     if (alpha != null)
     {
         this.AddSoftMask(pdf, alpha, "DeviceGray", 8);
     }
     pdf.Newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /XObject\n");
     pdf.Append("/Subtype /Image\n");
     if (imageType == ImageType.JPG)
     {
         pdf.Append("/Filter /DCTDecode\n");
     }
     else
     {
         if (imageType == ImageType.PNG || imageType == ImageType.BMP)
         {
             pdf.Append("/Filter /FlateDecode\n");
             if (alpha != null)
             {
                 pdf.Append("/SMask ");
                 pdf.Append(this.objNumber);
                 pdf.Append(" 0 R\n");
             }
         }
     }
     pdf.Append("/Width ");
     pdf.Append((int)this.w);
     pdf.Append('\n');
     pdf.Append("/Height ");
     pdf.Append((int)this.h);
     pdf.Append('\n');
     pdf.Append("/ColorSpace /");
     pdf.Append(colorSpace);
     pdf.Append('\n');
     pdf.Append("/BitsPerComponent ");
     pdf.Append(bitsPerComponent);
     pdf.Append('\n');
     if (colorSpace.Equals("DeviceCMYK"))
     {
         pdf.Append("/Decode [1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0]\n");
     }
     pdf.Append("/Length ");
     pdf.Append(data.Length);
     pdf.Append('\n');
     pdf.Append(">>\n");
     pdf.Append("stream\n");
     pdf.Append(data, 0, data.Length);
     pdf.Append("\nendstream\n");
     pdf.Endobj();
     pdf.images.Add(this);
     this.objNumber = pdf.objNumber;
 }
Example #22
0
 private void addImage(
     PDF pdf,
     byte[] data,
     int imageType,
     String colorSpace,
     int bitsPerComponent)
 {
     // Add the image
     pdf.newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /XObject\n");
     pdf.Append("/Subtype /Image\n");
     if (imageType == ImageType.JPEG)
     {
         pdf.Append("/Filter /DCTDecode\n");
     }
     else if (imageType == ImageType.PNG || imageType == ImageType.BMP)
     {
         pdf.Append("/Filter /FlateDecode\n");
     }
     pdf.Append("/Width ");
     pdf.Append(( int )w);
     pdf.Append('\n');
     pdf.Append("/Height ");
     pdf.Append(( int )h);
     pdf.Append('\n');
     pdf.Append("/ColorSpace /");
     pdf.Append(colorSpace);
     pdf.Append('\n');
     pdf.Append("/BitsPerComponent ");
     pdf.Append(bitsPerComponent);
     pdf.Append('\n');
     pdf.Append("/Length ");
     pdf.Append(data.Length);
     pdf.Append('\n');
     pdf.Append(">>\n");
     pdf.Append("stream\n");
     pdf.Append(data, 0, data.Length);
     pdf.Append("\nendstream\n");
     pdf.endobj();
     pdf.images.Add(this);
     objNumber = pdf.objNumber;
 }
Example #23
0
        private static void AddToUnicodeCMapObject(PDF pdf, Font font)
        {
            for (int i = 0; i < pdf.fonts.Count; i++)
            {
                Font f = pdf.fonts[i];
                if (f.name.Equals(font.name) && f.GetToUnicodeCMapObjNumber() != -1)
                {
                    font.SetToUnicodeCMapObjNumber(f.GetToUnicodeCMapObjNumber());
                    return;
                }
            }

            StringBuilder sb = new StringBuilder();

            sb.Append("/CIDInit /ProcSet findresource begin\n");
            sb.Append("12 dict begin\n");
            sb.Append("begincmap\n");
            sb.Append("/CIDSystemInfo <</Registry (Adobe) /Ordering (Identity) /Supplement 0>> def\n");
            sb.Append("/CMapName /Adobe-Identity def\n");
            sb.Append("/CMapType 2 def\n");

            sb.Append("1 begincodespacerange\n");
            sb.Append("<0000> <FFFF>\n");
            sb.Append("endcodespacerange\n");

            List <String> list = new List <String>();
            StringBuilder buf  = new StringBuilder();

            for (int cid = 0; cid <= 0xffff; cid++)
            {
                int gid = font.unicodeToGID[cid];
                if (gid > 0)
                {
                    buf.Append('<');
                    buf.Append(ToHexString(gid));
                    buf.Append("> <");
                    buf.Append(ToHexString(cid));
                    buf.Append(">\n");
                    list.Add(buf.ToString());
                    buf.Length = 0;
                    if (list.Count == 100)
                    {
                        WriteListToBuffer(list, sb);
                    }
                }
            }
            if (list.Count > 0)
            {
                WriteListToBuffer(list, sb);
            }

            sb.Append("endcmap\n");
            sb.Append("CMapName currentdict /CMap defineresource pop\n");
            sb.Append("end\nend");

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Length ");
            pdf.Append(sb.Length);
            pdf.Append("\n");
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            pdf.Append(sb.ToString());
            pdf.Append("\nendstream\n");
            pdf.Endobj();

            font.SetToUnicodeCMapObjNumber(pdf.objNumber);
        }
Example #24
0
 private void addImage(
     PDF pdf,
     byte[] data,
     int imageType,
     String colorSpace,
     int bitsPerComponent)
 {
     // Add the image
     pdf.newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /XObject\n");
     pdf.Append("/Subtype /Image\n");
     if (imageType == ImageType.JPEG) {
     pdf.Append("/Filter /DCTDecode\n");
     }
     else if (imageType == ImageType.PNG || imageType == ImageType.BMP) {
     pdf.Append("/Filter /FlateDecode\n");
     }
     pdf.Append("/Width ");
     pdf.Append(( int ) w);
     pdf.Append('\n');
     pdf.Append("/Height ");
     pdf.Append(( int ) h);
     pdf.Append('\n');
     pdf.Append("/ColorSpace /");
     pdf.Append(colorSpace);
     pdf.Append('\n');
     pdf.Append("/BitsPerComponent ");
     pdf.Append(bitsPerComponent);
     pdf.Append('\n');
     pdf.Append("/Length ");
     pdf.Append(data.Length);
     pdf.Append('\n');
     pdf.Append(">>\n");
     pdf.Append("stream\n");
     pdf.Append(data, 0, data.Length);
     pdf.Append("\nendstream\n");
     pdf.endobj();
     pdf.images.Add(this);
     objNumber = pdf.objNumber;
 }
Example #25
0
        internal static void Register(
            PDF pdf,
            Font font,
            Stream inputStream)
        {
            GetFontData(font, inputStream);
            EmbedFontFile(pdf, font, inputStream);
            AddFontDescriptorObject(pdf, font);
            AddCIDFontDictionaryObject(pdf, font);
            AddToUnicodeCMapObject(pdf, font);

            // Type0 Font Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(font.name);
            pdf.Append('\n');
            pdf.Append("/Encoding /Identity-H\n");
            pdf.Append("/DescendantFonts [");
            pdf.Append(font.cidFontDictObjNumber);
            pdf.Append(" 0 R]\n");
            pdf.Append("/ToUnicode ");
            pdf.Append(font.toUnicodeCMapObjNumber);
            pdf.Append(" 0 R\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.objNumber = pdf.GetObjNumber();
            pdf.fonts.Add(font);
        }
Example #26
0
        // Constructor for CJK fonts
        public Font(PDF pdf, String fontName)
        {
            this.name       = fontName;
            this.isCJK      = true;
            this.firstChar  = 0x0020;
            this.lastChar   = 0xFFEE;
            this.ascent     = this.size;
            this.descent    = this.size / 4;
            this.bodyHeight = this.ascent + this.descent;

            // Font Descriptor
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /FontDescriptor\n");
            pdf.Append("/FontName /");
            pdf.Append(fontName);
            pdf.Append('\n');
            pdf.Append("/Flags 4\n");
            pdf.Append("/FontBBox [0 0 0 0]\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            // CIDFont Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /CIDFontType0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(fontName);
            pdf.Append('\n');
            pdf.Append("/FontDescriptor ");
            pdf.Append(pdf.GetObjNumber() - 1);
            pdf.Append(" 0 R\n");
            pdf.Append("/CIDSystemInfo <<\n");
            pdf.Append("/Registry (Adobe)\n");
            if (fontName.StartsWith("AdobeMingStd"))
            {
                pdf.Append("/Ordering (CNS1)\n");
                pdf.Append("/Supplement 4\n");
            }
            else if (fontName.StartsWith("AdobeSongStd") ||
                     fontName.StartsWith("STHeitiSC"))
            {
                pdf.Append("/Ordering (GB1)\n");
                pdf.Append("/Supplement 4\n");
            }
            else if (fontName.StartsWith("KozMinPro"))
            {
                pdf.Append("/Ordering (Japan1)\n");
                pdf.Append("/Supplement 4\n");
            }
            else if (fontName.StartsWith("AdobeMyungjoStd"))
            {
                pdf.Append("/Ordering (Korea1)\n");
                pdf.Append("/Supplement 1\n");
            }
            else
            {
                throw new Exception("Unsupported font: " + fontName);
            }
            pdf.Append(">>\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            // Type0 Font Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            if (fontName.StartsWith("AdobeMingStd"))
            {
                pdf.Append(fontName + "-UniCNS-UTF16-H\n");
                pdf.Append("/Encoding /UniCNS-UTF16-H\n");
            }
            else if (fontName.StartsWith("AdobeSongStd") ||
                     fontName.StartsWith("STHeitiSC"))
            {
                pdf.Append(fontName + "-UniGB-UTF16-H\n");
                pdf.Append("/Encoding /UniGB-UTF16-H\n");
            }
            else if (fontName.StartsWith("KozMinPro"))
            {
                pdf.Append(fontName + "-UniJIS-UCS2-H\n");
                pdf.Append("/Encoding /UniJIS-UCS2-H\n");
            }
            else if (fontName.StartsWith("AdobeMyungjoStd"))
            {
                pdf.Append(fontName + "-UniKS-UCS2-H\n");
                pdf.Append("/Encoding /UniKS-UCS2-H\n");
            }
            else
            {
                throw new Exception("Unsupported font: " + fontName);
            }
            pdf.Append("/DescendantFonts [");
            pdf.Append(pdf.GetObjNumber() - 1);
            pdf.Append(" 0 R]\n");
            pdf.Append(">>\n");
            pdf.Endobj();
            objNumber = pdf.GetObjNumber();

            pdf.fonts.Add(this);
        }
Example #27
0
        public Image(PDF pdf, PDFobj obj)
        {
            // Console.WriteLine(obj.GetDict());
            w = float.Parse(obj.GetValue("/Width"));
            h = float.Parse(obj.GetValue("/Height"));
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /XObject\n");
            pdf.Append("/Subtype /Image\n");
            pdf.Append("/Filter ");
            pdf.Append(obj.GetValue("/Filter"));
            pdf.Append("\n");
            pdf.Append("/Width ");
            pdf.Append(w);
            pdf.Append('\n');
            pdf.Append("/Height ");
            pdf.Append(h);
            pdf.Append('\n');
            String colorSpace = obj.GetValue("/ColorSpace");

            if (!colorSpace.Equals(""))
            {
                pdf.Append("/ColorSpace ");
                pdf.Append(colorSpace);
                pdf.Append("\n");
            }
            pdf.Append("/BitsPerComponent ");
            pdf.Append(obj.GetValue("/BitsPerComponent"));
            pdf.Append("\n");
            String decodeParms = obj.GetValue("/DecodeParms");

            if (!decodeParms.Equals(""))
            {
                pdf.Append("/DecodeParms ");
                pdf.Append(decodeParms);
                pdf.Append("\n");
            }
            String imageMask = obj.GetValue("/ImageMask");

            if (!imageMask.Equals(""))
            {
                pdf.Append("/ImageMask ");
                pdf.Append(imageMask);
                pdf.Append("\n");
            }
            pdf.Append("/Length ");
            pdf.Append(obj.stream.Length);
            pdf.Append('\n');
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            pdf.Append(obj.stream, 0, obj.stream.Length);
            pdf.Append("\nendstream\n");
            pdf.Endobj();
            pdf.images.Add(this);
            objNumber = pdf.objNumber;
        }
Example #28
0
        private void AddCIDFontDictionaryObject(
            PDF pdf,
            Font font,
            OTF otf)
        {
            for (int i = 0; i < pdf.fonts.Count; i++) {
            Font f = pdf.fonts[i];
            if (f.name.Equals(otf.fontName) && f.GetCidFontDictObjNumber() != -1) {
                font.SetCidFontDictObjNumber(f.GetCidFontDictObjNumber());
                return;
            }
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            if (otf.cff) {
            pdf.Append("/Subtype /CIDFontType0\n");
            } else {
            pdf.Append("/Subtype /CIDFontType2\n");
            }
            pdf.Append("/BaseFont /");
            pdf.Append(otf.fontName);
            pdf.Append('\n');
            pdf.Append("/CIDSystemInfo <</Registry (Adobe) /Ordering (Identity) /Supplement 0>>\n");
            pdf.Append("/FontDescriptor ");
            pdf.Append(font.GetFontDescriptorObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append("/DW ");
            pdf.Append((int)
                ((1000f / otf.unitsPerEm) * otf.advanceWidth[0]));
            pdf.Append('\n');
            pdf.Append("/W [0[\n");
            for (int i = 0; i < otf.advanceWidth.Length; i++) {
            pdf.Append((int)
                    ((1000f / otf.unitsPerEm) * otf.advanceWidth[i]));
            if ((i + 1) % 10 == 0) {
                pdf.Append('\n');
            }
            else {
                pdf.Append(' ');
            }
            }
            pdf.Append("]]\n");
            pdf.Append("/CIDToGIDMap /Identity\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.SetCidFontDictObjNumber(pdf.objNumber);
        }
Example #29
0
        public EmbeddedFile(PDF pdf, String fileName, Stream stream, bool compress)
        {
            this.fileName = fileName;

            MemoryStream baos = new MemoryStream();

            byte[] buf = new byte[4096];
            int    number;

            while ((number = stream.Read(buf, 0, buf.Length)) > 0)
            {
                baos.Write(buf, 0, number);
            }
            stream.Dispose();

            if (compress)
            {
                buf  = baos.ToArray();
                baos = new MemoryStream();
                DeflaterOutputStream dos = new DeflaterOutputStream(baos);
                dos.Write(buf, 0, buf.Length);
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /EmbeddedFile\n");
            if (compress)
            {
                pdf.Append("/Filter /FlateDecode\n");
            }
            pdf.Append("/Length ");
            pdf.Append(baos.Length);
            pdf.Append("\n");
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            pdf.Append(baos);
            pdf.Append("\nendstream\n");
            pdf.Endobj();

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Filespec\n");
            pdf.Append("/F (");
            pdf.Append(fileName);
            pdf.Append(")\n");
            pdf.Append("/EF <</F ");
            pdf.Append(pdf.GetObjNumber() - 1);
            pdf.Append(" 0 R>>\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            this.objNumber = pdf.GetObjNumber();
        }
Example #30
0
        private void AddEncodingObject(
            PDF pdf,
            Font font,
            int codePage)
        {
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Encoding\n");
            pdf.Append("/BaseEncoding /WinAnsiEncoding\n");
            pdf.Append("/Differences [127\n");
            for (int i = 0; i < 129; i++) {
            if (codePage == 0) {
                pdf.Append(CP1250.names[i]);
            }
            else if (codePage == 1) {
                pdf.Append(CP1251.names[i]);
            }
            else if (codePage == 2) {
                pdf.Append(CP1252.names[i]);
            }
            else if (codePage == 3) {
                pdf.Append(CP1253.names[i]);
            }
            else if (codePage == 4) {
                pdf.Append(CP1254.names[i]);
            }
            else if (codePage == 7) {
                pdf.Append(CP1257.names[i]);
            }
            pdf.Append(' ');
            }
            pdf.Append("]\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.SetEncodingObjNumber(pdf.objNumber);
        }
Example #31
0
        internal void RegisterAsSimple(
            PDF pdf,
            Font font,
            Stream inputStream,
            int codePage,
            bool embed)
        {
            otf = new OTF(inputStream);
            if (embed)
            {
                EmbedFontFile(pdf, font, otf, true);
            }

            AddFontDescriptorObject(pdf, font, otf, embed);
            AddWidthsArrayObject(pdf, font, otf, codePage);
            AddEncodingObject(pdf, font, codePage);

            // Simple font object
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            if (otf.cff)
            {
                pdf.Append("/Subtype /Type1\n");
            }
            else
            {
                pdf.Append("/Subtype /TrueType\n");
            }
            pdf.Append("/BaseFont /");
            pdf.Append(otf.fontName);
            pdf.Append('\n');
            pdf.Append("/FirstChar ");
            pdf.Append(otf.firstChar);
            pdf.Append('\n');
            pdf.Append("/LastChar ");
            pdf.Append(255);
            pdf.Append('\n');
            pdf.Append("/Encoding ");
            pdf.Append(font.GetEncodingObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append("/Widths ");
            pdf.Append(font.GetWidthsArrayObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append("/FontDescriptor ");
            pdf.Append(font.GetFontDescriptorObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.objNumber = pdf.objNumber;
        }
Example #32
0
        private void AddFontDescriptorObject(
            PDF pdf,
            Font font,
            OTF otf,
            bool embed)
        {
            float factor = 1000f / otf.unitsPerEm;

            for (int i = 0; i < pdf.fonts.Count; i++) {
            Font f = pdf.fonts[i];
            if (f.name.Equals(otf.fontName) && f.GetFontDescriptorObjNumber() != -1) {
                font.SetFontDescriptorObjNumber(f.GetFontDescriptorObjNumber());
                return;
            }
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /FontDescriptor\n");
            pdf.Append("/FontName /");
            pdf.Append(otf.fontName);
            pdf.Append('\n');
            if (embed) {
            if (otf.cff) {
                pdf.Append("/FontFile3 ");
            } else {
                pdf.Append("/FontFile2 ");
            }
            pdf.Append(font.fileObjNumber);
            pdf.Append(" 0 R\n");
            }
            pdf.Append("/Flags 32\n");
            pdf.Append("/FontBBox [");
            pdf.Append(otf.bBoxLLx * factor);
            pdf.Append(' ');
            pdf.Append(otf.bBoxLLy * factor);
            pdf.Append(' ');
            pdf.Append(otf.bBoxURx * factor);
            pdf.Append(' ');
            pdf.Append(otf.bBoxURy * factor);
            pdf.Append("]\n");
            pdf.Append("/Ascent ");
            pdf.Append(otf.ascent * factor);
            pdf.Append('\n');
            pdf.Append("/Descent ");
            pdf.Append(otf.descent * factor);
            pdf.Append('\n');
            pdf.Append("/ItalicAngle 0\n");
            pdf.Append("/CapHeight ");
            pdf.Append(otf.capHeight * factor);
            pdf.Append('\n');
            pdf.Append("/StemV 79\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.SetFontDescriptorObjNumber(pdf.objNumber);
        }
Example #33
0
        private void AddEncodingObject(
            PDF pdf,
            Font font,
            int codePage)
        {
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Encoding\n");
            pdf.Append("/BaseEncoding /WinAnsiEncoding\n");
            pdf.Append("/Differences [127\n");
            for (int i = 0; i < 129; i++)
            {
                if (codePage == 0)
                {
                    pdf.Append(CP1250.names[i]);
                }
                else if (codePage == 1)
                {
                    pdf.Append(CP1251.names[i]);
                }
                else if (codePage == 2)
                {
                    pdf.Append(CP1252.names[i]);
                }
                else if (codePage == 3)
                {
                    pdf.Append(CP1253.names[i]);
                }
                else if (codePage == 4)
                {
                    pdf.Append(CP1254.names[i]);
                }
                else if (codePage == 7)
                {
                    pdf.Append(CP1257.names[i]);
                }
                pdf.Append(' ');
            }
            pdf.Append("]\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.SetEncodingObjNumber(pdf.objNumber);
        }
Example #34
0
        private void AddToUnicodeCMapObject(
            PDF pdf,
            Font font,
            OTF otf)
        {
            for (int i = 0; i < pdf.fonts.Count; i++) {
            Font f = pdf.fonts[i];
            if (f.name.Equals(otf.fontName) && f.GetToUnicodeCMapObjNumber() != -1) {
                font.SetToUnicodeCMapObjNumber(f.GetToUnicodeCMapObjNumber());
                return;
            }
            }

            StringBuilder sb = new StringBuilder();

            sb.Append("/CIDInit /ProcSet findresource begin\n");
            sb.Append("12 dict begin\n");
            sb.Append("begincmap\n");
            sb.Append("/CIDSystemInfo <</Registry (Adobe) /Ordering (Identity) /Supplement 0>> def\n");
            sb.Append("/CMapName /Adobe-Identity def\n");
            sb.Append("/CMapType 2 def\n");

            sb.Append("1 begincodespacerange\n");
            sb.Append("<0000> <FFFF>\n");
            sb.Append("endcodespacerange\n");

            List<String> list = new List<String>();
            StringBuilder buf = new StringBuilder();
            for (int cid = 0; cid <= 0xffff; cid++) {
            int gid = otf.unicodeToGID[cid];
            if (gid > 0) {
                buf.Append('<');
                buf.Append(ToHexString(gid));
                buf.Append("> <");
                buf.Append(ToHexString(cid));
                buf.Append(">\n");
                list.Add(buf.ToString());
                buf.Length = 0;
                if (list.Count == 100) {
                    WriteListToBuffer(list, sb);
                }
            }
            }
            if (list.Count > 0) {
            WriteListToBuffer(list, sb);
            }

            sb.Append("endcmap\n");
            sb.Append("CMapName currentdict /CMap defineresource pop\n");
            sb.Append("end\nend");

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Length ");
            pdf.Append(sb.Length);
            pdf.Append("\n");
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            pdf.Append(sb.ToString());
            pdf.Append("\nendstream\n");
            pdf.Endobj();

            font.SetToUnicodeCMapObjNumber(pdf.objNumber);
        }
Example #35
0
        private void AddImage(
            PDF pdf,
            Stream stream,
            int imageType,
            float w,
            float h,
            long length,
            String colorSpace,
            int bitsPerComponent)
        {
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /XObject\n");
            pdf.Append("/Subtype /Image\n");
            if (imageType == ImageType.JPG)
            {
                pdf.Append("/Filter /DCTDecode\n");
            }
            else if (imageType == ImageType.PDF)
            {
                pdf.Append("/Filter /FlateDecode\n");
            }
            pdf.Append("/Width ");
            pdf.Append(( int )w);
            pdf.Append('\n');
            pdf.Append("/Height ");
            pdf.Append(( int )h);
            pdf.Append('\n');
            pdf.Append("/ColorSpace /");
            pdf.Append(colorSpace);
            pdf.Append('\n');
            pdf.Append("/BitsPerComponent ");
            pdf.Append(bitsPerComponent);
            pdf.Append('\n');
            if (colorSpace.Equals("DeviceCMYK"))
            {
                // If the image was created with Photoshop - invert the colors:
                pdf.Append("/Decode [1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0]\n");
            }
            pdf.Append("/Length ");
            pdf.Append((int)length);
            pdf.Append('\n');
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            byte[] buf = new byte[2048];
            int    count;

            while ((count = stream.Read(buf, 0, buf.Length)) != 0)
            {
                pdf.Append(buf, 0, count);
            }
            pdf.Append("\nendstream\n");
            pdf.Endobj();
            pdf.images.Add(this);
            objNumber = pdf.objNumber;
        }
Example #36
0
        internal void RegisterAsComposite(
            PDF pdf,
            Font font,
            Stream inputStream,
            bool embed)
        {
            otf = new OTF(inputStream);
            if (embed) {
            EmbedFontFile(pdf, font, otf, false);
            }

            AddFontDescriptorObject(pdf, font, otf, embed);
            AddCIDFontDictionaryObject(pdf, font, otf);
            AddToUnicodeCMapObject(pdf, font, otf);

            // Type0 Font Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(otf.fontName);
            pdf.Append('\n');
            pdf.Append("/Encoding /Identity-H\n");
            pdf.Append("/DescendantFonts [");
            pdf.Append(font.GetCidFontDictObjNumber());
            pdf.Append(" 0 R]\n");
            pdf.Append("/ToUnicode ");
            pdf.Append(font.GetToUnicodeCMapObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.objNumber = pdf.objNumber;
        }
Example #37
0
 private void AddSoftMask(PDF pdf, byte[] data, string colorSpace, int bitsPerComponent)
 {
     pdf.Newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /XObject\n");
     pdf.Append("/Subtype /Image\n");
     pdf.Append("/Filter /FlateDecode\n");
     pdf.Append("/Width ");
     pdf.Append((int)this.w);
     pdf.Append('\n');
     pdf.Append("/Height ");
     pdf.Append((int)this.h);
     pdf.Append('\n');
     pdf.Append("/ColorSpace /");
     pdf.Append(colorSpace);
     pdf.Append('\n');
     pdf.Append("/BitsPerComponent ");
     pdf.Append(bitsPerComponent);
     pdf.Append('\n');
     pdf.Append("/Length ");
     pdf.Append(data.Length);
     pdf.Append('\n');
     pdf.Append(">>\n");
     pdf.Append("stream\n");
     pdf.Append(data, 0, data.Length);
     pdf.Append("\nendstream\n");
     pdf.Endobj();
     this.objNumber = pdf.objNumber;
 }
Example #38
0
        private void AddWidthsArrayObject(
            PDF pdf,
            Font font,
            OTF otf,
            int codePage)
        {
            pdf.Newobj();
            pdf.Append("[ ");
            int n = 1;
            for (int c = otf.firstChar; c < 256; c++) {
            if (c < 127) {
                pdf.Append((int)
                        ((1000.0f / otf.unitsPerEm) * otf.glyphWidth[c]));
            } else {
                if (codePage == 0) {
                    pdf.Append((int) ((1000.0f / otf.unitsPerEm)
                            * otf.glyphWidth[CP1250.codes[c - 127]]));
                } else if (codePage == 1) {
                    pdf.Append((int) ((1000.0f / otf.unitsPerEm)
                            * otf.glyphWidth[CP1251.codes[c - 127]]));
                } else if (codePage == 2) {
                    pdf.Append((int) ((1000.0f / otf.unitsPerEm)
                            * otf.glyphWidth[CP1252.codes[c - 127]]));
                } else if (codePage == 3) {
                    pdf.Append((int) ((1000.0f / otf.unitsPerEm)
                            * otf.glyphWidth[CP1253.codes[c - 127]]));
                } else if (codePage == 4) {
                    pdf.Append((int) ((1000.0f / otf.unitsPerEm)
                            * otf.glyphWidth[CP1254.codes[c - 127]]));
                } else if (codePage == 7) {
                    pdf.Append((int) ((1000.0f / otf.unitsPerEm)
                            * otf.glyphWidth[CP1257.codes[c - 127]]));
                }
            }
            if (n < 10) {
                pdf.Append(' ');
                ++n;
            }
            else {
                pdf.Append('\n');
                n = 1;
            }
            }
            pdf.Append("]\n");
            pdf.Endobj();

            font.SetWidthsArrayObjNumber(pdf.objNumber);
        }
Example #39
0
        private void AddImage(PDF pdf, Stream stream, int imageType, float w, float h, long length, string colorSpace, int bitsPerComponent)
        {
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /XObject\n");
            pdf.Append("/Subtype /Image\n");
            if (imageType == ImageType.JPG)
            {
                pdf.Append("/Filter /DCTDecode\n");
            }
            else
            {
                if (imageType == ImageType.PDF)
                {
                    pdf.Append("/Filter /FlateDecode\n");
                }
            }
            pdf.Append("/Width ");
            pdf.Append((int)w);
            pdf.Append('\n');
            pdf.Append("/Height ");
            pdf.Append((int)h);
            pdf.Append('\n');
            pdf.Append("/ColorSpace /");
            pdf.Append(colorSpace);
            pdf.Append('\n');
            pdf.Append("/BitsPerComponent ");
            pdf.Append(bitsPerComponent);
            pdf.Append('\n');
            if (colorSpace.Equals("DeviceCMYK"))
            {
                pdf.Append("/Decode [1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0]\n");
            }
            pdf.Append("/Length ");
            pdf.Append((int)length);
            pdf.Append('\n');
            pdf.Append(">>\n");
            pdf.Append("stream\n");
            byte[] array = new byte[2048];
            int    len;

            while ((len = stream.Read(array, 0, array.Length)) != 0)
            {
                pdf.Append(array, 0, len);
            }
            pdf.Append("\nendstream\n");
            pdf.Endobj();
            pdf.images.Add(this);
            this.objNumber = pdf.objNumber;
        }
Example #40
0
 public Image(PDF pdf, PDFobj obj)
 {
     pdf.newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /XObject\n");
     pdf.Append("/Subtype /Image\n");
     pdf.Append("/Filter ");
     pdf.Append(obj.getValue(PDFobj.FILTER));
     pdf.Append('\n');
     pdf.Append("/Width ");
     pdf.Append(obj.getValue(PDFobj.WIDTH));
     pdf.Append('\n');
     pdf.Append("/Height ");
     pdf.Append(obj.getValue(PDFobj.HEIGHT));
     pdf.Append('\n');
     pdf.Append("/ColorSpace ");
     pdf.Append(obj.getValue(PDFobj.COLORSPACE));
     pdf.Append('\n');
     pdf.Append("/BitsPerComponent ");
     pdf.Append(obj.getValue(PDFobj.BITSPERCOMPONENT));
     pdf.Append('\n');
     pdf.Append("/Length ");
     pdf.Append(obj.stream.Length);
     pdf.Append('\n');
     pdf.Append(">>\n");
     pdf.Append("stream\n");
     pdf.Append(obj.stream, 0, obj.stream.Length);
     pdf.Append("\nendstream\n");
     pdf.endobj();
     pdf.images.Add(this);
     objNumber = pdf.objNumber;
 }
Example #41
0
        private static void AddFontDescriptorObject(PDF pdf, Font font)
        {
            float factor = 1000f / font.unitsPerEm;

            for (int i = 0; i < pdf.fonts.Count; i++)
            {
                Font f = pdf.fonts[i];
                if (f.name.Equals(font.name) && f.GetFontDescriptorObjNumber() != -1)
                {
                    font.SetFontDescriptorObjNumber(f.GetFontDescriptorObjNumber());
                    return;
                }
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /FontDescriptor\n");
            pdf.Append("/FontName /");
            pdf.Append(font.name);
            pdf.Append('\n');
            pdf.Append("/FontFile2 ");
            pdf.Append(font.fileObjNumber);
            pdf.Append(" 0 R\n");
            pdf.Append("/Flags 32\n");
            pdf.Append("/FontBBox [");
            pdf.Append(font.bBoxLLx * factor);
            pdf.Append(' ');
            pdf.Append(font.bBoxLLy * factor);
            pdf.Append(' ');
            pdf.Append(font.bBoxURx * factor);
            pdf.Append(' ');
            pdf.Append(font.bBoxURy * factor);
            pdf.Append("]\n");
            pdf.Append("/Ascent ");
            pdf.Append(font.ascent * factor);
            pdf.Append('\n');
            pdf.Append("/Descent ");
            pdf.Append(font.descent * factor);
            pdf.Append('\n');
            pdf.Append("/ItalicAngle 0\n");
            pdf.Append("/CapHeight ");
            pdf.Append(font.capHeight * factor);
            pdf.Append('\n');
            pdf.Append("/StemV 79\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.SetFontDescriptorObjNumber(pdf.objNumber);
        }
Example #42
0
        internal static void Register(
            PDF pdf,
            Font font,
            Stream inputStream)
        {
            int len = inputStream.ReadByte();
            byte[] fontName = new byte[len];
            inputStream.Read(fontName, 0, len);
            font.name = System.Text.Encoding.UTF8.GetString(fontName);
            // Console.WriteLine(font.name);

            font.unitsPerEm = GetInt32(inputStream);
            font.bBoxLLx = GetInt32(inputStream);
            font.bBoxLLy = GetInt32(inputStream);
            font.bBoxURx = GetInt32(inputStream);
            font.bBoxURy = GetInt32(inputStream);
            font.ascent = GetInt32(inputStream);
            font.descent = GetInt32(inputStream);
            font.firstChar = GetInt32(inputStream);
            font.lastChar = GetInt32(inputStream);
            font.capHeight = GetInt32(inputStream);
            font.underlinePosition = GetInt32(inputStream);
            font.underlineThickness = GetInt32(inputStream);

            len = GetInt32(inputStream);
            font.advanceWidth = new int[len];
            for (int i = 0; i < len; i++) {
            font.advanceWidth[i] = GetInt16(inputStream);
            }

            len = GetInt32(inputStream);
            font.glyphWidth = new int[len];
            for (int i = 0; i < len; i++) {
            font.glyphWidth[i] = GetInt16(inputStream);
            }

            len = GetInt32(inputStream);
            font.unicodeToGID = new int[len];
            for (int i = 0; i < len; i++) {
            font.unicodeToGID[i] = GetInt16(inputStream);
            }

            font.uncompressed_size = GetInt32(inputStream);
            font.compressed_size = GetInt32(inputStream);

            EmbedFontFile(pdf, font, inputStream);
            AddFontDescriptorObject(pdf, font);
            AddCIDFontDictionaryObject(pdf, font);
            AddToUnicodeCMapObject(pdf, font);

            // Type0 Font Dictionary
            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(font.name);
            pdf.Append('\n');
            pdf.Append("/Encoding /Identity-H\n");
            pdf.Append("/DescendantFonts [");
            pdf.Append(font.GetCidFontDictObjNumber());
            pdf.Append(" 0 R]\n");
            pdf.Append("/ToUnicode ");
            pdf.Append(font.GetToUnicodeCMapObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.objNumber = pdf.objNumber;
        }
Example #43
0
        private static void AddCIDFontDictionaryObject(PDF pdf, Font font)
        {
            for (int i = 0; i < pdf.fonts.Count; i++)
            {
                Font f = pdf.fonts[i];
                if (f.name.Equals(font.name) && f.GetCidFontDictObjNumber() != -1)
                {
                    font.SetCidFontDictObjNumber(f.GetCidFontDictObjNumber());
                    return;
                }
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /CIDFontType2\n");
            pdf.Append("/BaseFont /");
            pdf.Append(font.name);
            pdf.Append('\n');
            pdf.Append("/CIDSystemInfo <</Registry (Adobe) /Ordering (Identity) /Supplement 0>>\n");
            pdf.Append("/FontDescriptor ");
            pdf.Append(font.GetFontDescriptorObjNumber());
            pdf.Append(" 0 R\n");
            pdf.Append("/DW ");
            pdf.Append((int)
                       ((1000f / font.unitsPerEm) * font.advanceWidth[0]));
            pdf.Append('\n');
            pdf.Append("/W [0[\n");
            for (int i = 0; i < font.advanceWidth.Length; i++)
            {
                pdf.Append((int)
                           ((1000f / font.unitsPerEm) * font.advanceWidth[i]));
                if ((i + 1) % 10 == 0)
                {
                    pdf.Append('\n');
                }
                else
                {
                    pdf.Append(' ');
                }
            }
            pdf.Append("]]\n");
            pdf.Append("/CIDToGIDMap /Identity\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.SetCidFontDictObjNumber(pdf.objNumber);
        }
Example #44
0
        // Constructor for CJK fonts
        public Font(PDF pdf, String fontName, int codePage)
        {
            this.pdf      = pdf;
            this.name     = fontName;
            this.codePage = codePage;
            isCJK         = true;
            isStandard    = false;
            isComposite   = true;

            firstChar = 0x0020;
            lastChar  = 0xFFEE;

            // Font Descriptor
            pdf.newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /FontDescriptor\n");
            pdf.Append("/FontName /");
            pdf.Append(fontName);
            pdf.Append('\n');
            pdf.Append("/Flags 4\n");
            pdf.Append("/FontBBox [0 0 0 0]\n");
            pdf.Append(">>\n");
            pdf.endobj();

            // CIDFont Dictionary
            pdf.newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /CIDFontType0\n");
            pdf.Append("/BaseFont /");
            pdf.Append(fontName);
            pdf.Append('\n');
            pdf.Append("/FontDescriptor ");
            pdf.Append(pdf.objNumber - 1);
            pdf.Append(" 0 R\n");
            pdf.Append("/CIDSystemInfo <<\n");
            pdf.Append("/Registry (Adobe)\n");
            if (fontName.StartsWith("AdobeMingStd"))
            {
                pdf.Append("/Ordering (CNS1)\n");
                pdf.Append("/Supplement 4\n");
            }
            else if (fontName.StartsWith("AdobeSongStd"))
            {
                pdf.Append("/Ordering (GB1)\n");
                pdf.Append("/Supplement 4\n");
            }
            else if (fontName.StartsWith("KozMinPro"))
            {
                pdf.Append("/Ordering (Japan1)\n");
                pdf.Append("/Supplement 4\n");
            }
            else if (fontName.StartsWith("AdobeMyungjoStd"))
            {
                pdf.Append("/Ordering (Korea1)\n");
                pdf.Append("/Supplement 1\n");
            }
            else
            {
                throw new Exception("Unsupported font: " + fontName);
            }
            pdf.Append(">>\n");
            pdf.Append(">>\n");
            pdf.endobj();

            // Type0 Font Dictionary
            pdf.newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            pdf.Append("/Subtype /Type0\n");
            pdf.Append("/BaseFont /");
            if (fontName.StartsWith("AdobeMingStd"))
            {
                pdf.Append(fontName + "-UniCNS-UTF16-H\n");
                pdf.Append("/Encoding /UniCNS-UTF16-H\n");
            }
            else if (fontName.StartsWith("AdobeSongStd"))
            {
                pdf.Append(fontName + "-UniGB-UTF16-H\n");
                pdf.Append("/Encoding /UniGB-UTF16-H\n");
            }
            else if (fontName.StartsWith("KozMinPro"))
            {
                pdf.Append(fontName + "-UniJIS-UCS2-H\n");
                pdf.Append("/Encoding /UniJIS-UCS2-H\n");
            }
            else if (fontName.StartsWith("AdobeMyungjoStd"))
            {
                pdf.Append(fontName + "-UniKS-UCS2-H\n");
                pdf.Append("/Encoding /UniKS-UCS2-H\n");
            }
            else
            {
                throw new Exception("Unsupported font: " + fontName);
            }
            pdf.Append("/DescendantFonts [");
            pdf.Append(pdf.objNumber - 1);
            pdf.Append(" 0 R]\n");
            pdf.Append(">>\n");
            pdf.endobj();
            objNumber = pdf.objNumber;

            ascent      = size;
            descent     = -ascent / 4;
            body_height = ascent - descent;

            pdf.fonts.Add(this);
        }
Example #45
0
        private void EmbedFontFile(
            PDF pdf,
            Font font,
            OTF otf,
            bool simpleFont)
        {
            // Check if the font file is already embedded
            for (int i = 0; i < pdf.fonts.Count; i++) {
            Font f = pdf.fonts[i];
            if (f.name.Equals(otf.fontName) && f.fileObjNumber != -1) {
                font.fileObjNumber = f.fileObjNumber;
                return;
            }
            }

            int metadataObjNumber = -1;
            if (otf.fontName.ToLower().IndexOf("droid") != -1
                || otf.fontName.ToLower().IndexOf("roboto") != -1) {
            metadataObjNumber = pdf.AddMetadataObject(AndroidFontsCopyright.NOTICE, true);
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            if (otf.cff) {
            if (simpleFont) {
                pdf.Append("/Subtype /Type1C\n");
            }
            else {
                pdf.Append("/Subtype /CIDFontType0C\n");
            }
            }
            pdf.Append("/Filter /FlateDecode\n");

            pdf.Append("/Length ");
            pdf.Append(otf.baos.Length);
            pdf.Append("\n");

            if (!otf.cff) {
            pdf.Append("/Length1 ");
            pdf.Append(otf.buf.Length);
            pdf.Append('\n');
            }

            if (metadataObjNumber != -1) {
            pdf.Append("/Metadata ");
            pdf.Append(metadataObjNumber);
            pdf.Append(" 0 R\n");
            }

            pdf.Append(">>\n");
            pdf.Append("stream\n");
            pdf.Append(otf.baos);
            pdf.Append("\nendstream\n");
            pdf.Endobj();

            font.fileObjNumber = pdf.objNumber;
        }
Example #46
0
        private static void AddCIDFontDictionaryObject(PDF pdf, Font font)
        {
            foreach (Font f in pdf.fonts)
            {
                if (f.cidFontDictObjNumber != 0 && f.name.Equals(font.name))
                {
                    font.cidFontDictObjNumber = f.cidFontDictObjNumber;
                    return;
                }
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /Font\n");
            if (font.cff)
            {
                pdf.Append("/Subtype /CIDFontType0\n");
            }
            else
            {
                pdf.Append("/Subtype /CIDFontType2\n");
            }
            pdf.Append("/BaseFont /");
            pdf.Append(font.name);
            pdf.Append('\n');
            pdf.Append("/CIDSystemInfo <</Registry (Adobe) /Ordering (Identity) /Supplement 0>>\n");
            pdf.Append("/FontDescriptor ");
            pdf.Append(font.fontDescriptorObjNumber);
            pdf.Append(" 0 R\n");
            pdf.Append("/DW ");
            pdf.Append((int)
                       ((1000f / font.unitsPerEm) * font.advanceWidth[0]));
            pdf.Append('\n');
            pdf.Append("/W [0[\n");
            for (int i = 0; i < font.advanceWidth.Length; i++)
            {
                pdf.Append((int)
                           ((1000f / font.unitsPerEm) * font.advanceWidth[i]));
                pdf.Append(' ');
            }
            pdf.Append("]]\n");
            pdf.Append("/CIDToGIDMap /Identity\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.cidFontDictObjNumber = pdf.GetObjNumber();
        }
Example #47
0
 public Font(PDF pdf, string fontName, int codePage)
 {
     this.name        = fontName;
     this.codePage    = codePage;
     this.isCJK       = true;
     this.isStandard  = false;
     this.isComposite = true;
     this.firstChar   = 32;
     this.lastChar    = 65518;
     pdf.Newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /FontDescriptor\n");
     pdf.Append("/FontName /");
     pdf.Append(fontName);
     pdf.Append('\n');
     pdf.Append("/Flags 4\n");
     pdf.Append("/FontBBox [0 0 0 0]\n");
     pdf.Append(">>\n");
     pdf.Endobj();
     pdf.Newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /Font\n");
     pdf.Append("/Subtype /CIDFontType0\n");
     pdf.Append("/BaseFont /");
     pdf.Append(fontName);
     pdf.Append('\n');
     pdf.Append("/FontDescriptor ");
     pdf.Append(pdf.objNumber - 1);
     pdf.Append(" 0 R\n");
     pdf.Append("/CIDSystemInfo <<\n");
     pdf.Append("/Registry (Adobe)\n");
     if (fontName.StartsWith("AdobeMingStd"))
     {
         pdf.Append("/Ordering (CNS1)\n");
         pdf.Append("/Supplement 4\n");
     }
     else
     {
         if (fontName.StartsWith("AdobeSongStd") || fontName.StartsWith("STHeitiSC"))
         {
             pdf.Append("/Ordering (GB1)\n");
             pdf.Append("/Supplement 4\n");
         }
         else
         {
             if (fontName.StartsWith("KozMinPro"))
             {
                 pdf.Append("/Ordering (Japan1)\n");
                 pdf.Append("/Supplement 4\n");
             }
             else
             {
                 if (!fontName.StartsWith("AdobeMyungjoStd"))
                 {
                     throw new Exception("Unsupported font: " + fontName);
                 }
                 pdf.Append("/Ordering (Korea1)\n");
                 pdf.Append("/Supplement 1\n");
             }
         }
     }
     pdf.Append(">>\n");
     pdf.Append(">>\n");
     pdf.Endobj();
     pdf.Newobj();
     pdf.Append("<<\n");
     pdf.Append("/Type /Font\n");
     pdf.Append("/Subtype /Type0\n");
     pdf.Append("/BaseFont /");
     if (fontName.StartsWith("AdobeMingStd"))
     {
         pdf.Append(fontName + "-UniCNS-UTF16-H\n");
         pdf.Append("/Encoding /UniCNS-UTF16-H\n");
     }
     else
     {
         if (fontName.StartsWith("AdobeSongStd") || fontName.StartsWith("STHeitiSC"))
         {
             pdf.Append(fontName + "-UniGB-UTF16-H\n");
             pdf.Append("/Encoding /UniGB-UTF16-H\n");
         }
         else
         {
             if (fontName.StartsWith("KozMinPro"))
             {
                 pdf.Append(fontName + "-UniJIS-UCS2-H\n");
                 pdf.Append("/Encoding /UniJIS-UCS2-H\n");
             }
             else
             {
                 if (!fontName.StartsWith("AdobeMyungjoStd"))
                 {
                     throw new Exception("Unsupported font: " + fontName);
                 }
                 pdf.Append(fontName + "-UniKS-UCS2-H\n");
                 pdf.Append("/Encoding /UniKS-UCS2-H\n");
             }
         }
     }
     pdf.Append("/DescendantFonts [");
     pdf.Append(pdf.objNumber - 1);
     pdf.Append(" 0 R]\n");
     pdf.Append(">>\n");
     pdf.Endobj();
     this.objNumber   = pdf.objNumber;
     this.ascent      = this.size;
     this.descent     = -this.ascent / 4f;
     this.body_height = this.ascent - this.descent;
     pdf.fonts.Add(this);
 }
Example #48
0
        private static void EmbedFontFile(PDF pdf, Font font, Stream inputStream)
        {
            // Check if the font file is already embedded
            for (int i = 0; i < pdf.fonts.Count; i++) {
            Font f = pdf.fonts[i];
            if (f.name.Equals(font.name) && f.fileObjNumber != -1) {
                font.fileObjNumber = f.fileObjNumber;
                return;
            }
            }
            /*
            int metadataObjNumber = pdf.AddMetadataObject(DejaVu.FONT_LICENSE, true);
            */
            pdf.Newobj();
            pdf.Append("<<\n");
            /*
            pdf.Append("/Metadata ");
            pdf.Append(metadataObjNumber);
            pdf.Append(" 0 R\n");
            */
            pdf.Append("/Filter /FlateDecode\n");
            pdf.Append("/Length ");
            pdf.Append(font.compressed_size);
            pdf.Append("\n");

            pdf.Append("/Length1 ");
            pdf.Append(font.uncompressed_size);
            pdf.Append('\n');

            pdf.Append(">>\n");
            pdf.Append("stream\n");
            byte[] buf = new byte[2048];
            int len;
            while ((len = inputStream.Read(buf, 0, buf.Length)) > 0) {
            pdf.Append(buf, 0, len);
            }
            inputStream.Dispose();
            pdf.Append("\nendstream\n");
            pdf.Endobj();

            font.fileObjNumber = pdf.objNumber;
        }