请高手们救求我吧(急),解决B/S中客户端中文网页生成PDF文件怎么实现。在线等,分不够再加。

时间:2022-04-23 10:31:46
各位好,B/S架构中,客户端网页生成PDF文件应该怎么实现呀,有源码和解决方案都行。拜托!拜托!

48 个解决方案

#1


客户端的就难了,没有生成环境,脚本根本做不到

是不是可以在服务器端生成,客户端再打开
http://expert.csdn.net/Expert/topic/2666/2666984.xml?temp=.1908533

#2


我最近做过。不过服务器端需要安装 Adobe Acrobat (Not Reader)和 Microsoft Office 系列软件,可以把 Word , Excel , PowerPoint 格式的文件转换为 PDF 文件。

#3


我们有HTML,DOC,RTF,TXT,TIFF to PDF的Converter,是通过虚拟打印机实现自动转换,可以将各种文档,网页或URL直接批量转为PDF文件,适合商业使用,详情请浏览www.lingwen.com.cn。

#4


用C#实现生成PDF文档 
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\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="1 0 obj\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="<< /Length 2 0 R >>\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="stream\n";
ConvertToByteAndAddtoStream(strPDFMessage);
////////PDF文档描述
streamStart=mPDF.Length;
//字体
strPDFMessage="BT\n/F0 " + fontSize +" Tf\n";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF文档实体高度
yPos = pageDepth - pageMargin;
strPDFMessage=pageMargin + " " + yPos +" Td\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage= leadSize+" TL\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);

//实体内容
strPDFMessage= "(http://www.wenhui.org)Tj\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage= "ET\n";
ConvertToByteAndAddtoStream(strPDFMessage);
streamEnd=mPDF.Length;

streamLen=streamEnd-streamStart;
strPDFMessage= "endstream\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF文档的版本信息
xRefs.Add(mPDF.Length);
strPDFMessage="2 0 obj\n"+ streamLen + "\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="4 0 obj\n<</Type /Pages /Count 1\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/Kids[\n3 0 R\n]\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >>\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/MediaBox [ 0 0 "+ pageWidth + " " + pageDepth + " ]\n>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

streamStart=mPDF.Length;
strPDFMessage="xref\n0 7\n0000000000 65535 f \n";
for(int i=0;i<xRefs.Count;i++)
{
strPDFMessage+=xRefFormatting((long) xRefs[i])+" 00000 n \n";
}
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="trailer\n<<\n/Size "+ (xRefs.Count+1)+"\n/Root 6 0 R\n>>\n";
ConvertToByteAndAddtoStream(strPDFMessage);

strPDFMessage="startxref\n" + streamStart+"\n%%EOF\n";
ConvertToByteAndAddtoStream(strPDFMessage);
mPDF.WriteTo(pPDF.BaseStream);

mPDF.Close();
pPDF.Close();
}
}


 
 

#5


//write  by  wenhui.org  
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\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="1  0  obj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="<<  /Length  2  0  R  >>\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="stream\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
////////PDF文档描述  
streamStart=mPDF.Length;  
//字体  
strPDFMessage="BT\n/F0  "  +  fontSize  +"  Tf\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
//PDF文档实体高度  
yPos  =  pageDepth  -  pageMargin;  
strPDFMessage=pageMargin  +  "  "  +  yPos  +"  Td\n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage=  leadSize+"  TL\n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
//实体内容  
strPDFMessage=  "(http://www.wenhui.org)Tj\n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage=  "ET\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
streamEnd=mPDF.Length;  
 
streamLen=streamEnd-streamStart;  
strPDFMessage=  "endstream\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
//PDF文档的版本信息  
xRefs.Add(mPDF.Length);  
strPDFMessage="2  0  obj\n"+  streamLen  +  "\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="3  0  obj\n<</Type/Page/Parent  4  0  R/Contents  1  0  R>>\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="4  0  obj\n<</Type  /Pages  /Count  1\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="/Kids[\n3  0  R\n]\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="/Resources<</ProcSet[/PDF/Text]/Font<</F0  5  0  R>>  >>\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="/MediaBox  [  0  0  "+  pageWidth  +  "  "  +  pageDepth  +  "  ]\n>>\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="5  0  obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="6  0  obj\n<</Type/Catalog/Pages  4  0  R>>\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
streamStart=mPDF.Length;  
strPDFMessage="xref\n0  7\n0000000000  65535  f  \n";  
for(int  i=0;i<xRefs.Count;i++)  
{  
strPDFMessage+=xRefFormatting((long)  xRefs[i])+"  00000  n  \n";  
}  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="trailer\n<<\n/Size  "+  (xRefs.Count+1)+"\n/Root  6  0  R\n>>\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
strPDFMessage="startxref\n"  +  streamStart+"\n%%EOF\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
mPDF.WriteTo(pPDF.BaseStream);  
 
mPDF.Close();  
pPDF.Close();  
}  
}  
}

#6


水晶报表导出一下

#7


用水晶报表最快了,格式还简单;

#8


to: lijun84(李俊俊) gengwei80(唐伯虎点秋香) 都不支持中文呀。还有更好的办法吗????

#9


关注+学习!

#10


我一般是這樣做的,不知對你有沒有幫助:

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using CrystalDecisions.Web.Design;

public string Report2PDF(string report_path)     //放在共用類中
{
string pdf_file=report_path+".pdf";
string report_file=report_path+".rpt";

ReportDocument ReportDoc;
DiskFileDestinationOptions MyDiskFile;
ExportOptions ReportExportOptions;

ReportDoc=new ReportDocument();
ReportDoc.Load(report_file);
ReportDoc.Refresh();

MyDiskFile=new DiskFileDestinationOptions();
MyDiskFile.DiskFileName=pdf_file;

ReportExportOptions=new ExportOptions();
ReportExportOptions=ReportDoc.ExportOptions;

ReportExportOptions.ExportFormatType=ExportFormatType.PortableDocFormat;
ReportExportOptions.ExportDestinationType=ExportDestinationType.DiskFile;
ReportExportOptions.DestinationOptions=MyDiskFile;

ReportDoc.Export();

string ScriptStr = "<script language=JavaScript>";
ScriptStr += "window.open('" + "./"+Path.GetFileName(pdf_file)+"'";
ScriptStr+=",";
ScriptStr+="''";
//ScriptStr+=",";
//ScriptStr+="'null'";
ScriptStr+=",";
ScriptStr +="'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=0,width=790,height=545,left=0,top=0'";
ScriptStr +=")<";
ScriptStr += "/";
ScriptStr += "script>";
return ScriptStr;

}


private void Button3_Click(object sender, System.EventArgs e)
{
string path=Server.MapPath("./")+"\\product_month_print";
pdf_print(path);
}

private void pdf_print(string path_str)
{
Common_Data ws=new Common_Data();
Context.Response.ClearContent();
Context.Response.ClearHeaders();
Context.Response.ContentType = "application/pdf";
//Response.Write(Functions.ShowErrMsg("開始打印,請準備好打印紙張!!!"));

Response.Write(ws.Report2PDF(path_str));
//Response.Flush();
//Response.Close();
}

#11


请问你这是从哪引用的呀,是自己写的类库吗?还是Crystal Report 自己带的呀。Common_Data ws=new Common_Data();(谢谢您的回复)

#12


對不起我沒有說清楚:

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using CrystalDecisions.Web.Design;直接引用水晶報表

Report2PDF函數放在一個共用類(Common_Data)中,

ws=new Common_Data();產生一個類的實例


目的是其它頁面都調用Report2PDF產生PDF文件,輸出報表
不知這種方法好不好,我是這麼用的,感覺是報表比較慢,但客戶機什麼都不用

有什麼更好方法別忘記告訴我

謝謝

#13


有一个opensource的dll,我已经用他实现了很多功能,水印,中文,图片,表格,页眉页脚等,可以写到服务器硬盘,再读出来传到客户端,也可以直接写到服务器内存,response到客户端,源码及dll可以到这里下载:http://itextsharp.sourceforge.net/

#14


功能是挺强大的,但是实现客户端的操作比较麻烦,不知道 joan_lu(joan) 有没有好的实现方法呀。非常感谢。

#15


客户端的东西你可以重写一遍到pdf,就相当于把客户端的内容写到pdf了。我是这么理解的,象以前要把生成到客户端的表格导到excel一样,在服务器端重新生成一遍,只是这次是直接导出到excel,而不是到浏览器,道理是一样,不知道你的意思是不是这样。

#16


to:joan_lu(joan),我目前就是采用 iTextSharp来进行转换,具体流程,是用WebRequest从客户端URL取得客户端脚本,然后依次进行语法分析,对<Table>、<P>等转换成iTextSharp的语法,但是对于表格的嵌套时,生成的PDF格式老是调不好,和原页面不一致。还望joan_lu(joan),多多指教。如:一个大表(ParentTable)中,包含一小表(SonTable),大表中有三列,小表有6列,如何将小表插入大表单元格中。如何进行格式调整。谢谢。

#17


这个和HTML是一样的,象列合并,行合并以及表嵌套,你照HTML的做法就可以了,具体的话你可以打开它的源码table.cs里面你看过就明白怎么做了。

#18


我用下面的代码想输出pdf文件, 结果"拒绝访问报表文件":
string reportName = "ParameterField.rpt";
ReportDocument report = new ReportDocument();
report.Load(Server.MapPath(reportName));
report.Refresh();

DiskFileDestinationOptions crDiskFileDestinationOptions=new DiskFileDestinationOptions();
crDiskFileDestinationOptions.DiskFileName="ParameterField.pdf";

ExportOptions crExportOptions = new ExportOptions();
crExportOptions=report.ExportOptions ;
crExportOptions.DestinationOptions=crDiskFileDestinationOptions;
crExportOptions.ExportDestinationType =ExportDestinationType.DiskFile;
crExportOptions.ExportFormatType =ExportFormatType.PortableDocFormat;

report.Export();
//CRViewer.ReportSource = report;
//CRViewer.DataBind();
//CRViewer.Visible = true;
report.Close();

但可以显示报表?!我也修改了目录权限还是失败.真是郁闷!

#19


我也是楼上的这样的问题,如何解决呢?

#20


crDiskFileDestinationOptions.DiskFileName="ParameterField.pdf";
要加上路径,并且保证操作者(ASPNET)有写权限.

#21


学习中………………

#22


经过半个多月的努力,网页转PDF的c#组件终于开发完成,(支持中文,基于Itext的二次开发)为感谢各位的支持,将页网表格转PDF文件的代码公开,希望大家来一起完善,多提宝贵建议有兴趣的请留下MAIL地址.

#23


谢谢.jschinsh@163.net

#24


学习,jintaogentle@yahoo.com.cn

#25


学习,luxuliang@tom.com

#26


yyh88@163.com
thank you

#27


感谢了。。。。
可否给我一份???

最近正在考虑这个问题。。

dyroro@yahoo.com.cn

#28


给我一分
baikaishui2001@163.com

#29


我也学习下linpuren@126.com

#30


谢谢能不能给我一份
lei_guoliang@sohu.com

#31


楼上的各位,有收到楼主的源代码了么?
偶现在也要。。。。

不知哪位兄弟可以share一份给偶。。。。。

#32


在这我具体说一下类库的使用说明吧:
1、取得需要转PDF网页的URL,并获取网页脚本。
public string  GetWebContent(System.Uri uri)
{
string sTemp;
System.Net.WebRequest request = null;
System.Net.WebResponse response = null;
try
{
request = System.Net.WebRequest.Create(uri);
response = request.GetResponse();

System.IO.Stream stream = response.GetResponseStream();

System.IO.StreamReader reader = new System.IO.StreamReader(stream);
sTemp=(reader.ReadToEnd().ToString());
return sTemp;
}
catch(Exception de)
{
throw new Exception("", de);
}
finally
{
if (response!=null)
response.Close();
}
}
2、对网页脚本进行语法分析,获取页面内容并调用iText类库生成相应的PDF。

#33


//生成PDF文件
public  void ToPDF (string Content,string FileName)
{
string ParentStr;
ENet.IDC.ToPDF.Common  Ccomm=new ENet.IDC.ToPDF.Common();
Content=Content.ToLower().Trim();
ArrayList array=new ArrayList();
ArrayList TabString=new ArrayList();
ArrayList parentid=new ArrayList();
ArrayList tableindex=new ArrayList();

array=this.OrderTable(Content,out parentid,out tableindex);


 ParentStr=array[1].ToString() ;
string Table1=array[0].ToString();
ParentStr=System.Text.RegularExpressions.Regex.Replace(ParentStr,Table1,"|||Tab|||");


//定义PDF页面大小
Document document = new Document(PageSize.A4,50,50,50,50);
Document.compress=false;
   try
{

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FileName));
document.open();
                
   Table SonTable=PDFTable(Table1);
   Table Parent=PDFTable(ParentStr,SonTable,"|||Tab|||");
   //Table Parent=PDFTable(datatable);
       document.add(Parent);
   
   
 //  document.add(SonTable);
   document.add(datatable);
            
}
catch(Exception de)
{
throw new Exception("",de);

}
           document.close();
}

#34


谢了,学习!chaos_jn@126.com

#35


具体步骤请看源码。在这就不一一细说了。希望各位能将完善后的代码共享出来一起研究。

#36


请问能否提供VB.NET的代码呢  谢谢了
rischan@tom.com

#37


楼主,,,

正在期待你的源代码呢。

为什么我一直没有收到呢???

#38


to: pjliping(笨笨)
仁兄,看到我的发言了么?
不知道可否给一份源码给我。
我已经发过短消息给您了,您收到了么?
因为我现在也涉及到这个问题,所以才来找你了。

dyroro@yahoo.com.cn

#39


学习!chaos_jn@126.com

#40


不知道楼主看到我的呼唤了没有。。。。

喊得嗓子都哑了。。。。。。。。。。。

#41


没有办法了,只能再顶一次。。。

#42


顶!!!!
谢谢,fire_say@163.com

#43


mark

#44


水晶報表

#45


谢谢  学习   skylark_zcc@zzti.edu.cn

#46


我要一份,谢谢,jhonson13@163.com

#47


谢谢!zhangb@netstars.com.cn

#48


有没有用JAVA代码写的啊,我现在急需要一份!!!

#1


客户端的就难了,没有生成环境,脚本根本做不到

是不是可以在服务器端生成,客户端再打开
http://expert.csdn.net/Expert/topic/2666/2666984.xml?temp=.1908533

#2


我最近做过。不过服务器端需要安装 Adobe Acrobat (Not Reader)和 Microsoft Office 系列软件,可以把 Word , Excel , PowerPoint 格式的文件转换为 PDF 文件。

#3


我们有HTML,DOC,RTF,TXT,TIFF to PDF的Converter,是通过虚拟打印机实现自动转换,可以将各种文档,网页或URL直接批量转为PDF文件,适合商业使用,详情请浏览www.lingwen.com.cn。

#4


用C#实现生成PDF文档 
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\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="1 0 obj\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="<< /Length 2 0 R >>\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="stream\n";
ConvertToByteAndAddtoStream(strPDFMessage);
////////PDF文档描述
streamStart=mPDF.Length;
//字体
strPDFMessage="BT\n/F0 " + fontSize +" Tf\n";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF文档实体高度
yPos = pageDepth - pageMargin;
strPDFMessage=pageMargin + " " + yPos +" Td\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage= leadSize+" TL\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);

//实体内容
strPDFMessage= "(http://www.wenhui.org)Tj\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage= "ET\n";
ConvertToByteAndAddtoStream(strPDFMessage);
streamEnd=mPDF.Length;

streamLen=streamEnd-streamStart;
strPDFMessage= "endstream\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF文档的版本信息
xRefs.Add(mPDF.Length);
strPDFMessage="2 0 obj\n"+ streamLen + "\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="4 0 obj\n<</Type /Pages /Count 1\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/Kids[\n3 0 R\n]\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >>\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/MediaBox [ 0 0 "+ pageWidth + " " + pageDepth + " ]\n>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

streamStart=mPDF.Length;
strPDFMessage="xref\n0 7\n0000000000 65535 f \n";
for(int i=0;i<xRefs.Count;i++)
{
strPDFMessage+=xRefFormatting((long) xRefs[i])+" 00000 n \n";
}
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="trailer\n<<\n/Size "+ (xRefs.Count+1)+"\n/Root 6 0 R\n>>\n";
ConvertToByteAndAddtoStream(strPDFMessage);

strPDFMessage="startxref\n" + streamStart+"\n%%EOF\n";
ConvertToByteAndAddtoStream(strPDFMessage);
mPDF.WriteTo(pPDF.BaseStream);

mPDF.Close();
pPDF.Close();
}
}


 
 

#5


//write  by  wenhui.org  
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\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="1  0  obj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="<<  /Length  2  0  R  >>\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="stream\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
////////PDF文档描述  
streamStart=mPDF.Length;  
//字体  
strPDFMessage="BT\n/F0  "  +  fontSize  +"  Tf\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
//PDF文档实体高度  
yPos  =  pageDepth  -  pageMargin;  
strPDFMessage=pageMargin  +  "  "  +  yPos  +"  Td\n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage=  leadSize+"  TL\n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
//实体内容  
strPDFMessage=  "(http://www.wenhui.org)Tj\n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage=  "ET\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
streamEnd=mPDF.Length;  
 
streamLen=streamEnd-streamStart;  
strPDFMessage=  "endstream\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
//PDF文档的版本信息  
xRefs.Add(mPDF.Length);  
strPDFMessage="2  0  obj\n"+  streamLen  +  "\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="3  0  obj\n<</Type/Page/Parent  4  0  R/Contents  1  0  R>>\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="4  0  obj\n<</Type  /Pages  /Count  1\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="/Kids[\n3  0  R\n]\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="/Resources<</ProcSet[/PDF/Text]/Font<</F0  5  0  R>>  >>\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="/MediaBox  [  0  0  "+  pageWidth  +  "  "  +  pageDepth  +  "  ]\n>>\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="5  0  obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="6  0  obj\n<</Type/Catalog/Pages  4  0  R>>\nendobj\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
streamStart=mPDF.Length;  
strPDFMessage="xref\n0  7\n0000000000  65535  f  \n";  
for(int  i=0;i<xRefs.Count;i++)  
{  
strPDFMessage+=xRefFormatting((long)  xRefs[i])+"  00000  n  \n";  
}  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="trailer\n<<\n/Size  "+  (xRefs.Count+1)+"\n/Root  6  0  R\n>>\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
strPDFMessage="startxref\n"  +  streamStart+"\n%%EOF\n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
mPDF.WriteTo(pPDF.BaseStream);  
 
mPDF.Close();  
pPDF.Close();  
}  
}  
}

#6


水晶报表导出一下

#7


用水晶报表最快了,格式还简单;

#8


to: lijun84(李俊俊) gengwei80(唐伯虎点秋香) 都不支持中文呀。还有更好的办法吗????

#9


关注+学习!

#10


我一般是這樣做的,不知對你有沒有幫助:

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using CrystalDecisions.Web.Design;

public string Report2PDF(string report_path)     //放在共用類中
{
string pdf_file=report_path+".pdf";
string report_file=report_path+".rpt";

ReportDocument ReportDoc;
DiskFileDestinationOptions MyDiskFile;
ExportOptions ReportExportOptions;

ReportDoc=new ReportDocument();
ReportDoc.Load(report_file);
ReportDoc.Refresh();

MyDiskFile=new DiskFileDestinationOptions();
MyDiskFile.DiskFileName=pdf_file;

ReportExportOptions=new ExportOptions();
ReportExportOptions=ReportDoc.ExportOptions;

ReportExportOptions.ExportFormatType=ExportFormatType.PortableDocFormat;
ReportExportOptions.ExportDestinationType=ExportDestinationType.DiskFile;
ReportExportOptions.DestinationOptions=MyDiskFile;

ReportDoc.Export();

string ScriptStr = "<script language=JavaScript>";
ScriptStr += "window.open('" + "./"+Path.GetFileName(pdf_file)+"'";
ScriptStr+=",";
ScriptStr+="''";
//ScriptStr+=",";
//ScriptStr+="'null'";
ScriptStr+=",";
ScriptStr +="'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=0,width=790,height=545,left=0,top=0'";
ScriptStr +=")<";
ScriptStr += "/";
ScriptStr += "script>";
return ScriptStr;

}


private void Button3_Click(object sender, System.EventArgs e)
{
string path=Server.MapPath("./")+"\\product_month_print";
pdf_print(path);
}

private void pdf_print(string path_str)
{
Common_Data ws=new Common_Data();
Context.Response.ClearContent();
Context.Response.ClearHeaders();
Context.Response.ContentType = "application/pdf";
//Response.Write(Functions.ShowErrMsg("開始打印,請準備好打印紙張!!!"));

Response.Write(ws.Report2PDF(path_str));
//Response.Flush();
//Response.Close();
}

#11


请问你这是从哪引用的呀,是自己写的类库吗?还是Crystal Report 自己带的呀。Common_Data ws=new Common_Data();(谢谢您的回复)

#12


對不起我沒有說清楚:

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using CrystalDecisions.Web.Design;直接引用水晶報表

Report2PDF函數放在一個共用類(Common_Data)中,

ws=new Common_Data();產生一個類的實例


目的是其它頁面都調用Report2PDF產生PDF文件,輸出報表
不知這種方法好不好,我是這麼用的,感覺是報表比較慢,但客戶機什麼都不用

有什麼更好方法別忘記告訴我

謝謝

#13


有一个opensource的dll,我已经用他实现了很多功能,水印,中文,图片,表格,页眉页脚等,可以写到服务器硬盘,再读出来传到客户端,也可以直接写到服务器内存,response到客户端,源码及dll可以到这里下载:http://itextsharp.sourceforge.net/

#14


功能是挺强大的,但是实现客户端的操作比较麻烦,不知道 joan_lu(joan) 有没有好的实现方法呀。非常感谢。

#15


客户端的东西你可以重写一遍到pdf,就相当于把客户端的内容写到pdf了。我是这么理解的,象以前要把生成到客户端的表格导到excel一样,在服务器端重新生成一遍,只是这次是直接导出到excel,而不是到浏览器,道理是一样,不知道你的意思是不是这样。

#16


to:joan_lu(joan),我目前就是采用 iTextSharp来进行转换,具体流程,是用WebRequest从客户端URL取得客户端脚本,然后依次进行语法分析,对<Table>、<P>等转换成iTextSharp的语法,但是对于表格的嵌套时,生成的PDF格式老是调不好,和原页面不一致。还望joan_lu(joan),多多指教。如:一个大表(ParentTable)中,包含一小表(SonTable),大表中有三列,小表有6列,如何将小表插入大表单元格中。如何进行格式调整。谢谢。

#17


这个和HTML是一样的,象列合并,行合并以及表嵌套,你照HTML的做法就可以了,具体的话你可以打开它的源码table.cs里面你看过就明白怎么做了。

#18


我用下面的代码想输出pdf文件, 结果"拒绝访问报表文件":
string reportName = "ParameterField.rpt";
ReportDocument report = new ReportDocument();
report.Load(Server.MapPath(reportName));
report.Refresh();

DiskFileDestinationOptions crDiskFileDestinationOptions=new DiskFileDestinationOptions();
crDiskFileDestinationOptions.DiskFileName="ParameterField.pdf";

ExportOptions crExportOptions = new ExportOptions();
crExportOptions=report.ExportOptions ;
crExportOptions.DestinationOptions=crDiskFileDestinationOptions;
crExportOptions.ExportDestinationType =ExportDestinationType.DiskFile;
crExportOptions.ExportFormatType =ExportFormatType.PortableDocFormat;

report.Export();
//CRViewer.ReportSource = report;
//CRViewer.DataBind();
//CRViewer.Visible = true;
report.Close();

但可以显示报表?!我也修改了目录权限还是失败.真是郁闷!

#19


我也是楼上的这样的问题,如何解决呢?

#20


crDiskFileDestinationOptions.DiskFileName="ParameterField.pdf";
要加上路径,并且保证操作者(ASPNET)有写权限.

#21


学习中………………

#22


经过半个多月的努力,网页转PDF的c#组件终于开发完成,(支持中文,基于Itext的二次开发)为感谢各位的支持,将页网表格转PDF文件的代码公开,希望大家来一起完善,多提宝贵建议有兴趣的请留下MAIL地址.

#23


谢谢.jschinsh@163.net

#24


学习,jintaogentle@yahoo.com.cn

#25


学习,luxuliang@tom.com

#26


yyh88@163.com
thank you

#27


感谢了。。。。
可否给我一份???

最近正在考虑这个问题。。

dyroro@yahoo.com.cn

#28


给我一分
baikaishui2001@163.com

#29


我也学习下linpuren@126.com

#30


谢谢能不能给我一份
lei_guoliang@sohu.com

#31


楼上的各位,有收到楼主的源代码了么?
偶现在也要。。。。

不知哪位兄弟可以share一份给偶。。。。。

#32


在这我具体说一下类库的使用说明吧:
1、取得需要转PDF网页的URL,并获取网页脚本。
public string  GetWebContent(System.Uri uri)
{
string sTemp;
System.Net.WebRequest request = null;
System.Net.WebResponse response = null;
try
{
request = System.Net.WebRequest.Create(uri);
response = request.GetResponse();

System.IO.Stream stream = response.GetResponseStream();

System.IO.StreamReader reader = new System.IO.StreamReader(stream);
sTemp=(reader.ReadToEnd().ToString());
return sTemp;
}
catch(Exception de)
{
throw new Exception("", de);
}
finally
{
if (response!=null)
response.Close();
}
}
2、对网页脚本进行语法分析,获取页面内容并调用iText类库生成相应的PDF。

#33


//生成PDF文件
public  void ToPDF (string Content,string FileName)
{
string ParentStr;
ENet.IDC.ToPDF.Common  Ccomm=new ENet.IDC.ToPDF.Common();
Content=Content.ToLower().Trim();
ArrayList array=new ArrayList();
ArrayList TabString=new ArrayList();
ArrayList parentid=new ArrayList();
ArrayList tableindex=new ArrayList();

array=this.OrderTable(Content,out parentid,out tableindex);


 ParentStr=array[1].ToString() ;
string Table1=array[0].ToString();
ParentStr=System.Text.RegularExpressions.Regex.Replace(ParentStr,Table1,"|||Tab|||");


//定义PDF页面大小
Document document = new Document(PageSize.A4,50,50,50,50);
Document.compress=false;
   try
{

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FileName));
document.open();
                
   Table SonTable=PDFTable(Table1);
   Table Parent=PDFTable(ParentStr,SonTable,"|||Tab|||");
   //Table Parent=PDFTable(datatable);
       document.add(Parent);
   
   
 //  document.add(SonTable);
   document.add(datatable);
            
}
catch(Exception de)
{
throw new Exception("",de);

}
           document.close();
}

#34


谢了,学习!chaos_jn@126.com

#35


具体步骤请看源码。在这就不一一细说了。希望各位能将完善后的代码共享出来一起研究。

#36


请问能否提供VB.NET的代码呢  谢谢了
rischan@tom.com

#37


楼主,,,

正在期待你的源代码呢。

为什么我一直没有收到呢???

#38


to: pjliping(笨笨)
仁兄,看到我的发言了么?
不知道可否给一份源码给我。
我已经发过短消息给您了,您收到了么?
因为我现在也涉及到这个问题,所以才来找你了。

dyroro@yahoo.com.cn

#39


学习!chaos_jn@126.com

#40


不知道楼主看到我的呼唤了没有。。。。

喊得嗓子都哑了。。。。。。。。。。。

#41


没有办法了,只能再顶一次。。。

#42


顶!!!!
谢谢,fire_say@163.com

#43


mark

#44


水晶報表

#45


谢谢  学习   skylark_zcc@zzti.edu.cn

#46


我要一份,谢谢,jhonson13@163.com

#47


谢谢!zhangb@netstars.com.cn

#48


有没有用JAVA代码写的啊,我现在急需要一份!!!