我用的是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的高手,我都会给你们加分

解决方案 »

  1.   

    我们的项目是通过xfdf文件转换的,而不是通过WORD转PDF  相关资料你可以上网查查
      

  2.   

    呵呵,还没搞定阿。不能office2007是蛮惨的。。
    我之前找到的直接写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();
            }
        }
    }
      

  3.   

    很遗憾。我用OFFICE2007插件转换,程序已经全部写好,测试的时候才发现WIN2000不能装OFFICE2007,害我浪费一个多星期。
    mykelly6 你这个代码我看看,能行不
      

  4.   

    呵呵,这个是很郁闷的,还好我2007能用的~那个插件还是很不错的。
    现在这个好象就是直接按照pdf的格式在写入,我之前直接几万字的string传值进去似乎不行。。
      

  5.   

    插件方法是不错,很简单。
    现在你这个代码貌似只能输入String,没表格啊
      

  6.   

    呵呵,我发这个只是说有没有可能自己研究下pdf格式来写~
    之前偶就用尝试2进制写midi音乐文件,差点疯掉。。
      

  7.   

    我已经花了不少时间,我本来尝试用2进制来转,花时间下去了,要是没结果后果会很严重。
    我现在又点妥协了,用Itextshap一句一句来写,效率不是很高,但没办法。不过效果还可以。midi音乐文件引用一下外部midi音乐文件不就好了,还自己写啊。
      

  8.   

    呵呵,是在手机上做音序器,模拟钢琴,安了button就要生成midi音乐。。