用C#實現產生PDF文檔的方法
來源:互聯網
上載者:User
using System; using System.IO; using System.Text; using System.Collections; namespace PDFGenerator { public class PDFGenerator { static float pageWidth = 594.0f; static float pageDepth = 828.0f; static float pageMargin = 30.0f; static float fontSize = 20.0f; static float leadSize = 10.0f; static StreamWriter pPDF = new StreamWriter("E:\\myPDF.pdf"); static MemoryStream mPDF = new MemoryStream(); static void ConvertToByteAndAddtoStream(string strMsg) { Byte[] buffer = null; buffer = ASCIIEncoding.ASCII.GetBytes(strMsg); mPDF.Write(buffer, 0, buffer.Length); buffer = null; } static string xRefFormatting(long xValue) { string strMsg = xValue.ToString(); int iLen = strMsg.Length; if (iLen < 10) { StringBuilder s = new StringBuilder(); int i = 10 - iLen; s.Append("0", i); strMsg = s.ToString() + strMsg; } return strMsg; } static void Main(string[] args) { ArrayList xRefs = new ArrayList(); //Byte[] buffer=null; float yPos = 0f; long streamStart = 0; long streamEnd = 0; long streamLen = 0; string strPDFMessage = null; //PDF文檔頭資訊 strPDFMessage = "%PDF-1.1 "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage = "1 0 obj "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = "<< /Length 2 0 R >> "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = "stream "; ConvertToByteAndAddtoStream(strPDFMessage); /**/ ////////PDF文檔描述 streamStart = mPDF.Length; //字型 strPDFMessage = "BT /F0 " + fontSize + " Tf "; ConvertToByteAndAddtoStream(strPDFMessage); //PDF文檔實體高度 yPos = pageDepth - pageMargin; strPDFMessage = pageMargin + " " + yPos + " Td "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = leadSize + " TL "; ConvertToByteAndAddtoStream(strPDFMessage); //實體內容 strPDFMessage = "(http://www.wenhui.org)Tj "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = "ET "; ConvertToByteAndAddtoStream(strPDFMessage); streamEnd = mPDF.Length; streamLen = streamEnd - streamStart; strPDFMessage = "endstream endobj "; ConvertToByteAndAddtoStream(strPDFMessage); //PDF文檔的版本資訊 xRefs.Add(mPDF.Length); strPDFMessage = "2 0 obj " + streamLen + " endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage = "3 0 obj <</Type/Page/Parent 4 0 R/Contents 1 0 R>> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage = "4 0 obj <</Type /Pages /Count 1 "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = "/Kids[ 3 0 R ] "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = "/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >> "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = "/MediaBox [ 0 0 " + pageWidth + " " + pageDepth + " ] >> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage = "5 0 obj <</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage = "6 0 obj <</Type/Catalog/Pages 4 0 R>> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); streamStart = mPDF.Length; strPDFMessage = "xref 0 7 0000000000 65535 f "; for (int i = 0; i < xRefs.Count; i++) { strPDFMessage += xRefFormatting((long)xRefs[i]) + " 00000 n "; } ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = "trailer << /Size " + (xRefs.Count + 1) + " /Root 6 0 R >> "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage = "startxref " + streamStart + " %%EOF "; ConvertToByteAndAddtoStream(strPDFMessage); mPDF.WriteTo(pPDF.BaseStream); mPDF.Close(); pPDF.Close(); } } }