コード例 #1
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();
        }
コード例 #2
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);
        }
コード例 #3
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);
        }
コード例 #4
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.GetObjNumber();
 }
コード例 #5
0
 private void AddImage(
     PDF pdf,
     byte[] data,
     byte[] alpha,
     int imageType,
     String colorSpace,
     int bitsPerComponent)
 {
     if (alpha != null)
     {
         AddSoftMask(pdf, alpha, "DeviceGray", 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.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.GetObjNumber();
 }
コード例 #6
0
        // Creates new image from an existing PDF object
        public Image(PDF pdf, PDFobj obj)
        {
            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.GetObjNumber();
        }
コード例 #7
0
        private static void AddFontDescriptorObject(PDF pdf, Font font)
        {
            foreach (Font f in pdf.fonts)
            {
                if (f.fontDescriptorObjNumber != 0 && f.name.Equals(font.name))
                {
                    font.fontDescriptorObjNumber = f.fontDescriptorObjNumber;
                    return;
                }
            }

            pdf.Newobj();
            pdf.Append("<<\n");
            pdf.Append("/Type /FontDescriptor\n");
            pdf.Append("/FontName /");
            pdf.Append(font.name);
            pdf.Append('\n');
            if (font.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(font.bBoxLLx);
            pdf.Append(' ');
            pdf.Append(font.bBoxLLy);
            pdf.Append(' ');
            pdf.Append(font.bBoxURx);
            pdf.Append(' ');
            pdf.Append(font.bBoxURy);
            pdf.Append("]\n");
            pdf.Append("/Ascent ");
            pdf.Append(font.ascent);
            pdf.Append('\n');
            pdf.Append("/Descent ");
            pdf.Append(font.descent);
            pdf.Append('\n');
            pdf.Append("/ItalicAngle 0\n");
            pdf.Append("/CapHeight ");
            pdf.Append(font.capHeight);
            pdf.Append('\n');
            pdf.Append("/StemV 79\n");
            pdf.Append(">>\n");
            pdf.Endobj();

            font.fontDescriptorObjNumber = pdf.GetObjNumber();
        }
コード例 #8
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();
        }
コード例 #9
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();
        }
コード例 #10
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);
        }
コード例 #11
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.GetObjNumber();
            }

            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[4096];
            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.GetObjNumber();
        }
コード例 #12
0
        private static void AddToUnicodeCMapObject(PDF pdf, Font font)
        {
            foreach (Font f in pdf.fonts)
            {
                if (f.toUnicodeCMapObjNumber != 0 && f.name.Equals(font.name))
                {
                    font.toUnicodeCMapObjNumber = f.toUnicodeCMapObjNumber;
                    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(sb, list);
                    }
                }
            }
            if (list.Count > 0)
            {
                WriteListToBuffer(sb, list);
            }

            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.toUnicodeCMapObjNumber = pdf.GetObjNumber();
        }