C#实现HTML转WORD及WORD转PDF的方法
本文实例讲述了C#实现HTML转WORD及WORD转PDF的方法。分享给大家供大家参考。具体如下:
功能:实现HTML转WORD,WORD转PDF
具体代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingWord=Microsoft.Office.Interop.Word;
usingoWord=Microsoft.Office.Interop.Word;
usingSystem.Reflection;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingMicrosoft.Office.Core;
usingSystem.Text.RegularExpressions;
namespaceWindowsApplication2
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
objectoMissing=System.Reflection.Missing.Value;
objectoEndOfDoc="\\endofdoc";/*\endofdocisapredefinedbookmark*/
//StartWordandcreateanewdocument.
Word._ApplicationoWord;
Word._DocumentoDoc;
oWord=newWord.Application();
oWord.Visible=true;
oDoc=oWord.Documents.Add(refoMissing,refoMissing,
refoMissing,refoMissing);
//Insertaparagraphatthebeginningofthedocument.
Word.ParagraphoPara1;
oPara1=oDoc.Content.Paragraphs.Add(refoMissing);
oPara1.Range.Text="Heading1";
oPara1.Range.Font.Bold=1;
oPara1.Format.SpaceAfter=24;//24ptspacingafterparagraph.
oPara1.Range.InsertParagraphAfter();
//Insertaparagraphattheendofthedocument.
Word.ParagraphoPara2;
objectoRng=oDoc.Bookmarks.get_Item(refoEndOfDoc).Range;
oPara2=oDoc.Content.Paragraphs.Add(refoRng);
oPara2.Range.Text="Heading2";
oPara2.Format.SpaceAfter=6;
oPara2.Range.InsertParagraphAfter();
//Insertanotherparagraph.
Word.ParagraphoPara3;
oRng=oDoc.Bookmarks.get_Item(refoEndOfDoc).Range;
oPara3=oDoc.Content.Paragraphs.Add(refoRng);
oPara3.Range.Text="Thisisasentenceofnormaltext.Nowhereisatable:";
oPara3.Range.Font.Bold=0;
oPara3.Format.SpaceAfter=24;
oPara3.Range.InsertParagraphAfter();
//Inserta3x5table,fillitwithdata,andmakethefirstrow
//boldanditalic.
Word.TableoTable;
Word.RangewrdRng=oDoc.Bookmarks.get_Item(refoEndOfDoc).Range;
oTable=oDoc.Tables.Add(wrdRng,3,5,refoMissing,refoMissing);
oTable.Range.ParagraphFormat.SpaceAfter=6;
intr,c;
stringstrText;
for(r=1;r<=3;r++)
for(c=1;c<=5;c++)
{
strText="r"+r+"c"+c;
oTable.Cell(r,c).Range.Text=strText;
}
oTable.Rows[1].Range.Font.Bold=1;
oTable.Rows[1].Range.Font.Italic=1;
//Addsometextafterthetable.
Word.ParagraphoPara4;
oRng=oDoc.Bookmarks.get_Item(refoEndOfDoc).Range;
oPara4=oDoc.Content.Paragraphs.Add(refoRng);
oPara4.Range.InsertParagraphBefore();
oPara4.Range.Text="Andhere'sanothertable:";
oPara4.Format.SpaceAfter=24;
oPara4.Range.InsertParagraphAfter();
//Inserta5x2table,fillitwithdata,andchangethecolumnwidths.
wrdRng=oDoc.Bookmarks.get_Item(refoEndOfDoc).Range;
oTable=oDoc.Tables.Add(wrdRng,5,2,refoMissing,refoMissing);
oTable.Range.ParagraphFormat.SpaceAfter=6;
for(r=1;r<=5;r++)
for(c=1;c<=2;c++)
{
strText="r"+r+"c"+c;
oTable.Cell(r,c).Range.Text=strText;
}
oTable.Columns[1].Width=oWord.InchesToPoints(2);//Changewidthofcolumns1&2
oTable.Columns[2].Width=oWord.InchesToPoints(3);
//Keepinsertingtext.Whenyougetto7inchesfromtopofthe
//document,insertahardpagebreak.
objectoPos;
doubledPos=oWord.InchesToPoints(7);
oDoc.Bookmarks.get_Item(refoEndOfDoc).Range.InsertParagraphAfter();
do
{
wrdRng=oDoc.Bookmarks.get_Item(refoEndOfDoc).Range;
wrdRng.ParagraphFormat.SpaceAfter=6;
wrdRng.InsertAfter("Alineoftext");
wrdRng.InsertParagraphAfter();
oPos=wrdRng.get_Information
(Word.WdInformation.wdVerticalPositionRelativeToPage);
}
while(dPos>=Convert.ToDouble(oPos));
objectoCollapseEnd=Word.WdCollapseDirection.wdCollapseEnd;
objectoPageBreak=Word.WdBreakType.wdPageBreak;
wrdRng.Collapse(refoCollapseEnd);
wrdRng.InsertBreak(refoPageBreak);
wrdRng.Collapse(refoCollapseEnd);
wrdRng.InsertAfter("We'renowonpage2.Here'smychart:");
wrdRng.InsertParagraphAfter();
//Insertachart.
Word.InlineShapeoShape;
objectoClassType="MSGraph.Chart.8";
wrdRng=oDoc.Bookmarks.get_Item(refoEndOfDoc).Range;
oShape=wrdRng.InlineShapes.AddOLEObject(refoClassType,refoMissing,
refoMissing,refoMissing,refoMissing,
refoMissing,refoMissing,refoMissing);
//DemonstrateuseoflateboundoChartandoChartAppobjectsto
//manipulatethechartobjectwithMSGraph.
objectoChart;
objectoChartApp;
oChart=oShape.OLEFormat.Object;
oChartApp=oChart.GetType().InvokeMember("Application",
BindingFlags.GetProperty,null,oChart,null);
//ChangethecharttypetoLine.
object[]Parameters=newObject[1];
Parameters[0]=4;//xlLine=4
oChart.GetType().InvokeMember("ChartType",BindingFlags.SetProperty,
null,oChart,Parameters);
//UpdatethechartimageandquitMSGraph.
oChartApp.GetType().InvokeMember("Update",
BindingFlags.InvokeMethod,null,oChartApp,null);
oChartApp.GetType().InvokeMember("Quit",
BindingFlags.InvokeMethod,null,oChartApp,null);
//...Ifdesired,youcanproceedfromhereusingtheMicrosoftGraph
//ObjectmodelontheoChartandoChartAppobjectstomakeadditional
//changestothechart.
//Setthewidthofthechart.
oShape.Width=oWord.InchesToPoints(6.25f);
oShape.Height=oWord.InchesToPoints(3.57f);
//Addtextafterthechart.
wrdRng=oDoc.Bookmarks.get_Item(refoEndOfDoc).Range;
wrdRng.InsertParagraphAfter();
wrdRng.InsertAfter("THEEND.");
//Closethisform.
this.Close();
}
privatevoidbutton2_Click(objectsender,EventArgse)
{
strings="";
if(openFileDialog1.ShowDialog()==DialogResult.OK)
{
s=openFileDialog1.FileName;
}
else
{
return;
}
//在此处放置用户代码以初始化页面
Word.ApplicationClassword=newWord.ApplicationClass();
TypewordType=word.GetType();
Word.Documentsdocs=word.Documents;
//打开文件
TypedocsType=docs.GetType();
objectfileName=s;
Word.Documentdoc=(Word.Document)docsType.InvokeMember("Open",
System.Reflection.BindingFlags.InvokeMethod,null,docs,newObject[]{fileName,false,false});
//转换格式,另存为
TypedocType=doc.GetType();
objectsaveFileName="d:\\Reports\\aaa.doc";
//下面是MicrosoftWord9ObjectLibrary的写法,如果是10,可能写成:
/*
docType.InvokeMember("SaveAs",System.Reflection.BindingFlags.InvokeMethod,
null,doc,newobject[]{saveFileName,Word.WdSaveFormat.wdFormatFilteredHTML});
*/
///其它格式:
///wdFormatHTML
///wdFormatDocument
///wdFormatDOSText
///wdFormatDOSTextLineBreaks
///wdFormatEncodedText
///wdFormatRTF
///wdFormatTemplate
///wdFormatText
///wdFormatTextLineBreaks
///wdFormatUnicodeText
docType.InvokeMember("SaveAs",System.Reflection.BindingFlags.InvokeMethod,
null,doc,newobject[]{saveFileName,Word.WdSaveFormat.wdFormatDocument});
//退出Word
wordType.InvokeMember("Quit",System.Reflection.BindingFlags.InvokeMethod,
null,word,null);
}
privatevoidWordConvert(strings)
{
oWord.ApplicationClassword=newMicrosoft.Office.Interop.Word.ApplicationClass();
TypewordType=word.GetType();
//打开WORD文档
/*对应脚本中的
varword=newActiveXObject("Word.Application");
vardoc=word.Documents.Open(docfile);
*/
oWord.Documentsdocs=word.Documents;
TypedocsType=docs.GetType();
objectobjDocName=s;
oWord.Documentdoc=(oWord.Document)docsType.InvokeMember("Open",System.Reflection.BindingFlags.InvokeMethod,null,docs,newObject[]{objDocName,true,true});
//打印输出到指定文件
//你可以使用doc.PrintOut();方法,次方法调用中的参数设置较繁琐,建议使用Type.InvokeMember来调用时可以不用将PrintOut的参数设置全,只设置4个主要参数
TypedocType=doc.GetType();
objectprintFileName=@"c:\aaa.ps";
docType.InvokeMember("PrintOut",System.Reflection.BindingFlags.InvokeMethod,null,doc,newobject[]{false,false,oWord.WdPrintOutRange.wdPrintAllDocument,printFileName});
//newobject[]{false,false,oWord.WdPrintOutRange.wdPrintAllDocument,printFileName}
//对应脚本中的word.PrintOut(false,false,0,psfile);的参数
//退出WORD
//对应脚本中的word.Quit();
wordType.InvokeMember("Quit",System.Reflection.BindingFlags.InvokeMethod,null,word,null);
objecto1="c:\\aaa.ps";
objecto2="c:\\aaa.pdf";
objecto3="";
//引用将PS转换成PDF的对象
//trycatch之间对应的是脚本中的PDF.FileToPDF(psfile,pdffile,"");//你可以使用pdfConvert.FileToPDF("c:\\test.ps","c:\\test.pdf","");这样的转换方法,本人只是为了保持与WORD相同的调用方式
try
{
ACRODISTXLib.PdfDistillerClasspdf=newACRODISTXLib.PdfDistillerClass();
TypepdfType=pdf.GetType();
pdfType.InvokeMember("FileToPDF",System.Reflection.BindingFlags.InvokeMethod,null,pdf,newobject[]{o1,o2,o3});
pdf=null;
}
catch{}//读者自己补写错误处理
//为防止本方法调用多次时发生错误,必须停止acrodist.exe进程
foreach(System.Diagnostics.ProcessprocinSystem.Diagnostics.Process.GetProcesses())
{
intbegpos;
intendpos;
stringsProcName=proc.ToString();
begpos=sProcName.IndexOf("(")+1;
endpos=sProcName.IndexOf(")");
sProcName=sProcName.Substring(begpos,endpos-begpos);
if(sProcName.ToLower().CompareTo("acrodist")==0)
{
try
{
proc.Kill();//停止进程
}
catch{}//读者自己补写错误处理
break;
}
}
}
privatevoidbutton3_Click(objectsender,EventArgse)
{
if(openFileDialog1.ShowDialog()==DialogResult.OK)
{
strings=openFileDialog1.FileName;
WordConvert(s);
}
}
//getnextcode
privatevoidbutton4_Click(objectsender,EventArgse)
{
WorkCellmyWorkCell=newWorkCell(textBox2.Text,textBox1.Text);
textBox3.Text=myWorkCell.GetNextCode();
}
}
publicclassWorkCell
{
privatestringworkCellCode;
privatestringparentCellCode;
privatestringcommonCode;
privatechar[]code;
privatechar[]pCode;
privatechar[]standCode;
privatestrings;
publicWorkCell(stringmycode,stringparentcode)
{
workCellCode=mycode;
parentCellCode=parentcode;
standCode=newchar[]{'1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','W','T','U','V','W','X','Y','Z'};
commonCode=Regex.Replace(parentCellCode,@"0+","");
code=workCellCode.Substring(commonCode.Length).ToCharArray();
}
publicstringWorkCellCode
{
set
{
workCellCode=value;
}
get
{
returnworkCellCode;
}
}
publicstringParentCellCode
{
set
{
workCellCode=value;
}
get
{
returnworkCellCode;
}
}
publicstringGetNextCode()
{
strings="";
if(code.Length>0)
{
inti=0;
for(i=code.Length-1;i>=0;i--)
{
if(code[i]!='0')
{
GetNextChar(i);
break;
}
}
for(i=0;i<code.Length;i++)
{
s+=code[i].ToString();
}
returncommonCode+s;
}
else
{
return"null";
}
}
//设置code中的下一个代码,从右边起,找到第一个非0字符,将其按标准代码自加1,溢出则进位
privatecharGetNextChar(intj)
{
inti=-1;
intflag=0;
for(i=0;i<standCode.Length;i++)
{
if(code[j]==standCode[i])
{
flag=1;
break;
}
}
//MessageBox.Show(code[j].ToString()+""+standCode[i].ToString()+""+i.ToString());
if(i>=standCode.Length-1||flag==0)
{
code[j]=standCode[0];
if(j>0)
code[j-1]=GetNextChar(j-1);
}
else
{
code[j]=standCode[i+1];
}
returncode[j];
}
}
}
希望本文所述对大家的C#程序设计有所帮助。