这段时间要搞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,合同资料分几百个字段保存在数据库里。(合同不是一整份的一个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等。
但这个做法明显不可能。
不过我建议楼主如果在WORD转PDF没找到解决办法的时候还是老老实实的直接生成PDF
原始的一个字段一个字段,最为短句、块去插,还要自己划表格填充数据好不容易做完,要是合同文本改动一下不是要重写代码?这个方法虽然一定能行,但实用性不高。肯定有办法的。这得解决,谁让PDF现在这么流行。
你可以试试在WORD中创建一个宏,也就是点一下生成PDF的那个按钮
然后你在你生成WORD后调用这个宏。
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上面都是调试通过的。希望可以给大家带来方便。 欢迎大家采用,如需转载,请注明出处。
这个方法据说是可以虚拟打印成pdf或者xps的,但是我打印成xps没问题,打印成pdf的时候就有问题了。
还有就是要改系统默认的打印机,不知道在注册表什么地方改。
http://hi.baidu.com/edwin5200/blog/item/d7eecfdeeb0c695dcdbf1a1f.html
http://seanli888.blog.51cto.com/345958/112268
但这个做法明显不可能。-------------------------如果你比较熟悉Win32API的话, 这个方法当然可能, 而且是最简单的方式. 你发送按键信息给word, 模拟操作就可以了.
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);
}
}
}
还要安装WPS的Application。不行。
这个帖子是利用office2007的一个插件来转的,我只装了2003就没试,可以试下这个啊直接写pdf估计比较够呛,还要排版呢,你word的都弄好了,感觉还是转一下比较快
用第三方组件你又不能用.那你期望怎么办?
解决了没?我也想弄虚拟打印,但弹出个界面不行。
PDF 生成RTF/DOC 的C#源码
http://download.csdn.net/source/1118317
http://download.csdn.net/source/1119071版主可以节帖了
只是不支持中文,可以的话你可以考虑将文件头改改。
因为不让转贴,所以http://seanli888.blog.51cto.com/345958/112268
我看到一个程序能读取若干个pdf,然后生成一本电子书,像平时看书一样浏览,感觉蛮不错的
我也要学习下怎么用excel了,前面下了教学视频在电脑里都发霉了