// 비주얼스튜디오 > 도구 > 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; } */ } }
2025년 2월 5일 수요일
변환
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기