java-pdf-(itext+adobe acrobat+pdf模板)生成pdf文件

java-pdf-(itext+adobe acrobat+pdf模板)生成pdf文件


环境:
adobe acrobat :pdf 编辑器;
itext.jar : pdf 开发组件


1.制作 pdf 模板方法
1.1 使用 word 随便画一个 3*4 的表格,保存为 pdf 格式,名称为 pdf-template-form.pdf
1.2 打开 adobe acrobat 工具;(如果提示错误,右键选择以管理员方式运行试试)
1.3 选择 文件=》创建=》创建表单;
1.4 选择刚保存的“pdf-template-form.pdf”文件,并打开;
1.5 adobe acrobat 工具会在表格中自动填充一些“文本域”,默认已 “fill_” 开头;
1.6 看到有 12 个 文本域,就说明模板创建成功了,直接 ctrl+s 保存下,关闭即可;


2.用 itext 填充文本域
2.1 中文不显示问题:1>可以在编辑模板时选择一种中文字体;2>可以通过程序动态在填充前动态设置字体;
2.2 加入中文字体后文档变的很大,模板 200k,生成的文件有 6M,有待解决;


添加 maven 依赖:
			
       		
			    com.lowagie
			    itext
			    2.1.7
				



测试代码:右键 run as -> junit test,运行 fillTemplate 方法

package com.demo.preview;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;


import org.junit.Test;


import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;
import me.grass.extend.DateExtend;
import me.grass.extend.PathExtend;
import me.grass.extend.StringExtend;


/**
 *
 * @author xxj
 */
public class ITextPdfTest {
	// 利用模板生成pdf
	@Test
	public void fillTemplate() {
		// 模板路径
		String templatePath = "D:/Temp/pdf/pdf-template-form.pdf";
		// 生成的新文件路径
		String fileName = StringExtend.format("itext-template-{0}.pdf", DateExtend.getDate("yyyyMMddHHmmss"));
		String newPDFPath = PathExtend.Combine("D:/Temp/pdf/", fileName);


		PdfReader reader;
		FileOutputStream out;
		ByteArrayOutputStream bos;
		PdfStamper stamper;
		
		try {
			out = new FileOutputStream(newPDFPath);// 输出流
			reader = new PdfReader(templatePath);// 读取pdf模板
			bos = new ByteArrayOutputStream();
			stamper = new PdfStamper(reader, bos);
			AcroFields form = stamper.getAcroFields();


			//字体,使用本机的宋体
			String font_cn = getChineseFont();
			BaseFont bf = BaseFont.createFont(font_cn+",1", //注意这里有一个,1
					 BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);


			String[] str = {
					"01.hello word!", 
					"02.你好,世界!",
					"03.hello word!", 
					"04.你好,世界!",
					"05.hello word!", 
					"06.你好,世界!",
					"07.hello word!", 
					"08.你好,世界!",
					"09.hello word!", 
					"10.你好,世界!",
					"11.hello word!", 
					"12.你好,世界!", };
			int i = 0;
			java.util.Iterator it = form.getFields().keySet().iterator();
			while (it.hasNext()) {
				//获取文本域名称
				String name = it.next().toString();
				//设置文本域字体
				form.setFieldProperty(name,"textfont",bf,null);
				System.out.println(name);
				//设置文本域内容
				form.setField(name, str[i++]);
			}			
			stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
			stamper.close();


			Document doc = new Document();
			PdfCopy copy = new PdfCopy(doc, out);
			doc.open();
			PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
			copy.addPage(importPage);
			doc.close();


		} catch (IOException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (Exception e){
			e.printStackTrace();
		}


	}
	/**
	 * 获取中文字体位置
	 * @return
	 *  @author xxj 2017年4月28日
	 */
	private String getChineseFont(){


		//宋体(对应css中的 属性 font-family: SimSun; /*宋体*/)
		String font1 ="C:/Windows/Fonts/simsun.ttc";


		//判断系统类型,加载字体文件
		java.util.Properties prop = System.getProperties();
		String osName = prop.getProperty("os.name").toLowerCase();
		System.out.println(osName);
		if (osName.indexOf("linux")>-1) {
			font1="/usr/share/fonts/simsun.ttc";
		}
		if(!new File(font1).exists()){
			throw new RuntimeException("字体文件不存在,影响导出pdf中文显示!"+font1);
		}
		return font1;
	}
}






你可能感兴趣的:(java)