这段时间要搞PDF制作一个合同。
要求是这样的:
1,合同资料分几百个字段保存在数据库里。(合同不是一整份的一个TEXT字段)。
2,用户点一下生成按钮,合同就会把这些从数据库里取出来的几百的字段转化成一份有格式的PDF合同文档。不能出现别的窗口,就是点一下生成。我用的是Itextshap这个dll。大家也不用和我发这个dll的使用方法的URL链接。
因为,我也看了这个Itextshap主页的使用说明了,研究半星期了,大致都了解。我要制作的合同PDF,有表格段、落还有各种字体段落样式。合同的数据保存在数据库里,取出来有几百个字段(合同都是保存字段的,不是一整份的)
而用Itextshap不可能一个字段一个字段作为短句插到PDF的Page上去,这样一份长达20页的合同制作完要很长时间。
所以这个原始的方法不行。(所以不要发那种怎么制作PDF的最简单的那种例子代码)。得改。要高效率。
我第一个思路是,先几百个字段取出来,按照WORD模板(书签绑定字段)得到合同的WORD文档,然后WORD转PDF。但是我WORD转PDF,不会转。Itextshap的说明上也没提到这点(谁有这个代码请贴)。这个看来很难实现,因为我在网上已经搜了一个早上word转PDF都没找到。只找到个ASP。net调用JS。大家说怎么做高效。或者说,帮我找找word转PDF的方法。当然我不希望别第三方插件,收钱的Dll等。

解决方案 »

  1.   

    另外,在安装了最新的PDF阅读程序后,可以在word菜单上直接生成PDF。
    但这个做法明显不可能。
      

  2.   

    还有一条思路是走PDF虚拟打印机的思路,不过我还没足够的资料。谁熟悉谁贴代码。谢了
      

  3.   

    ItextSharp好像在其说明书的最后某个部分说了它不提供从WORD转PDF的功能(也许是记错了,可能是不提供从PDF转WORD的功能)
    不过我建议楼主如果在WORD转PDF没找到解决办法的时候还是老老实实的直接生成PDF
      

  4.   

    4L谢谢你。
    原始的一个字段一个字段,最为短句、块去插,还要自己划表格填充数据好不容易做完,要是合同文本改动一下不是要重写代码?这个方法虽然一定能行,但实用性不高。肯定有办法的。这得解决,谁让PDF现在这么流行。
      

  5.   

    其实,这个问题很简单。就是怎么制作一个PDF。当然,做一个PDF很容易。但是,你要制作要高效,当然转化过程也要高效。为后期提供方便。就这样。
      

  6.   

    我有种办法不知道可否,既然你说安装了WORD和最新的PDF阅览器后会在WORD工具栏上出现生成PDF的按钮。
    你可以试试在WORD中创建一个宏,也就是点一下生成PDF的那个按钮
    然后你在你生成WORD后调用这个宏。
      

  7.   

     iText简介  iText是一个开放源码的Java类库,可以用来方便地生成PDF文件。大家通过访问http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948下载最新版本的类库,下载完成之后会得到一个.jar包,把这个包加入JDK的classpath即可使用。如果生成的PDF文件中需要出现中文、日文、韩文字符,则还需要通过访问http://itext.sourceforge.net/downloads/iTextAsian.jar下载iTextAsian.jar包。  关于iText类库的使用,http://www.lowagie.com/iText/tutorial/index.html有比较详细的教程。该教程从入门开始,比较系统地介绍了在PDF文件中放入文字、图片、表格等的方法和技巧。读完这片教程,大致就可以做一些从简单到复杂的PDF文件了。不过,试图通过教程解决在生成PDF文件过程中遇到的所有困难无疑是一种奢望。所以,阅读iText的api文档显得非常重要。读者在下载类库的同时,也可以下载类库的文档。  如何利用iText在java程序中生成PDF报表  以下是上述教程中一个最简单的例子,这个例子刻画了通过iText生成PDF文件的一般程序框架。读者只需要在document.open();和document.close();两条语句中间加入自己希望放在PDF文件中的内容即可。该例子只在PDF文件中加了“Hello World“一行文字。
    Document document = new Document();try{ PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf")); document.open(); document.add(new Paragraph("Hello World"));}catch(DocumentException de){ System.err.println(de.getMessage());}catch(IOException ioe){ System.err.println(ioe.getMessage());}document.close();  由以上的例子可见,程序的框架十分清楚明了。然而在PDF中指定文字、图画、表格的位置是一件非常麻烦的事情。除了不断地在程序中修改位置、然后运行程序、生成PDF文件、观察元素在PDF中的位置是否合理这样的过程以外,似乎还没有其它更好的方法。  如何通过JSP生成PDF报表  这一部分是在iText的教程中所没有的,网上的相关资料也比较少。我曾在CSDN上看过有人开帖询问实现细节,有人回复了实现的原理:先在服务器上生成PDF文件,然后用户通过点击指向PDF文件的超链接选择下载或打开。这是一个思路,或者说是思路之一。本文实现了这个思路,又给出另外一个思路并通过两种途径实现之。  1)直接在服务器上生成PDF文件。<%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%><% String filename = "PDF"+(new Random()).nextInt()+".pdf" ; Document document = new Document(PageSize.A4); ServletOutputStream out1 = response.getOutputStream(); try {  PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename) );  document.open();  document.add(new Paragraph("Hello World"));  document.close(); } catch(Exception e){}%>  上面的程序在服务器上生成了一个静态的PDF文件。显然,每次运行所得的PDF文件的名称应该是独一无二不能有重的。本程序通过随机函数来命名生成的PDF文件。本程序的缺点就是,每次运行都会在服务器上产生一个PDF文件,如果不及时删除,数量会越来越大,这显然是站点维护者所不愿意看到的。  2)将PDF文件通过流的形式输送到客户端的缓存。这样做的好处是不会在服务器上留下任何“遗迹”。  i)直接通过JSP页面生成<%@page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%><% response.setContentType( "application/pdf" ); Document document = new Document(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); PdfWriter writer=PdfWriter.getInstance( document, buffer ); document.open(); document.add(new Paragraph("Hello World")); document.close(); DataOutput output = new DataOutputStream( response.getOutputStream() ); byte[] bytes = buffer.toByteArray(); response.setContentLength(bytes.length); for( int i = 0; i < bytes.length; i++ ) {  output.writeByte( bytes[i] ); }%>  ii)通过Servlet生成import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import com.lowagie.text.*;import com.lowagie.text.pdf.*;public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {  Document document = new Document(PageSize.A4, 36,36,36,36);  ByteArrayOutputStream ba = new ByteArrayOutputStream();  try  {   PdfWriter writer = PdfWriter.getInstance(document, ba);   document.open();   document.add(new Paragraph("Hello World"));  }  catch(DocumentException de)  {   de.printStackTrace();   System.err.println("A Document error:" +de.getMessage());  }  document.close();  response.setContentType("application/pdf");  response.setContentLength(ba.size());  ServletOutputStream out = response.getOutputStream();  ba.writeTo(out);  out.flush(); }
      结束  我在项目中采用的是第二种方法。本文的源码在我的tomcat4上面都是调试通过的。希望可以给大家带来方便。  欢迎大家采用,如需转载,请注明出处。
      

  8.   

    我也在研究这个问题。
    这个方法据说是可以虚拟打印成pdf或者xps的,但是我打印成xps没问题,打印成pdf的时候就有问题了。
    还有就是要改系统默认的打印机,不知道在注册表什么地方改。
    http://hi.baidu.com/edwin5200/blog/item/d7eecfdeeb0c695dcdbf1a1f.html
    http://seanli888.blog.51cto.com/345958/112268
      

  9.   

    另外,在安装了最新的PDF阅读程序后,可以在word菜单上直接生成PDF。
    但这个做法明显不可能。-------------------------如果你比较熟悉Win32API的话, 这个方法当然可能, 而且是最简单的方式. 你发送按键信息给word, 模拟操作就可以了.
      

  10.   

    我记得最新版的WPS可以进行word和pdf的转换, 你可以查阅下它也有没有提供相应COM.
      

  11.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection;namespace CShapeWpsToPdf
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                object WpsApp;
                object[] args = new object[1];
                Type wpsAppName;
                string progID = "Wps.Application";
                wpsAppName = Type.GetTypeFromProgID(progID);            //创建一个WPS实例
                WpsApp = Activator.CreateInstance(wpsAppName);
                args[0] = true;            //设置为可见
                wpsAppName.InvokeMember("Visible", BindingFlags.SetProperty, null, WpsApp, args);            //得到Documents对象
                Object wpsDocs = wpsAppName.InvokeMember("Documents", BindingFlags.GetProperty, null, WpsApp, null);
                args = new object[15];
                args[0] = @"C:\Demo.wps";
                args[11] = true;            //打开C盘下的Demo.wps
                Object wpsDoc = wpsAppName.InvokeMember("Open", BindingFlags.InvokeMethod, null, wpsDocs, args);
                args = new object[3];            //生成PDF
                args[0] = @"C:\Demo.pdf";
                wpsAppName.InvokeMember("ExportPdf", BindingFlags.InvokeMethod, null, wpsDoc, args);
            }
        }
    }
      

  12.   

    还有个办法用convert2pdf多给点分,谢谢
      

  13.   

    convert2pdf 还可以,不妨试试看
      

  14.   

    C#实现的word转PDF程序,需要先安装Acrobat Profession.装这个是要收钱的吧?
      

  15.   

    这个代码是从WPS转PDF啊
    还要安装WPS的Application。不行。
      

  16.   

    还有没有别的思路,把这几百个字段搞成PDF啊解除我加分。我开小号也要加分。(虽然这个大号也是贫农)
      

  17.   

    http://seanli888.blog.51cto.com/345958/112268
    这个帖子是利用office2007的一个插件来转的,我只装了2003就没试,可以试下这个啊直接写pdf估计比较够呛,还要排版呢,你word的都弄好了,感觉还是转一下比较快
      

  18.   

    你的问题很奇怪, 用iTextSharp写你觉得太麻烦.
    用第三方组件你又不能用.那你期望怎么办?
      

  19.   

    mykelly6我搜到你也有类似WORD转PDF一个帖子,你用虚拟打印的吧?
    解决了没?我也想弄虚拟打印,但弹出个界面不行。
      

  20.   

    兄弟,你有尝试过用Itext一个一个字段添加排版吗?况且不说后期要是改动合同内容,你就不得不修改原代码。而模板做,是最好的了。只是没有好的转换方法。
      

  21.   

    虚拟打印的会出现“正在打印第x页“的字样吧基本不影响使用。我用“adobe PDF”来打印好像有问题。我就把代码里面那个.xps换成了.pdf,不知道是不是哪里还要改,但是原作者没说,只是说“同样,如果系统安装了PDF虚拟打印机,如5D PDF之类的,我们也可以将其设置为默认打印机以达到转换为PDF格式的目的”。另外那个利用office2007来保存的你可以试试阿
      

  22.   

    用Itextsharp,对格式比较花的表很痛苦!顶楼主,大家有什么好方法没
      

  23.   

    有找到一个办法:
    PDF 生成RTF/DOC 的C#源码
    http://download.csdn.net/source/1118317
      

  24.   

    用iTextSharp生成PDF文件 C#源码
    http://download.csdn.net/source/1119071版主可以节帖了
      

  25.   

    using System;using System.IO;using System.Text;using System.Collections; namespace PDFGenerator{    /// <summary>    /// Application : Generation of PDF file from text    /// Author        : Pramod Kumar Singh    /// Date        : 25th July 2001    ///</summary>           public class PDFGenerator    {        static float pageWidth = 594.0f;        static float pageDepth = 828.0f;        static float pageMargin = 30.0f;        static float fontSize = 10.0f;        static float leadSize = 10.0f;               //Create a PDF file.        //PDF on Disk        static StreamWriter pPDF=new StreamWriter("F:\\Temp\\myPDF.pdf");        //PDF in Memory        static MemoryStream mPDF= new MemoryStream();               //Convert the Text Data to PDF format and write back to        //Memory Stream        static void ConvertToByteAndAddtoStream(string strMsg)        {            Byte[] buffer=null;            buffer=ASCIIEncoding.ASCII.GetBytes(strMsg);            mPDF.Write(buffer,0,buffer.Length);             buffer=null;        }               //Format the data length in xRef Format        static string xRefFormatting(long xValue)        {            string strMsg =xValue.ToString();            int iLen=strMsg.Length;            if (iLen<10)            {                StringBuilder s=new StringBuilder();                //string s=null;                int i=10-iLen;                s.Append('0',i);                strMsg=s.ToString() + strMsg;            }            return strMsg;        }         //Entry Point        static void Main(string[] args)        {            //Create a ArrayList for xRefs of PDF Document            ArrayList xRefs=new ArrayList();            Byte[] buffer=null;            float yPos =0f;            long streamStart=0;            long streamEnd=0;            long streamLen =0;            string strPDFMessage=null;            //PDF Header Message            strPDFMessage="%PDF-1.1\n";            ConvertToByteAndAddtoStream(strPDFMessage);                       //ID 1 For Containt            //ID 2 For Length of the Stream            //write the Text                       //1> Start a new Page            xRefs.Add(mPDF.Length);            strPDFMessage="1 0 obj\n";            ConvertToByteAndAddtoStream(strPDFMessage);            strPDFMessage="<< /Length 2 0 R >>\n";            ConvertToByteAndAddtoStream(strPDFMessage);            strPDFMessage="stream\n";            ConvertToByteAndAddtoStream(strPDFMessage);                       //Get the start of the stream            streamStart=mPDF.Length;            strPDFMessage="BT\n/F0 " + fontSize +" Tf\n";            ConvertToByteAndAddtoStream(strPDFMessage);            yPos = pageDepth - pageMargin;            strPDFMessage=pageMargin + " " + yPos +" Td\n" ;            ConvertToByteAndAddtoStream(strPDFMessage);            strPDFMessage= leadSize+" TL\n" ;            ConvertToByteAndAddtoStream(strPDFMessage);                       //Add the text data to the PDF memory stream            strPDFMessage= "(Pramod Kumar Singh)Tj\n" ;            ConvertToByteAndAddtoStream(strPDFMessage);            strPDFMessage= "ET\n";            ConvertToByteAndAddtoStream(strPDFMessage);            //Get the End of the stream            streamEnd=mPDF.Length;            //Get the Length of the stream            streamLen=streamEnd-streamStart;            strPDFMessage= "endstream\nendobj\n";            ConvertToByteAndAddtoStream(strPDFMessage);                               //Add 2 object to xRef            xRefs.Add(mPDF.Length);            strPDFMessage="2 0 obj\n"+ streamLen + "\nendobj\n";            ConvertToByteAndAddtoStream(strPDFMessage);                                   //Add Page to xRefs            xRefs.Add(mPDF.Length);            strPDFMessage="3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";            ConvertToByteAndAddtoStream(strPDFMessage);                       //Build the Pages            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);                       //Add font to xRefs            xRefs.Add(mPDF.Length);            strPDFMessage="5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";            ConvertToByteAndAddtoStream(strPDFMessage);                               //Add the catalog to xRefs            xRefs.Add(mPDF.Length);            strPDFMessage="6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";            ConvertToByteAndAddtoStream(strPDFMessage);                                   //xRefs Entry            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);            //Trailer for the PDF            strPDFMessage="trailer\n<<\n/Size "+ (xRefs.Count+1)+"\n/Root 6 0 R\n>>\n";            ConvertToByteAndAddtoStream(strPDFMessage);            //xRef location entry            strPDFMessage="startxref\n" + streamStart+"\n%%EOF\n";            ConvertToByteAndAddtoStream(strPDFMessage);            //Write the PDF from Memory Stream to File Stream            mPDF.WriteTo(pPDF.BaseStream);            //Close the Stream            mPDF.Close();            pPDF.Close();        }    }}
    只是不支持中文,可以的话你可以考虑将文件头改改。
      

  26.   

    我装了office2007和那个add_in插件,可以把word文档转化成pdf了,lz可以试试。
    因为不让转贴,所以http://seanli888.blog.51cto.com/345958/112268 
      

  27.   

    随着PDF跨平台的优势,占据OFFICE。我想这种制作PDF的技术每个人应该都会。等我把现在的模块写完了,我会一个一个试验代码,直到满意的结果。通过这几天对PDF这种复杂的制作,以及不同类型之间转换的研究,我对这种文档类型的制作有了很大的进步。但是,至今没有解决现在的问题。可能楼上有解决问题的了,我会试一下。用过这个帖子,我也希望大家通过这个集中讨论相互交换了自己知道的知识。谢谢大家,这个帖子这么多天没沉。也感谢机会关注此贴的人们。我希望对于1L这个问题,有更好的解决方法。现在似乎都在解决怎么从WORD转PDF。呵呵。看来我原来的思路还不错。
      

  28.   

    现在pdf真的很流行阿,微软的xps好像很少被提起~
    我看到一个程序能读取若干个pdf,然后生成一本电子书,像平时看书一样浏览,感觉蛮不错的
      

  29.   

    word,excel用了这么多年,对排版设计很多人都用的出神入化了,所以先生成word也不错啊
    我也要学习下怎么用excel了,前面下了教学视频在电脑里都发霉了
      

  30.   

    终于忙完了现在的模块,回到PDF,mykelly6你那个2007装插件方法的效果能让我看看吗或着能QQ聊吗我饿721243523