可以使用虚拟打印机来处理:
方法一:使用虚拟打印机pdf factory即可,而且其他格式文件只要是能够打印,选择这个虚拟打印机,都可以做成PDF文件,很简单实用;
方法二:用其他虚拟打印机转成PDF文件。
方法三:使用专门的转换软件,把文件转成PDF文件。
请参考:http://blogcsdnnet/ptzrbin/article/details/43449701
主要原理:
使用 poi 将word转换成 html
使用IText 将html转换成pdf(由于html中所有标签都必须要闭合,才能使用IText,所以这里用jsoup对html进行转换)
缺点: 会有失真问题,另外涉及到中文编码问题
public void GenerateAllParts() {
Document document = new Document();
try {
PdfWritergetInstance(document, new FileOutputStream("d:\\allpdf"));
// 生成字体
BaseFont bfChinese = BaseFontcreateFont("STSongStd-Light", "UniGB-UCS2-H", false);
// 标题字体
Font f30 = new Font(bfChinese, 30, FontNORMAL, ColorBLACK);
// 正文字体
Font f12 = new Font(bfChinese, 12, FontNORMAL, ColorBLACK);
Font f6 = new Font(bfChinese, 6, FontNORMAL, ColorBLACK);
Font f8 = new Font(bfChinese, 8, FontNORMAL, ColorBLACK);
documentopen();
// 标题
documentadd(new Paragraph("报表实例", f30));
// 换行
documentadd(new Chunk("\n\n"));
//
documentadd(
new Paragraph(
new Chunk("报表", f12)
setLocalGoto("table")));
// 换行
documentadd(new Chunk("\n\n"));
documentadd(
new Paragraph(
new Chunk("", f12)
setLocalGoto("image")));
documentadd(new Chunk("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"));
///////////////////////////////////////////////////
// 报表位置
documentadd(new Chunk("报表实例", f12)setLocalDestination("table"));
// 添加table实例
PdfPTable table = new PdfPTable(5);
tablesetWidthPercentage(100);
tablesetHorizontalAlignment(PdfPTableALIGN_LEFT);
PdfPCell cell = new PdfPCell();
cellsetBackgroundColor(new Color(213, 141, 69));
cellsetHorizontalAlignment(PdfPCellALIGN_CENTER);
// 表格标题
cellsetPhrase(new Paragraph("标题一", f8));
tableaddCell(cell);
cellsetPhrase(new Paragraph("标题二", f8));
tableaddCell(cell);
cellsetPhrase(new Paragraph("标题三", f8));
tableaddCell(cell);
cellsetPhrase(new Paragraph("标题四", f8));
tableaddCell(cell);
cellsetPhrase(new Paragraph("标题五", f8));
tableaddCell(cell);
// 表格数据
PdfPCell newcell = new PdfPCell();
newcellsetHorizontalAlignment(PdfPCellALIGN_CENTER);
newcellsetPhrase(new Paragraph("数据一", f8));
tableaddCell(newcell);
newcellsetPhrase(new Paragraph("数据二", f8));
tableaddCell(newcell);
newcellsetPhrase(new Paragraph("数据三", f8));
tableaddCell(newcell);
newcellsetPhrase(new Paragraph("数据四", f8));
tableaddCell(newcell);
newcellsetPhrase(new Paragraph("数据五", f8));
tableaddCell(newcell);
documentadd(table);
////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// 添加连接
documentadd(new Chunk("实例", f12)setLocalDestination("image"));
Image jpg = ImagegetInstance("d:\\3jpg");
documentadd(jpg);
//////////////////////////////////////////////////////////
documentclose();
} catch (Exception e) {
// TODO: handle exception
}
}
场景:我们经常会需要用代码生成pdf文件,涉及到复杂的内容也可以选用先自己制作pdf模板,再用代码去读取,动态数据部分的内容无法用模板实现的就要用Java代码去实现
需求:生成如下的pdf
具体是这样的,我们现在在开发一个项目,其中有个功能是将用户填写的报表在线生成pdf下载,是通过流直接输出到用户的电脑里,服务器上不会存在生成的pdf文件,但是现在有一个问题,因为pdf文件页数是不确定的,所以在每一页加水印现在无法实现,请问怎样弄才能实现这一功能?我之前的思路是这样的,在生成pdf的java代码最后加个循环,通过得到document的页数然后用pdfContentByte在每一页加水印,但是我没找到可以定位到第几页的方法。部分代码:JavacoderesponsesetContentType( ext/html;charset=GBK);responsesetContentType(application/pdf);responsesetHeader(Content-Disposition
返回值:ByteArrayOutputStream
这种方法适用于PDF模板中的变量不多的情况,如果变量过多使用也不是很方便(编辑PDF模板推荐使用Adobe Acrobat Pro软件)。
检查下有没有documentnewPage()使得把数据放到下一页了。
如果没有,那就需要分析代码。但是换种思路也能解决你问题:
把数据作为附件一,附件二等形式生成在pdf的最后,那样就没人关注pdf内容的空白了。
用iText生成PDF文档需要5个步骤:
①建立comlowagietextDocument对象的实例。
Document document = new Document();
②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
PDFWritergetInstance(document, new FileOutputStream("HelloworldPDF"));
③打开文档。
documentopen();
④向文档中添加内容。
documentadd(new Paragraph("Hello World"));
⑤关闭文档。
documentclose();
通过上面的5个步骤,就能产生一个HelloworldPDF的文件,文件内容为"Hello World"。
建立comlowagietextDocument对象的实例
comlowagietextDocument对象的构建函数有三个,分别是:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
可以用表格布局
BaseFont bf = BaseFontcreateFont( "STSong-Light", "UniGB-UCS2-H", false, false, null, null);
Font fontChinese5 = new Font(bf,8);
PdfPTable table1 = new PdfPTable(2); //表格两列
table1setHorizontalAlignment(ElementALIGN_CENTER); //垂直居中
table1setWidthPercentage(100);//表格的宽度为100%
float[] wid1 ={075f,025f}; //两列宽度的比例
table1setWidths(wid1);
table1getDefaultCell()setBorderWidth(0); //不显示边框
PdfPCell cell11 = new PdfPCell(new Paragraph("SilkRoad24 GmbH",fontChinese5)); table1addCell(cell11);
String imagepath = "D:\\wl\\logopng";
Image image = ImagegetInstance(imagepath);
table1addCell(image);
documentadd(table1);//增加到文档中
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)