我用的是Itextshap做的PDF,我网上找了很多例子,但是这些例子的做法都很简单。就是一张表,一个很简单的Table,把数据用FOR语句导入TABLE中,但是我要做的PDF比较复杂,有十多页,每页都是像如图下的表格,这些表格用Itextshap处理起来似乎很困难,因为要设置出如图所示的表格样式,说说很简单,做起来很难。我尝试写过,CELL属性设得很乱还是没设置出图中所示的表格。
我搜了很多,总是找不到类似C#数据库提取大量数据后转PDF文档的例子(网上的例子普遍只是初学者做简单PDF的教程,有没有能提供一个生成复杂PDF的例子也好)。我的这些PDF表格格式比较花,不像一般一张数据表一个PDF表格,那样简单多了。我尝试过用OFFICE2007有个插件可以从WORD转PDF,所以我把数据库里提取的数据按照WORD模板书签绑定的方式生成WORD文档后转PDF,在XP上可以。但是在WIN2000上由于不能装OFFICE2007,所以这种方式行不通。(建议客户把服务器升级到2003,但不太可能动服务器)。
各位有什么好主意,只要能生成PDF,什么方法都行。
或者有Itextshap高手,写个我上图的PDF表格代码。
或者能指引我用下别的DLL生成PDF的高手,我都会给你们加分
我搜了很多,总是找不到类似C#数据库提取大量数据后转PDF文档的例子(网上的例子普遍只是初学者做简单PDF的教程,有没有能提供一个生成复杂PDF的例子也好)。我的这些PDF表格格式比较花,不像一般一张数据表一个PDF表格,那样简单多了。我尝试过用OFFICE2007有个插件可以从WORD转PDF,所以我把数据库里提取的数据按照WORD模板书签绑定的方式生成WORD文档后转PDF,在XP上可以。但是在WIN2000上由于不能装OFFICE2007,所以这种方式行不通。(建议客户把服务器升级到2003,但不太可能动服务器)。
各位有什么好主意,只要能生成PDF,什么方法都行。
或者有Itextshap高手,写个我上图的PDF表格代码。
或者能指引我用下别的DLL生成PDF的高手,我都会给你们加分
我之前找到的直接写pdf文件的好象长了也不行。using System;
using System.IO;
using System.Text;
using System.Collections;namespace EBookShelf
{ 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;
private StreamWriter pPDF; public void setpPDF(string path)
{
pPDF = new StreamWriter(path);
} static MemoryStream mPDF = new MemoryStream(); public PDFGenerator(string path,string content)
{
setpPDF(path);
generator(content);
} 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;
} public void generator(string content)
{
ArrayList xRefs = new ArrayList();
//Byte[] buffer=null;
float yPos = 0f;
long streamStart = 0;
long streamEnd = 0;
long streamLen = 0;
string strPDFMessage = null;
//PDF header info
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 descirbe
streamStart = mPDF.Length;
//font
strPDFMessage = "BT\n/F0 " + fontSize + " Tf\n";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF height
yPos = pageDepth - pageMargin;
strPDFMessage = pageMargin + " " + yPos + " Td\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage = leadSize + " TL\n";
ConvertToByteAndAddtoStream(strPDFMessage); //context
strPDFMessage = "("+content+")Tj\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage = "ET\n";
ConvertToByteAndAddtoStream(strPDFMessage);
streamEnd = mPDF.Length; streamLen = streamEnd - streamStart;
strPDFMessage = "endstream\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF version info
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();
}
}
}
mykelly6 你这个代码我看看,能行不
现在这个好象就是直接按照pdf的格式在写入,我之前直接几万字的string传值进去似乎不行。。
现在你这个代码貌似只能输入String,没表格啊
之前偶就用尝试2进制写midi音乐文件,差点疯掉。。
我现在又点妥协了,用Itextshap一句一句来写,效率不是很高,但没办法。不过效果还可以。midi音乐文件引用一下外部midi音乐文件不就好了,还自己写啊。