当前位置:编程学习 > C#/ASP.NET >>

关于如何将BMP图片出力成PDF文件的问题

小弟想把BMP图片出力成PDF文件,可是处理结果里,有以下几个问题,
1,图片染色都是黑白灰的,可是我已经使用DeviceRGB了
2,我只出力了一张图片,不但不清晰,还发现重影的现象

有哪位PDF文件出力方面比较在行的大哥赶紧帮忙指点指点,我的代码在下面,建个工程拷出来就能用
 namespace WindowsApplication1
{
public partial class PDFGenerator : Form
{
static void ConvertToByteAndAddtoStream(MemoryStream mPDF, 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;
}
private byte[] ReadResourceBitMapData(
MemoryStream bitmapStream
)
{
byte[] bmpData = new byte[bitmapStream.Length];
bitmapStream.Position = 0;
bitmapStream.Read(bmpData, 0, (int)bitmapStream.Length);
return bmpData;
}
private void button2_Click(object sender, EventArgs e)
{
StreamWriter pPDF = new StreamWriter("E://myPDF.pdf");
MemoryStream mPDF = new MemoryStream();     
ArrayList xRefs = new ArrayList();
int objCount = 1;
long streamStart = 0;
string strPDFMessage = string.Empty;
// head
strPDFMessage = "%PDF-1.4\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
xRefs.Add(mPDF.Length);
for( int i = 1; i <= 1; i++ )
{
MemoryStream tempStream = null;
Bitmap bitmap = new Bitmap("E://111.bmp");
int PDFWidth = bitmap.Width;
int PDFHeight = bitmap.Height;
bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);
tempStream = new MemoryStream();
bitmap.Save(tempStream, ImageFormat.Bmp);
tempStream.Flush();
//long length = tempStream.Length; 
byte[] bitmapBuff = ReadResourceBitMapData(tempStream);
tempStream.Close();
tempStream = null;
long len = bitmapBuff.Length; 
// obj img
strPDFMessage = objCount.ToString() + " 0 obj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "<< /Type /XObject\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage); 
strPDFMessage = "/Subtype /Image\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Name /Im1\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Width " + PDFWidth + "\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Height " + PDFHeight + "\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/ColorSpace /DeviceRGB\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/BitsPerComponent 8\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Length " + len + "\n>>";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "stream\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
mPDF.Write(bitmapBuff, 0, bitmapBuff.Length);
bitmapBuff = null;
strPDFMessage = "\nendstream\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage); 
strPDFMessage = "endobj\n"; 
ConvertToByteAndAddtoStream(mPDF, strPDFMessage); 
xRefs.Add(mPDF.Length);
objCount++; 
// Contents of page
strPDFMessage = objCount.ToString() + " 0 obj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "<< /Length 56>>\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "stream\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "q\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "" + PDFWidth + " 0 0 " + PDFHeight + " 0 " + "0" + " cm\n"; 
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Im1 Do\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "Q\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "endstream\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "endobj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
xRefs.Add(mPDF.Length);
objCount++;
// Resource dictionary for page
strPDFMessage = objCount.ToString() + " 0 obj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "<< /ProcSet [/PDF /ImageC]\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/XObject << /Im1 " + (objCount - 2) + " 0 R >>\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = ">>\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "endobj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
xRefs.Add(mPDF.Length);
objCount++;
// Page object
strPDFMessage = objCount.ToString() + " 0 obj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "<< /Type /Page\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Parent 33 0 R\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Resources " + (objCount - 1) + " 0 R\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/MediaBox [0 0 " + PDFWidth.ToString() + " " + PDFHeight.ToString() + "]\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Contents " + (objCount - 2) + " 0 R>>\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "endobj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
xRefs.Add(mPDF.Length);
objCount++;
// obj Catalog
strPDFMessage = "35 0 obj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "<< /Type /Catalog\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Outlines 34 0 R\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Pages 33 0 R >>\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "endobj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
xRefs.Add(mPDF.Length);
// obj Outlines
strPDFMessage = "34 0 obj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "<< /Type /Outlines\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Count 0 >>\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "endobj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
xRefs.Add(mPDF.Length);
// obj Pages
strPDFMessage = "33 0 obj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "<< /Type /Pages\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Kids [4 0 R]\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Count 1\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = ">>\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "endobj\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
xRefs.Add(mPDF.Length);
// length of all obj
streamStart = mPDF.Length;
// xref
strPDFMessage = "xref\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "0 " + xRefs.Count.ToString() + "\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = xRefFormatting(0) + " 65535 f\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
for( int i = 0; i < xRefs.Count - 1; i++ )
{strPDFMessage = xRefFormatting((long)xRefs[i]) + " 00000 n\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
}
// trailer
strPDFMessage = "trailer\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "<< /Size " + xRefs.Count.ToString() + "\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "/Root 35 0 R >>\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
// startxref
strPDFMessage = "startxref\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = streamStart.ToString() + "\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
strPDFMessage = "%%EOF\n";
ConvertToByteAndAddtoStream(mPDF, strPDFMessage);
mPDF.WriteTo(pPDF.BaseStream);
mPDF.Close();
pPDF.Close();
}
}
}

--------------------编程问答-------------------- http://download.csdn.net/download/kongwei521/3682622
参考。
补充:.NET技术 ,  分析与设计
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,