예제 #1
0
        public bool SavePdf(string sPathXml, string sDstFile)
        {
            m_arTmpTexturePrushPaths.Clear();

            CommandType eCommand = CommandType.ctError;

            int len = 0;
            int curindex = 0;

            int nCountPages = 0;
            string sTempLogo = "";
            try
            {
                AVSGraphics.CAVSWinFonts winfonts = new AVSGraphics.CAVSWinFontsClass();
                AVSOfficePDFWriter.CPDFWriterClass oWriter = new AVSOfficePDFWriter.CPDFWriterClass();
                oWriter.CreatePDF();
                oWriter.SetPDFCompressionMode(15);

                bool bIsPathOpened = false;

                StringBuilder sHypers = new StringBuilder();
                sHypers.Append("<linker>");

                unsafe
                {
                    string[] array50 = File.ReadAllLines(sPathXml, Encoding.UTF8);

                    for (int index50 = 0; index50 < array50.Length; index50++)
                    {
                        byte[] dstArray = Convert.FromBase64String(array50[index50]);
                        len = dstArray.Length;
                        curindex = 0;

                        Int32* m = null;
                        UInt16* ms = null;
                        int _sLen = 0;
                        string s = "";

                        double m1 = 0;
                        double m2 = 0;
                        double m3 = 0;
                        double m4 = 0;
                        double m5 = 0;
                        double m6 = 0;

                        string imgPath = "";
                        string base64Temp = "";

                        fixed (byte* p = dstArray)
                        {
                            byte* current = p;
                            while (curindex < len)
                            {
                                eCommand = (CommandType)(*current);
                                current++;
                                curindex++;
                                switch (eCommand)
                                {
                                    case CommandType.ctPageWidth:
                                        m = (Int32*)current;
                                        current += 4;
                                        curindex += 4;
                                        oWriter.Width = ((*m) / 100000.0);
                                        break;
                                    case CommandType.ctPageHeight:
                                        m = (Int32*)current;
                                        current += 4;
                                        curindex += 4;
                                        oWriter.Height = ((*m) / 100000.0);
                                        break;
                                    case CommandType.ctPageStart:
                                        oWriter.NewPage();
                                        oWriter.BeginCommand(1);
                                        ++nCountPages;
                                        break;
                                    case CommandType.ctPageEnd:
                                        if (bIsPathOpened)
                                        {
                                            oWriter.PathCommandEnd();
                                            oWriter.EndCommand(4);
                                        }

                                        bIsPathOpened = false;

                                        if (m_bIsUnregistredVersion)
                                        {
                                            double ww = oWriter.Width;
                                            double wh = oWriter.Height;

                                            double dR = ww - 13;
                                            double dB = wh - 5;
                                            double k = 1.0;

                                            if (ww <= wh)
                                            {

                                                double k1 = ww / 210;
                                                double k2 = wh / 297;
                                                k = Math.Min(k1, k2);
                                            }
                                            else
                                            {
                                                double k1 = ww / 297;
                                                double k2 = wh / 210;
                                                k = Math.Min(k1, k2);
                                            }
                                            double dW = 15 * 5.9 * k;
                                            double dH = 15 * k;

                                            double dKoef = 72 / 25.4;

                                            sHypers.AppendFormat("<link><source x=\"{0}\" y=\"{1}\" width=\"{2}\" height=\"{3}\" page=\"{4}\"/>", (int)((dR - dW) * dKoef), (int)((dB - dH) * dKoef), (int)(dW * dKoef), (int)(dH * dKoef), nCountPages - 1);
                                            sHypers.Append("<target url=\"www.teamlab.com\"/></link>");

                                            oWriter.ResetTransform();

                                            if ("" == sTempLogo)
                                            {
                                                sTempLogo = Path.GetTempFileName();
                                                File.WriteAllBytes(sTempLogo, PdfWriter.Properties.Resources.logo);
                                            }
                                            oWriter.DrawImageFromFile(sTempLogo, dR - dW, dB - dH, dW, dH);
                                        }

                                        oWriter.EndCommand(1);
                                        break;
                                    case CommandType.ctPenColor:
                                        m = (Int32*)current;
                                        oWriter.PenColor = *m;
                                        current += 4;
                                        curindex += 4;
                                        break;
                                    case CommandType.ctPenAlpha:
                                        oWriter.PenAlpha = *current;
                                        current++;
                                        curindex++;
                                        break;
                                    case CommandType.ctPenSize:
                                        m = (Int32*)current;
                                        oWriter.PenSize = *m / 100000.0;
                                        current += 4;
                                        curindex += 4;
                                        break;
                                    case CommandType.ctPenLineJoin:
                                        oWriter.PenLineJoin = *current;
                                        current++;
                                        curindex++;
                                        break;
                                    case CommandType.ctBrushType:
                                        m = (Int32*)current;
                                        oWriter.BrushType = *m;
                                        current += 4;
                                        curindex += 4;
                                        break;
                                    case CommandType.ctBrushColor1:
                                        m = (Int32*)current;
                                        oWriter.BrushColor1 = *m;
                                        current += 4;
                                        curindex += 4;
                                        break;
                                    case CommandType.ctBrushAlpha1:
                                        oWriter.BrushAlpha1 = *current;
                                        current++;
                                        curindex++;
                                        break;
                                    case CommandType.ctBrushColor2:
                                        m = (Int32*)current;
                                        oWriter.BrushColor1 = *m;
                                        current += 4;
                                        curindex += 4;
                                        break;
                                    case CommandType.ctBrushAlpha2:
                                        oWriter.BrushAlpha2 = *current;
                                        current++;
                                        curindex++;
                                        break;
                                    case CommandType.ctBrushRectable:
                                        m = (Int32*)current;
                                        current += 4 * 4;
                                        curindex += 4 * 4;

                                        m1 = (*m++) / 100000.0;
                                        m2 = (*m++) / 100000.0;
                                        m3 = (*m++) / 100000.0;
                                        m4 = (*m++) / 100000.0;

                                        oWriter.BrushRect(0, m1, m2, m3, m4);
                                        break;
                                    case CommandType.ctBrushRectableEnabled:
                                        bool bEn = (1 == *current);
                                        oWriter.SetAdditionalParam("BrushFillBoundsEnable", bEn);

                                        current += 1;
                                        curindex += 1;
                                        break;
                                    case CommandType.ctBrushTexturePath:
                                        ms = (UInt16*)current;
                                        current += 2;
                                        curindex += 2;

                                        _sLen = (int)(*ms);
                                        s = new string((char*)current, 0, _sLen);
                                        imgPath = s;

                                        if (0 != s.IndexOf("http:") &&
                                            0 != s.IndexOf("https:") &&
                                            0 != s.IndexOf("ftp:") &&
                                            0 != s.IndexOf("file:"))
                                        {
                                            if (0 == s.IndexOf("theme"))
                                            {
                                                imgPath = Path.Combine(m_sThemesPlace, s);
                                            }
                                            else
                                            {
                                                imgPath = Path.Combine(m_sHtmlPlace, s);

                                                int _len = imgPath.Length;
                                                int ind = imgPath.LastIndexOf(".svg");
                                                if (ind != -1)
                                                {
                                                    if (ind == (_len - 4))
                                                    {
                                                        string sInterest = imgPath.Substring(0, ind);

                                                        if (File.Exists(sInterest + ".emf"))
                                                            imgPath = sInterest + ".emf";
                                                        else if (File.Exists(sInterest + ".wmf"))
                                                            imgPath = sInterest + ".wmf";
                                                    }
                                                }
                                            }
                                        }

                                        base64Temp = "";
                                        if (0 == s.IndexOf("data:"))
                                        {
                                            try
                                            {
                                                int nFind = s.IndexOf(",");
                                                s = s.Remove(0, nFind + 1);

                                                base64Temp = Path.GetTempFileName();
                                                byte[] byteIm = Convert.FromBase64String(s);
                                                File.WriteAllBytes(base64Temp, byteIm);

                                                imgPath = base64Temp;
                                            }
                                            catch
                                            {
                                            }
                                        }

                                        current += 2 * _sLen;
                                        curindex += 2 * _sLen;

                                        oWriter.BrushTexturePath = imgPath;

                                        if (base64Temp != "")
                                        {
                                            m_arTmpTexturePrushPaths.Add(base64Temp);
                                        }
                                        break;
                                    case CommandType.ctBrushGradient:
                                        current++;
                                        curindex++;

                                        string strAttrMain = "";
                                        string strColors = "";
                                        bool bIsLinear = true;

                                        while (true)
                                        {
                                            byte _command = *current;
                                            current++;
                                            curindex++;

                                            if (251 == _command)
                                                break;

                                            switch (_command)
                                            {
                                                case 0:
                                                    {
                                                        current += 5;
                                                        curindex += 5;

                                                        m = (Int32*)current;
                                                        current += 4 * 4;
                                                        curindex += 4 * 4;

                                                        double d1 = (*m++) / 100000.0;
                                                        double d2 = (*m++) / 100000.0;
                                                        double d3 = (*m++) / 100000.0;
                                                        double d4 = (*m++) / 100000.0;

                                                        strAttrMain = String.Format("x1=\"{0}\" y1=\"{1}\" x2=\"{2}\" y2=\"{3}\" gradientUnits=\"userSpaceOnUse\"", d1, d2, d3, d4);
                                                        strAttrMain = strAttrMain.Replace(',', '.');
                                                        break;
                                                    }
                                                case 1:
                                                    {
                                                        bIsLinear = false;

                                                        current++;
                                                        curindex++;

                                                        m = (Int32*)current;
                                                        current += 6 * 4;
                                                        curindex += 6 * 4;

                                                        double d1 = (*m++) / 100000.0;
                                                        double d2 = (*m++) / 100000.0;
                                                        double d3 = (*m++) / 100000.0;
                                                        double d4 = (*m++) / 100000.0;
                                                        double d5 = (*m++) / 100000.0;
                                                        double d6 = (*m++) / 100000.0;

                                                        strAttrMain = String.Format("cx=\"{0}\" cy=\"{1}\" r0=\"{2}\" r1=\"{3}\" rx=\"{4}\" ry=\"{5}\" gradientUnits=\"userSpaceOnUse\"", d1, d2, d5, d6, d1, d2);
                                                        strAttrMain = strAttrMain.Replace(',', '.');
                                                        break;
                                                    }
                                                case 2:
                                                    {
                                                        int nCountColors = *((Int32*)current);

                                                        current += 4;
                                                        curindex += 4;

                                                        for (int nI = 0; nI < nCountColors; ++nI)
                                                        {
                                                            int pos = *((Int32*)current);
                                                            current += 4;
                                                            curindex += 4;

                                                            double dPos = pos / 100000.0;
                                                            byte _r = *current++;
                                                            byte _g = *current++;
                                                            byte _b = *current++;
                                                            byte _a = *current++;

                                                            curindex += 4;

                                                            int _color = ((_b << 16) & 0xFF0000) | ((_g << 8) & 0xFF00) | _r;
                                                            string sColor = String.Format("<stop stop-color=\"{0}\" stop-opacity=\"{1}\" offset=\"{2}\" />", _color, _a / 255.0, dPos);

                                                            sColor = sColor.Replace(',', '.');
                                                            strColors += sColor;
                                                        }

                                                        break;
                                                    }
                                                default:
                                                    break;
                                            };
                                        }

                                        string strXml = "";

                                        if (bIsLinear)
                                        {
                                            strXml = "<linearGradient " + strAttrMain + ">" + strColors + "</linearGradient>";
                                            oWriter.SetAdditionalParam("Fill-LinearGradient", strXml);
                                        }
                                        else
                                        {
                                            strXml = "<radialGradient " + strAttrMain + ">" + strColors + "</radialGradient>";
                                            oWriter.SetAdditionalParam("Fill-RadialGradient", strXml);
                                        }

                                        break;
                                    case CommandType.ctBrushTextureMode:
                                        int mode = (int)(*current);
                                        oWriter.BrushTextureMode = mode;

                                        current += 1;
                                        curindex += 1;
                                        break;
                                    case CommandType.ctBrushTextureAlpha:
                                        int txalpha = (int)(*current);
                                        oWriter.BrushTextureAlpha = txalpha;

                                        current += 1;
                                        curindex += 1;
                                        break;
                                    case CommandType.ctSetTransform:
                                        m = (Int32*)current;
                                        current += 6 * 4;
                                        curindex += 6 * 4;

                                        m1 = (*m++) / 100000.0;
                                        m2 = (*m++) / 100000.0;
                                        m3 = (*m++) / 100000.0;
                                        m4 = (*m++) / 100000.0;
                                        m5 = (*m++) / 100000.0;
                                        m6 = (*m++) / 100000.0;

                                        oWriter.SetTransform(m1, m2, m3, m4, m5, m6);
                                        break;
                                    case CommandType.ctPathCommandStart:
                                        if (bIsPathOpened)
                                        {
                                            oWriter.PathCommandEnd();
                                            oWriter.EndCommand(4);
                                            oWriter.BeginCommand(4);
                                            oWriter.PathCommandStart();
                                        }
                                        else
                                        {
                                            oWriter.BeginCommand(4);
                                            oWriter.PathCommandStart();
                                        }
                                        bIsPathOpened = true;
                                        break;
                                    case CommandType.ctPathCommandEnd:
                                        if (bIsPathOpened)
                                        {
                                            oWriter.PathCommandEnd();
                                            oWriter.EndCommand(4);
                                            bIsPathOpened = false;
                                        }
                                        break;
                                    case CommandType.ctPathCommandMoveTo:
                                        m = (Int32*)current;
                                        current += 2 * 4;
                                        curindex += 2 * 4;

                                        m1 = (*m++) / 100000.0;
                                        m2 = (*m++) / 100000.0;
                                        oWriter.PathCommandMoveTo(m1, m2);
                                        break;
                                    case CommandType.ctPathCommandLineTo:
                                        m = (Int32*)current;
                                        current += 2 * 4;
                                        curindex += 2 * 4;

                                        m1 = (*m++) / 100000.0;
                                        m2 = (*m++) / 100000.0;
                                        oWriter.PathCommandLineTo(m1, m2);
                                        break;
                                    case CommandType.ctPathCommandCurveTo:
                                        m = (Int32*)current;
                                        current += 6 * 4;
                                        curindex += 6 * 4;

                                        m1 = (*m++) / 100000.0;
                                        m2 = (*m++) / 100000.0;
                                        m3 = (*m++) / 100000.0;
                                        m4 = (*m++) / 100000.0;
                                        m5 = (*m++) / 100000.0;
                                        m6 = (*m++) / 100000.0;

                                        oWriter.PathCommandCurveTo(m1, m2, m3, m4, m5, m6);
                                        break;
                                    case CommandType.ctPathCommandClose:
                                        oWriter.PathCommandClose();
                                        break;
                                    case CommandType.ctDrawPath:
                                        m = (Int32*)current;
                                        current += 4;
                                        curindex += 4;

                                        oWriter.DrawPath(*m);
                                        break;
                                    case CommandType.ctDrawImageFromFile:
                                        m = (Int32*)current;
                                        current += 4;
                                        curindex += 4;

                                        _sLen = (int)(*m);
                                        _sLen /= 2;
                                        s = new string((char*)current, 0, _sLen);

                                        imgPath = s;

                                        if (0 != s.IndexOf("http:") &&
                                            0 != s.IndexOf("https:") &&
                                            0 != s.IndexOf("ftp:") &&
                                            0 != s.IndexOf("file:"))
                                        {
                                            if (0 == s.IndexOf("theme"))
                                            {
                                                imgPath = Path.Combine(m_sThemesPlace, s);
                                            }
                                            else
                                            {
                                                imgPath = Path.Combine(m_sHtmlPlace, s);

                                                int _len = imgPath.Length;
                                                int ind = imgPath.LastIndexOf(".svg");
                                                if (ind != -1)
                                                {
                                                    if (ind == (_len - 4))
                                                    {
                                                        string sInterest = imgPath.Substring(0, ind);

                                                        if (File.Exists(sInterest + ".emf"))
                                                            imgPath = sInterest + ".emf";
                                                        else if (File.Exists(sInterest + ".wmf"))
                                                            imgPath = sInterest + ".wmf";
                                                    }
                                                }
                                            }
                                        }

                                        base64Temp = "";
                                        if (0 == s.IndexOf("data:"))
                                        {
                                            try
                                            {
                                                int nFind = s.IndexOf(",");
                                                s = s.Remove(0, nFind + 1);

                                                base64Temp = Path.GetTempFileName();
                                                byte[] byteIm = Convert.FromBase64String(s);
                                                File.WriteAllBytes(base64Temp, byteIm);

                                                imgPath = base64Temp;
                                            }
                                            catch
                                            {
                                            }
                                        }

                                        current += 2 * _sLen;
                                        curindex += 2 * _sLen;

                                        m = (Int32*)current;
                                        current += 4 * 4;
                                        curindex += 4 * 4;

                                        m1 = (*m++) / 100000.0;
                                        m2 = (*m++) / 100000.0;
                                        m3 = (*m++) / 100000.0;
                                        m4 = (*m++) / 100000.0;

                                        try
                                        {
                                            oWriter.DrawImageFromFile(imgPath, m1, m2, m3, m4);
                                        }
                                        catch { }

                                        if (base64Temp != "")
                                        {
                                            File.Delete(base64Temp);
                                        }
                                        break;
                                    case CommandType.ctFontName:
                                        ms = (UInt16*)current;
                                        current += 2;
                                        curindex += 2;

                                        _sLen = (int)(*ms);
                                        s = new string((char*)current, 0, _sLen);

                                        current += 2 * _sLen;
                                        curindex += 2 * _sLen;
                                        oWriter.FontName = s;
                                        break;
                                    case CommandType.ctFontSize:
                                        m = (Int32*)current;
                                        current += 4;
                                        curindex += 4;

                                        m1 = (*m++) / 100000.0;

                                        oWriter.FontSize = Math.Min(m1, 1000.0);
                                        break;
                                    case CommandType.ctFontStyle:
                                        m = (Int32*)current;
                                        current += 4;
                                        curindex += 4;

                                        oWriter.FontStyle = *m;
                                        break;
                                    case CommandType.ctDrawText:
                                        ms = (UInt16*)current;
                                        current += 2;
                                        curindex += 2;

                                        _sLen = (int)(*ms);
                                        s = new string((char*)current, 0, _sLen);

                                        current += 2 * _sLen;
                                        curindex += 2 * _sLen;

                                        m = (Int32*)current;
                                        current += 2 * 4;
                                        curindex += 2 * 4;

                                        m1 = (*m++) / 100000.0;
                                        m2 = (*m++) / 100000.0;
                                        oWriter.CommandDrawText(s, m1, m2, 0, 0, 0);
                                        break;
                                    case CommandType.ctBeginCommand:
                                        m = (Int32*)current;
                                        current += 4;
                                        curindex += 4;
                                        if (bIsPathOpened)
                                        {
                                            oWriter.PathCommandEnd();
                                            oWriter.EndCommand(4);
                                            bIsPathOpened = false;
                                        }
                                        oWriter.BeginCommand((uint)(*m));
                                        break;
                                    case CommandType.ctEndCommand:
                                        m = (Int32*)current;
                                        current += 4;
                                        curindex += 4;
                                        if (bIsPathOpened)
                                        {
                                            oWriter.PathCommandEnd();
                                            oWriter.EndCommand(4);
                                            bIsPathOpened = false;
                                        }
                                        oWriter.EndCommand((uint)(*m));
                                        oWriter.PathCommandEnd();
                                        break;
                                    default:
                                        break;
                                };

                            }
                        }
                    }
                }

                sHypers.Append("</linker>");

                if (m_bIsUnregistredVersion)
                {
                    oWriter.BeginCommand(8);
                    string strHypers = sHypers.ToString();
                    oWriter.CommandDrawText(strHypers, 0, 0, 0, 0, 0);
                    oWriter.EndCommand(8);
                }

                if (sTempLogo != "")
                    File.Delete(sTempLogo);

                DeleteTmpFiles();

                oWriter.SaveToFile(sDstFile);
                return true;
            }
            catch
            {
                if (sTempLogo != "")
                    File.Delete(sTempLogo);

                DeleteTmpFiles();
                return false;
            }
        }
예제 #2
0
        public bool SavePdf(string sPathXml, string sDstFile)
        {
            m_arTmpTexturePrushPaths.Clear();

            CommandType eCommand = CommandType.ctError;

            int len      = 0;
            int curindex = 0;

            int    nCountPages = 0;
            string sTempLogo   = "";

            try
            {
                AVSGraphics.CAVSWinFonts           winfonts = new AVSGraphics.CAVSWinFontsClass();
                AVSOfficePDFWriter.CPDFWriterClass oWriter  = new AVSOfficePDFWriter.CPDFWriterClass();
                oWriter.CreatePDF();
                oWriter.SetPDFCompressionMode(15);

                bool bIsPathOpened = false;

                StringBuilder sHypers = new StringBuilder();
                sHypers.Append("<linker>");

                unsafe
                {
                    string[] array50 = File.ReadAllLines(sPathXml, Encoding.UTF8);

                    for (int index50 = 0; index50 < array50.Length; index50++)
                    {
                        byte[] dstArray = Convert.FromBase64String(array50[index50]);
                        len      = dstArray.Length;
                        curindex = 0;

                        Int32 * m     = null;
                        UInt16 *ms    = null;
                        int     _sLen = 0;
                        string  s     = "";

                        double m1 = 0;
                        double m2 = 0;
                        double m3 = 0;
                        double m4 = 0;
                        double m5 = 0;
                        double m6 = 0;

                        string imgPath    = "";
                        string base64Temp = "";

                        fixed(byte *p = dstArray)
                        {
                            byte *current = p;

                            while (curindex < len)
                            {
                                eCommand = (CommandType)(*current);
                                current++;
                                curindex++;
                                switch (eCommand)
                                {
                                case CommandType.ctPageWidth:
                                    m             = (Int32 *)current;
                                    current      += 4;
                                    curindex     += 4;
                                    oWriter.Width = ((*m) / 100000.0);
                                    break;

                                case CommandType.ctPageHeight:
                                    m              = (Int32 *)current;
                                    current       += 4;
                                    curindex      += 4;
                                    oWriter.Height = ((*m) / 100000.0);
                                    break;

                                case CommandType.ctPageStart:
                                    oWriter.NewPage();
                                    oWriter.BeginCommand(1);
                                    ++nCountPages;
                                    break;

                                case CommandType.ctPageEnd:
                                    if (bIsPathOpened)
                                    {
                                        oWriter.PathCommandEnd();
                                        oWriter.EndCommand(4);
                                    }

                                    bIsPathOpened = false;

                                    if (m_bIsUnregistredVersion)
                                    {
                                        double ww = oWriter.Width;
                                        double wh = oWriter.Height;

                                        double dR = ww - 13;
                                        double dB = wh - 5;
                                        double k  = 1.0;

                                        if (ww <= wh)
                                        {
                                            double k1 = ww / 210;
                                            double k2 = wh / 297;
                                            k = Math.Min(k1, k2);
                                        }
                                        else
                                        {
                                            double k1 = ww / 297;
                                            double k2 = wh / 210;
                                            k = Math.Min(k1, k2);
                                        }
                                        double dW = 15 * 5.9 * k;
                                        double dH = 15 * k;

                                        double dKoef = 72 / 25.4;

                                        sHypers.AppendFormat("<link><source x=\"{0}\" y=\"{1}\" width=\"{2}\" height=\"{3}\" page=\"{4}\"/>", (int)((dR - dW) * dKoef), (int)((dB - dH) * dKoef), (int)(dW * dKoef), (int)(dH * dKoef), nCountPages - 1);
                                        sHypers.Append("<target url=\"www.teamlab.com\"/></link>");

                                        oWriter.ResetTransform();

                                        if ("" == sTempLogo)
                                        {
                                            sTempLogo = Path.GetTempFileName();
                                            File.WriteAllBytes(sTempLogo, PdfWriter.Properties.Resources.logo);
                                        }
                                        oWriter.DrawImageFromFile(sTempLogo, dR - dW, dB - dH, dW, dH);
                                    }

                                    oWriter.EndCommand(1);
                                    break;

                                case CommandType.ctPenColor:
                                    m = (Int32 *)current;
                                    oWriter.PenColor = *m;
                                    current         += 4;
                                    curindex        += 4;
                                    break;

                                case CommandType.ctPenAlpha:
                                    oWriter.PenAlpha = *current;
                                    current++;
                                    curindex++;
                                    break;

                                case CommandType.ctPenSize:
                                    m = (Int32 *)current;
                                    oWriter.PenSize = *m / 100000.0;
                                    current        += 4;
                                    curindex       += 4;
                                    break;

                                case CommandType.ctPenLineJoin:
                                    oWriter.PenLineJoin = *current;
                                    current++;
                                    curindex++;
                                    break;

                                case CommandType.ctBrushType:
                                    m = (Int32 *)current;
                                    oWriter.BrushType = *m;
                                    current          += 4;
                                    curindex         += 4;
                                    break;

                                case CommandType.ctBrushColor1:
                                    m = (Int32 *)current;
                                    oWriter.BrushColor1 = *m;
                                    current            += 4;
                                    curindex           += 4;
                                    break;

                                case CommandType.ctBrushAlpha1:
                                    oWriter.BrushAlpha1 = *current;
                                    current++;
                                    curindex++;
                                    break;

                                case CommandType.ctBrushColor2:
                                    m = (Int32 *)current;
                                    oWriter.BrushColor1 = *m;
                                    current            += 4;
                                    curindex           += 4;
                                    break;

                                case CommandType.ctBrushAlpha2:
                                    oWriter.BrushAlpha2 = *current;
                                    current++;
                                    curindex++;
                                    break;

                                case CommandType.ctBrushRectable:
                                    m         = (Int32 *)current;
                                    current  += 4 * 4;
                                    curindex += 4 * 4;

                                    m1 = (*m++) / 100000.0;
                                    m2 = (*m++) / 100000.0;
                                    m3 = (*m++) / 100000.0;
                                    m4 = (*m++) / 100000.0;

                                    oWriter.BrushRect(0, m1, m2, m3, m4);
                                    break;

                                case CommandType.ctBrushRectableEnabled:
                                    bool bEn = (1 == *current);
                                    oWriter.SetAdditionalParam("BrushFillBoundsEnable", bEn);

                                    current  += 1;
                                    curindex += 1;
                                    break;

                                case CommandType.ctBrushTexturePath:
                                    ms        = (UInt16 *)current;
                                    current  += 2;
                                    curindex += 2;

                                    _sLen   = (int)(*ms);
                                    s       = new string((char *)current, 0, _sLen);
                                    imgPath = s;

                                    if (0 != s.IndexOf("http:") &&
                                        0 != s.IndexOf("https:") &&
                                        0 != s.IndexOf("ftp:") &&
                                        0 != s.IndexOf("file:"))
                                    {
                                        if (0 == s.IndexOf("theme"))
                                        {
                                            imgPath = Path.Combine(m_sThemesPlace, s);
                                        }
                                        else
                                        {
                                            imgPath = Path.Combine(m_sHtmlPlace, s);

                                            int _len = imgPath.Length;
                                            int ind  = imgPath.LastIndexOf(".svg");
                                            if (ind != -1)
                                            {
                                                if (ind == (_len - 4))
                                                {
                                                    string sInterest = imgPath.Substring(0, ind);

                                                    if (File.Exists(sInterest + ".emf"))
                                                    {
                                                        imgPath = sInterest + ".emf";
                                                    }
                                                    else if (File.Exists(sInterest + ".wmf"))
                                                    {
                                                        imgPath = sInterest + ".wmf";
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    base64Temp = "";
                                    if (0 == s.IndexOf("data:"))
                                    {
                                        try
                                        {
                                            int nFind = s.IndexOf(",");
                                            s = s.Remove(0, nFind + 1);

                                            base64Temp = Path.GetTempFileName();
                                            byte[] byteIm = Convert.FromBase64String(s);
                                            File.WriteAllBytes(base64Temp, byteIm);

                                            imgPath = base64Temp;
                                        }
                                        catch
                                        {
                                        }
                                    }

                                    current  += 2 * _sLen;
                                    curindex += 2 * _sLen;

                                    oWriter.BrushTexturePath = imgPath;

                                    if (base64Temp != "")
                                    {
                                        m_arTmpTexturePrushPaths.Add(base64Temp);
                                    }
                                    break;

                                case CommandType.ctBrushGradient:
                                    current++;
                                    curindex++;

                                    string strAttrMain = "";
                                    string strColors   = "";
                                    bool   bIsLinear   = true;

                                    while (true)
                                    {
                                        byte _command = *current;
                                        current++;
                                        curindex++;

                                        if (251 == _command)
                                        {
                                            break;
                                        }

                                        switch (_command)
                                        {
                                        case 0:
                                        {
                                            current  += 5;
                                            curindex += 5;

                                            m         = (Int32 *)current;
                                            current  += 4 * 4;
                                            curindex += 4 * 4;

                                            double d1 = (*m++) / 100000.0;
                                            double d2 = (*m++) / 100000.0;
                                            double d3 = (*m++) / 100000.0;
                                            double d4 = (*m++) / 100000.0;

                                            strAttrMain = String.Format("x1=\"{0}\" y1=\"{1}\" x2=\"{2}\" y2=\"{3}\" gradientUnits=\"userSpaceOnUse\"", d1, d2, d3, d4);
                                            strAttrMain = strAttrMain.Replace(',', '.');
                                            break;
                                        }

                                        case 1:
                                        {
                                            bIsLinear = false;

                                            current++;
                                            curindex++;

                                            m         = (Int32 *)current;
                                            current  += 6 * 4;
                                            curindex += 6 * 4;

                                            double d1 = (*m++) / 100000.0;
                                            double d2 = (*m++) / 100000.0;
                                            double d3 = (*m++) / 100000.0;
                                            double d4 = (*m++) / 100000.0;
                                            double d5 = (*m++) / 100000.0;
                                            double d6 = (*m++) / 100000.0;

                                            strAttrMain = String.Format("cx=\"{0}\" cy=\"{1}\" r0=\"{2}\" r1=\"{3}\" rx=\"{4}\" ry=\"{5}\" gradientUnits=\"userSpaceOnUse\"", d1, d2, d5, d6, d1, d2);
                                            strAttrMain = strAttrMain.Replace(',', '.');
                                            break;
                                        }

                                        case 2:
                                        {
                                            int nCountColors = *((Int32 *)current);

                                            current  += 4;
                                            curindex += 4;

                                            for (int nI = 0; nI < nCountColors; ++nI)
                                            {
                                                int pos = *((Int32 *)current);
                                                current  += 4;
                                                curindex += 4;

                                                double dPos = pos / 100000.0;
                                                byte   _r   = *current++;
                                                byte   _g   = *current++;
                                                byte   _b   = *current++;
                                                byte   _a   = *current++;

                                                curindex += 4;

                                                int    _color = ((_b << 16) & 0xFF0000) | ((_g << 8) & 0xFF00) | _r;
                                                string sColor = String.Format("<stop stop-color=\"{0}\" stop-opacity=\"{1}\" offset=\"{2}\" />", _color, _a / 255.0, dPos);

                                                sColor     = sColor.Replace(',', '.');
                                                strColors += sColor;
                                            }

                                            break;
                                        }

                                        default:
                                            break;
                                        }
                                        ;
                                    }

                                    string strXml = "";

                                    if (bIsLinear)
                                    {
                                        strXml = "<linearGradient " + strAttrMain + ">" + strColors + "</linearGradient>";
                                        oWriter.SetAdditionalParam("Fill-LinearGradient", strXml);
                                    }
                                    else
                                    {
                                        strXml = "<radialGradient " + strAttrMain + ">" + strColors + "</radialGradient>";
                                        oWriter.SetAdditionalParam("Fill-RadialGradient", strXml);
                                    }

                                    break;

                                case CommandType.ctBrushTextureMode:
                                    int mode = (int)(*current);
                                    oWriter.BrushTextureMode = mode;

                                    current  += 1;
                                    curindex += 1;
                                    break;

                                case CommandType.ctBrushTextureAlpha:
                                    int txalpha = (int)(*current);
                                    oWriter.BrushTextureAlpha = txalpha;

                                    current  += 1;
                                    curindex += 1;
                                    break;

                                case CommandType.ctSetTransform:
                                    m         = (Int32 *)current;
                                    current  += 6 * 4;
                                    curindex += 6 * 4;

                                    m1 = (*m++) / 100000.0;
                                    m2 = (*m++) / 100000.0;
                                    m3 = (*m++) / 100000.0;
                                    m4 = (*m++) / 100000.0;
                                    m5 = (*m++) / 100000.0;
                                    m6 = (*m++) / 100000.0;

                                    oWriter.SetTransform(m1, m2, m3, m4, m5, m6);
                                    break;

                                case CommandType.ctPathCommandStart:
                                    if (bIsPathOpened)
                                    {
                                        oWriter.PathCommandEnd();
                                        oWriter.EndCommand(4);
                                        oWriter.BeginCommand(4);
                                        oWriter.PathCommandStart();
                                    }
                                    else
                                    {
                                        oWriter.BeginCommand(4);
                                        oWriter.PathCommandStart();
                                    }
                                    bIsPathOpened = true;
                                    break;

                                case CommandType.ctPathCommandEnd:
                                    if (bIsPathOpened)
                                    {
                                        oWriter.PathCommandEnd();
                                        oWriter.EndCommand(4);
                                        bIsPathOpened = false;
                                    }
                                    break;

                                case CommandType.ctPathCommandMoveTo:
                                    m         = (Int32 *)current;
                                    current  += 2 * 4;
                                    curindex += 2 * 4;

                                    m1 = (*m++) / 100000.0;
                                    m2 = (*m++) / 100000.0;
                                    oWriter.PathCommandMoveTo(m1, m2);
                                    break;

                                case CommandType.ctPathCommandLineTo:
                                    m         = (Int32 *)current;
                                    current  += 2 * 4;
                                    curindex += 2 * 4;

                                    m1 = (*m++) / 100000.0;
                                    m2 = (*m++) / 100000.0;
                                    oWriter.PathCommandLineTo(m1, m2);
                                    break;

                                case CommandType.ctPathCommandCurveTo:
                                    m         = (Int32 *)current;
                                    current  += 6 * 4;
                                    curindex += 6 * 4;

                                    m1 = (*m++) / 100000.0;
                                    m2 = (*m++) / 100000.0;
                                    m3 = (*m++) / 100000.0;
                                    m4 = (*m++) / 100000.0;
                                    m5 = (*m++) / 100000.0;
                                    m6 = (*m++) / 100000.0;

                                    oWriter.PathCommandCurveTo(m1, m2, m3, m4, m5, m6);
                                    break;

                                case CommandType.ctPathCommandClose:
                                    oWriter.PathCommandClose();
                                    break;

                                case CommandType.ctDrawPath:
                                    m         = (Int32 *)current;
                                    current  += 4;
                                    curindex += 4;

                                    oWriter.DrawPath(*m);
                                    break;

                                case CommandType.ctDrawImageFromFile:
                                    m         = (Int32 *)current;
                                    current  += 4;
                                    curindex += 4;

                                    _sLen  = (int)(*m);
                                    _sLen /= 2;
                                    s      = new string((char *)current, 0, _sLen);

                                    imgPath = s;

                                    if (0 != s.IndexOf("http:") &&
                                        0 != s.IndexOf("https:") &&
                                        0 != s.IndexOf("ftp:") &&
                                        0 != s.IndexOf("file:"))
                                    {
                                        if (0 == s.IndexOf("theme"))
                                        {
                                            imgPath = Path.Combine(m_sThemesPlace, s);
                                        }
                                        else
                                        {
                                            imgPath = Path.Combine(m_sHtmlPlace, s);

                                            int _len = imgPath.Length;
                                            int ind  = imgPath.LastIndexOf(".svg");
                                            if (ind != -1)
                                            {
                                                if (ind == (_len - 4))
                                                {
                                                    string sInterest = imgPath.Substring(0, ind);

                                                    if (File.Exists(sInterest + ".emf"))
                                                    {
                                                        imgPath = sInterest + ".emf";
                                                    }
                                                    else if (File.Exists(sInterest + ".wmf"))
                                                    {
                                                        imgPath = sInterest + ".wmf";
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    base64Temp = "";
                                    if (0 == s.IndexOf("data:"))
                                    {
                                        try
                                        {
                                            int nFind = s.IndexOf(",");
                                            s = s.Remove(0, nFind + 1);

                                            base64Temp = Path.GetTempFileName();
                                            byte[] byteIm = Convert.FromBase64String(s);
                                            File.WriteAllBytes(base64Temp, byteIm);

                                            imgPath = base64Temp;
                                        }
                                        catch
                                        {
                                        }
                                    }

                                    current  += 2 * _sLen;
                                    curindex += 2 * _sLen;

                                    m         = (Int32 *)current;
                                    current  += 4 * 4;
                                    curindex += 4 * 4;

                                    m1 = (*m++) / 100000.0;
                                    m2 = (*m++) / 100000.0;
                                    m3 = (*m++) / 100000.0;
                                    m4 = (*m++) / 100000.0;

                                    try
                                    {
                                        oWriter.DrawImageFromFile(imgPath, m1, m2, m3, m4);
                                    }
                                    catch { }

                                    if (base64Temp != "")
                                    {
                                        File.Delete(base64Temp);
                                    }
                                    break;

                                case CommandType.ctFontName:
                                    ms        = (UInt16 *)current;
                                    current  += 2;
                                    curindex += 2;

                                    _sLen = (int)(*ms);
                                    s     = new string((char *)current, 0, _sLen);

                                    current         += 2 * _sLen;
                                    curindex        += 2 * _sLen;
                                    oWriter.FontName = s;
                                    break;

                                case CommandType.ctFontSize:
                                    m         = (Int32 *)current;
                                    current  += 4;
                                    curindex += 4;

                                    m1 = (*m++) / 100000.0;

                                    oWriter.FontSize = Math.Min(m1, 1000.0);
                                    break;

                                case CommandType.ctFontStyle:
                                    m         = (Int32 *)current;
                                    current  += 4;
                                    curindex += 4;

                                    oWriter.FontStyle = *m;
                                    break;

                                case CommandType.ctDrawText:
                                    ms        = (UInt16 *)current;
                                    current  += 2;
                                    curindex += 2;

                                    _sLen = (int)(*ms);
                                    s     = new string((char *)current, 0, _sLen);

                                    current  += 2 * _sLen;
                                    curindex += 2 * _sLen;

                                    m         = (Int32 *)current;
                                    current  += 2 * 4;
                                    curindex += 2 * 4;

                                    m1 = (*m++) / 100000.0;
                                    m2 = (*m++) / 100000.0;
                                    oWriter.CommandDrawText(s, m1, m2, 0, 0, 0);
                                    break;

                                case CommandType.ctBeginCommand:
                                    m         = (Int32 *)current;
                                    current  += 4;
                                    curindex += 4;
                                    if (bIsPathOpened)
                                    {
                                        oWriter.PathCommandEnd();
                                        oWriter.EndCommand(4);
                                        bIsPathOpened = false;
                                    }
                                    oWriter.BeginCommand((uint)(*m));
                                    break;

                                case CommandType.ctEndCommand:
                                    m         = (Int32 *)current;
                                    current  += 4;
                                    curindex += 4;
                                    if (bIsPathOpened)
                                    {
                                        oWriter.PathCommandEnd();
                                        oWriter.EndCommand(4);
                                        bIsPathOpened = false;
                                    }
                                    oWriter.EndCommand((uint)(*m));
                                    oWriter.PathCommandEnd();
                                    break;

                                default:
                                    break;
                                }
                                ;
                            }
                        }
                    }
                }

                sHypers.Append("</linker>");

                if (m_bIsUnregistredVersion)
                {
                    oWriter.BeginCommand(8);
                    string strHypers = sHypers.ToString();
                    oWriter.CommandDrawText(strHypers, 0, 0, 0, 0, 0);
                    oWriter.EndCommand(8);
                }

                if (sTempLogo != "")
                {
                    File.Delete(sTempLogo);
                }

                DeleteTmpFiles();

                oWriter.SaveToFile(sDstFile);
                return(true);
            }
            catch
            {
                if (sTempLogo != "")
                {
                    File.Delete(sTempLogo);
                }

                DeleteTmpFiles();
                return(false);
            }
        }