public void ProcessRequest(HttpContext context)
{
string strurl = MakeUtil.getStringFromRequestByName(context.Request, "URL", -1);
url = new Uri(strurl.Replace("|", "&"));
if (url != null)
{
this.CreatPdf(context);
}
else
{
return;
}
} public bool IsReusable
{
get
{
return false;
}
}
private System.Drawing.Bitmap bitmap;
private Uri url = null;
private int w = 760, h = 2393;
public void setBitmap()
{
using (WebBrowser wb = new WebBrowser())
{
wb.Width = w;
wb.Height = h;
wb.ScrollBarsEnabled = false;
wb.Navigate(url);
//确保页面被解析完全
while (wb.ReadyState != WebBrowserReadyState.Complete)
{
System.Windows.Forms.Application.DoEvents();
}
bitmap = new System.Drawing.Bitmap(w, h);
wb.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, w, h));
wb.Dispose();
}
}
private void CreatPdf(HttpContext context)
{
Document doc = new Document(PageSize.A4, 9, 18, 36, 36);//左右上下
MemoryStream ms = new MemoryStream();
try
{
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
writer.CloseStream = false;
doc.Open();
Thread thread = new Thread(new ThreadStart(setBitmap));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
while (thread.IsAlive)
Thread.Sleep(100);
byte[] i = img.OriginalData;
img.ScalePercent(75);//560 630
doc.Add(img);
doc.NewPage();
//doc.Add(img);
}
catch (Exception err)
{
throw new Exception(err.Message);
}
finally
{
doc.Close();
ViewPdf(ms, context);
}
} private void ViewPdf(Stream fs, HttpContext context)
{
context.Response.Clear();
//中文名的话
//context.Response.AppendHeader("Content-Disposition", "attachment;filename=" +
// HttpUtility.UrlEncode("中文.pdf"));
string head = MakeUtil.getStringFromRequestByName(context.Request, "Head", -1);
string filename = head +string.Format("{0:yyyyMMdd}",DateTime.Now.Date);
context.Response.AddHeader("Content-Disposition", "inline;FileName=" + filename+".pdf");
context.Response.ContentType = "application/pdf";
long fileLength = fs.Length;
int size = 10240;//10K一--分块下载,10K为1块
byte[] readData = new byte[size];
if (size > fileLength)
size = Convert.ToInt32(fileLength);
long fPos = 0;
bool isEnd = false;
while (!isEnd)
{
if ((fPos + size) >= fileLength)
{
size = Convert.ToInt32(fileLength - fPos);
isEnd = true;
}
readData = new byte[size];
fs.Position = fPos;
fs.Read(readData, 0, size);
context.Response.BinaryWrite(readData);
context.Response.OutputStream.Flush();
fPos += size;
}
fs.Close();
context.Response.OutputStream.Close();
context.Response.End();//非常重要,没有这句的话,页面的HTML代码将会保存到文件中
context.Response.Close();
}
部分代码如下,我想要的效果是分页,因为从html得到的图片高度大于A4的高度。我原来的思路是得到img对象后,读取高度的一部分,放到doc对象中,但是无法的到img的高度,比如0-100这部分图片。应该怎么做啊,哪个高手帮忙下,还是用别的方法!
{
string strurl = MakeUtil.getStringFromRequestByName(context.Request, "URL", -1);
url = new Uri(strurl.Replace("|", "&"));
if (url != null)
{
this.CreatPdf(context);
}
else
{
return;
}
} public bool IsReusable
{
get
{
return false;
}
}
private System.Drawing.Bitmap bitmap;
private Uri url = null;
private int w = 760, h = 2393;
public void setBitmap()
{
using (WebBrowser wb = new WebBrowser())
{
wb.Width = w;
wb.Height = h;
wb.ScrollBarsEnabled = false;
wb.Navigate(url);
//确保页面被解析完全
while (wb.ReadyState != WebBrowserReadyState.Complete)
{
System.Windows.Forms.Application.DoEvents();
}
bitmap = new System.Drawing.Bitmap(w, h);
wb.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, w, h));
wb.Dispose();
}
}
private void CreatPdf(HttpContext context)
{
Document doc = new Document(PageSize.A4, 9, 18, 36, 36);//左右上下
MemoryStream ms = new MemoryStream();
try
{
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
writer.CloseStream = false;
doc.Open();
Thread thread = new Thread(new ThreadStart(setBitmap));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
while (thread.IsAlive)
Thread.Sleep(100);
byte[] i = img.OriginalData;
img.ScalePercent(75);//560 630
doc.Add(img);
doc.NewPage();
//doc.Add(img);
}
catch (Exception err)
{
throw new Exception(err.Message);
}
finally
{
doc.Close();
ViewPdf(ms, context);
}
} private void ViewPdf(Stream fs, HttpContext context)
{
context.Response.Clear();
//中文名的话
//context.Response.AppendHeader("Content-Disposition", "attachment;filename=" +
// HttpUtility.UrlEncode("中文.pdf"));
string head = MakeUtil.getStringFromRequestByName(context.Request, "Head", -1);
string filename = head +string.Format("{0:yyyyMMdd}",DateTime.Now.Date);
context.Response.AddHeader("Content-Disposition", "inline;FileName=" + filename+".pdf");
context.Response.ContentType = "application/pdf";
long fileLength = fs.Length;
int size = 10240;//10K一--分块下载,10K为1块
byte[] readData = new byte[size];
if (size > fileLength)
size = Convert.ToInt32(fileLength);
long fPos = 0;
bool isEnd = false;
while (!isEnd)
{
if ((fPos + size) >= fileLength)
{
size = Convert.ToInt32(fileLength - fPos);
isEnd = true;
}
readData = new byte[size];
fs.Position = fPos;
fs.Read(readData, 0, size);
context.Response.BinaryWrite(readData);
context.Response.OutputStream.Flush();
fPos += size;
}
fs.Close();
context.Response.OutputStream.Close();
context.Response.End();//非常重要,没有这句的话,页面的HTML代码将会保存到文件中
context.Response.Close();
}
部分代码如下,我想要的效果是分页,因为从html得到的图片高度大于A4的高度。我原来的思路是得到img对象后,读取高度的一部分,放到doc对象中,但是无法的到img的高度,比如0-100这部分图片。应该怎么做啊,哪个高手帮忙下,还是用别的方法!
my blog
http://ufo-crackerx.blog.163.com/