2025년 2월 5일 수요일

변환

// 비주얼스튜디오 > 도구 > NuGet패키지관리자 > 솔류션용 NuGet패키지관리 > HtmlAgilityPack 검색해서 설치

using HtmlAgilityPack;
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            imgBas64Test001();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            imgBas64Test002();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            string strUrl = "http://kiken.kolon.com/Upload_Approval10/LS/Doc/2025/323/00000000000031540323.mht";
            Uri url = new Uri(strUrl);
            System.Net.WebClient wClient = new System.Net.WebClient();
            string strMhtData = wClient.DownloadString(url);

            ClsResult cRslt = getBoundaryText(ref strMhtData);
            if (cRslt.bSucc)
            {
                ClsHtmlDoc htmlRslt = mhtToHtml(ref strMhtData, cRslt.sResult,true); // htmlDocument정보와 결과 정보를 가지고 있음
                if (htmlRslt.cRslt.bSucc)
                {
                    htmlRslt.htmlDoc.Save(@"C:\Users\saengyeol_chun2\Desktop\111.html");
                }
            }
            else
            {
                MessageBox.Show(cRslt.sResult);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            string strFlNm = @"C:\Users\saengyeol_chun2\Desktop\새 폴더\00000000000021838552.mht";
            StreamReader RS = new StreamReader(strFlNm);
            string strMhtData = RS.ReadToEnd();
            RS.Close();

            ClsResult cRslt = getBoundaryText(ref strMhtData);
            if (cRslt.bSucc)
            {
                ClsHtmlDoc htmlRslt = mhtToHtml(ref strMhtData, cRslt.sResult, true);    // htmlDocument정보와 결과 정보를 가지고 있음
                if (htmlRslt.cRslt.bSucc)
                {
                    htmlRslt.htmlDoc.Save(@"C:\Users\saengyeol_chun2\Desktop\222.html");
                }
            }
            else
            {
                MessageBox.Show(cRslt.sResult);
            }
        }


        private ClsResult getBoundaryText(ref string strMht)
        {
            ClsResult cRslt = new ClsResult();

            int nStarPos = strMht.IndexOf("boundary=");
            if (nStarPos > 0)
            {
                int nEndPos = strMht.IndexOf("\"", nStarPos + 10);
                string strMsg = "--" + strMht.Substring(nStarPos + 10, nEndPos - nStarPos - 10);
                cRslt.setResult(true, strMsg, "");
            }
            else
            {
                cRslt.setResult(false, "기준점 boundary를 찾을수 없습니다.", "");
            }
            return cRslt;
        }

        private ClsHtmlDoc mhtToHtml(ref string strMht, string strBoundary, bool isUtf8)
        {
            string [] arrMht = strMht.Split(new string[] { strBoundary }, StringSplitOptions.None);
            string strErr = string.Empty;
            ClsHtmlDoc cHtmlRslt = new ClsHtmlDoc();

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
            if (arrMht.Length < 2)
            {
                
                cHtmlRslt.setHtmlDoc("본문의 boundary를 찾을수 없습니다.", "");
                return cHtmlRslt;
            }
            else
            {
                try
                {
                    //arrMht[1].Split(new string[] { Environment.NewLine + Environment.NewLine }, StringSplitOptions.None)[1].Trim();
                    string tmpItm = arrMht[1].Split(new string[] { "\n\n" }, StringSplitOptions.None)[1].Trim();
                    int nCnt = tmpItm.IndexOf("\n") + 1;
                    string strItm = tmpItm.Substring(nCnt).Trim();
                    byte[] arrHtml = Convert.FromBase64String(strItm);
                    string strHtml = string.Empty;
                    if (isUtf8)
                    {
                        strHtml = System.Text.Encoding.UTF8.GetString(arrHtml);
                    }
                    else
                    {
                        strHtml = System.Text.Encoding.GetEncoding("ks_c_5601-1987").GetString(arrHtml);
                    }
                    htmlDoc.LoadHtml(strHtml);
                }
                catch (Exception)
                {
                    cHtmlRslt.setHtmlDoc("본문 변환에 실패하였습니다.", "");
                    return cHtmlRslt;
                }
            }

            int nIdx = 1;
            HtmlNodeCollection hnc = htmlDoc.DocumentNode.SelectNodes("//img");
            ClsResult cRslt = new ClsResult(true);  // 이미지가 하나도 없는 경우가 있어 성공에서 시작
            foreach (HtmlNode hNode in hnc)
            {
                cRslt = GetImage(hNode, ref arrMht, nIdx);
                
                if (cRslt.bSucc)
                {
                    hNode.SetAttributeValue("src", cRslt.sResult);
                }
                else
                {
                    break;
                }
                nIdx++;
            }

            cHtmlRslt.setHtmlDoc(htmlDoc, cRslt);

            return cHtmlRslt;
        }


        private ClsResult GetHtml(string strMht, string strBoundary, bool isUtf8)
        {
            ClsResult cRslt = new ClsResult();
            try
            {
                string strItm = strMht.Split(new string[] { "\n\n" }, StringSplitOptions.None)[1].Trim();
                byte[] arrHtml = Convert.FromBase64String(strItm);
                string strHtml = string.Empty;
                if (isUtf8)
                {
                    strHtml = System.Text.Encoding.UTF8.GetString(arrHtml);
                }
                else
                {
                    strHtml = System.Text.Encoding.GetEncoding("ks_c_5601-1987").GetString(arrHtml);
                }
                cRslt.setResult(true, strHtml, "");
            }
            catch (Exception ex)
            {
                cRslt.setResult(false, ex.Message, "");
            }
            return cRslt;
        }


        private ClsResult GetImage(HtmlNode hNode, ref string[] arrMht, int nCnt)
        {
            ClsResult cRslt = new ClsResult();
            string strAttr = hNode.GetAttributeValue("src", "");
            if (string.IsNullOrWhiteSpace(strAttr))
            {
                cRslt.setResult(false, string.Format("{0}번째 src 속성 값이 없습니다.", nCnt), "");
            }
            else
            {
                try
                {
                    for (int idx = 2; idx < arrMht.Length; idx++)
                    {
                        if (arrMht[idx].IndexOf(strAttr) > -1)
                        {
                            string strItm = "data:image/png;charset=utf-8;base64," + arrMht[idx].Trim().Split(new string[] { "\n\n" }, StringSplitOptions.None)[1].Trim();
                            cRslt.setResult(true, strItm, "");
                        }
                    }
                }
                catch (Exception ex)
                {
                    cRslt.setResult(false, string.Format("{0}번째 이미지 찾는중 오류 발생 : {1}", nCnt, ex.Message), "");
                }
            }

            if (cRslt.sResult == string.Empty)
            {
                cRslt.setResult(false, string.Format("{0}번째 src 속성[{1}] 동일한 이미지 찾기에 실패하였습니다.", nCnt, strAttr), "");
            }

            return cRslt;
        }


        
        private void imgBas64Test001()
        {
            string flNm = @"C:\Users\saengyeol_chun2\Desktop\처리모음\캡처.PNG";
            string strHtml = @"
"; WebBrowser browser = new WebBrowser(); browser.ScriptErrorsSuppressed = true; browser.DocumentText = strHtml; browser.Document.Write(strHtml); System.Windows.Forms.HtmlDocument htmlDoc = browser.Document; HtmlElementCollection imgRows = htmlDoc.GetElementsByTagName("img"); foreach (HtmlElement imgElement in imgRows) { string tmpSrc = imgElement.GetAttribute("src"); if (string.IsNullOrWhiteSpace(tmpSrc) == false) { string strSrc = "data:image/png;charset=utf-8;base64," + GetStringFromImageFile(flNm); // 이미지를 Base64로 변환 imgElement.SetAttribute("src", strSrc); } } string outHtml = htmlDoc.Body.InnerHtml; } private void imgBas64Test002() { string flNm = @"C:\Users\saengyeol_chun2\Desktop\처리모음\캡처.PNG"; string strHtml = @"
"; HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(strHtml); HtmlNodeCollection imgRows = htmlDoc.DocumentNode.SelectNodes("//img"); foreach (HtmlNode imgElement in imgRows) { string tmpSrc = imgElement.GetAttributeValue("src", ""); if (string.IsNullOrWhiteSpace(tmpSrc) == false) { string strSrc = "data:image/png;charset=utf-8;base64," + GetStringFromImageFile(flNm); // 이미지를 Base64로 변환 imgElement.SetAttributeValue("src", strSrc); } } string outHtml = htmlDoc.DocumentNode.InnerHtml; } private string GetStringFromImageFile(string filename) { string base64Image = ""; Image img = System.Drawing.Image.FromFile(filename); MemoryStream mstream = new MemoryStream(); img.Save(mstream, img.RawFormat); byte[] imgBytes = mstream.ToArray(); base64Image = Convert.ToBase64String(imgBytes); return base64Image; } } public class ClsHtmlDoc { public HtmlAgilityPack.HtmlDocument htmlDoc; public ClsResult cRslt; /// /// 성공시 호출 /// /// public void setHtmlDoc(HtmlAgilityPack.HtmlDocument htmlDocument) { cRslt = new ClsResult(); htmlDoc = htmlDocument; cRslt.bSucc = true; } /// /// 실패시 호출 /// /// /// public void setHtmlDoc(ClsResult clsRslt) { cRslt = clsRslt; } /// /// 실패시 호출 (메세지와, 코드는 직접 입력) /// /// /// public void setHtmlDoc(string strResult, string strCode) { cRslt = new ClsResult(); cRslt.sResult = strResult; cRslt.sCode = strCode; } public void setHtmlDoc(HtmlAgilityPack.HtmlDocument htmlDocument, ClsResult clsRslt) { htmlDoc = htmlDocument; cRslt = new ClsResult(); } } public class ClsResult { public bool bSucc = false; public string sResult = string.Empty; public string sCode = string.Empty; //public string sEtc1 = string.Empty; //public string sEtc2 = string.Empty; public ClsResult() { } public ClsResult(bool isSucc) { bSucc = isSucc; } public void setResult(bool isSucc, string strMsg, string strCode) { bSucc = isSucc; sResult = strMsg; sCode = strCode; } /* public void setResult(bool isSucc, string strMsg, string strCode, string strEtc1) { bSucc = isSucc; sResult = strMsg; sCode = strCode; sEtc1 = strEtc1; } public void setResult(bool isSucc, string strMsg, string strCode, string strEtc1, string strEtc2) { bSucc = isSucc; sResult = strMsg; sCode = strCode; sEtc1 = strEtc1; sEtc2 = strEtc2; } */ } }

댓글 없음:

댓글 쓰기