// 비주얼스튜디오 > 도구 > 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)
댓글 없음:
댓글 쓰기