java web 框架 pdf_javaWeb项目springMVC框架下利用ITextpdf 工具打印PDF文件的方法(打印表单、插入图片)...

方法一:打印PDF表单以及在PDF中加入图片

需要的资料:

jar包:iTextAsian.jar ,itext-2.1.7.jar;

源码:

1 public static void main(String args[]) throwsIOException, DocumentException {2 String fileName = "D:/testPDF.pdf"; //pdf模板

3 InputStream input = new FileInputStream(newFile(fileName));4 PdfReader reader = newPdfReader(input);5 PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("D:/contract.pdf"));6 AcroFields form =stamper.getAcroFields();7 fillData(form, data());8 stamper.setFormFlattening(true);9 Image image = Image.getInstance("D:/testPhoto.jpg");10 image.scaleToFit(100, 125);11 PdfContentByte content=null;12 int pageCount=reader.getNumberOfPages();//获取PDF页数

13 System.out.println("pageCount="+pageCount);14 content =stamper.getOverContent(pageCount);15 image.setAbsolutePosition(100, 700);16 content.addImage(image);17 stamper.close();18 reader.close();19 }20

21 public static void fillData(AcroFields fields, Map data) throwsIOException, DocumentException {22 for(String key : data.keySet()) {23 String value =data.get(key);24 System.out.println(key+"= "+fields.getField(key)+" value="+value);25 fields.setField(key, value);26 }27 }28

29 public static Mapdata() {30 Map data = new HashMap();31 data.put("trueName", "xxxxxx");32 data.put("idCard", "xxxxxx");33 data.put("userName", "xxxx");34 data.put("address", "12");35 data.put("telephone", "123456");36 data.put("signName","xxx");37 returndata;38 }

注意以上引入的包一定是一下的方式,否则PDF表单中的字段不能赋值

//AcroFields

importcom.lowagie.text.DocumentException;importcom.lowagie.text.Image;importcom.lowagie.text.pdf.AcroFields;importcom.lowagie.text.pdf.AcroFields.Item;importcom.lowagie.text.pdf.PdfContentByte;importcom.lowagie.text.pdf.PdfReader;import com.lowagie.text.pdf.PdfStamper;

制作PDF表单:

利用工具Adobe Acrobat制作PDF表单

e8c819db96b2902ac63587b4f4a32452.png

将制作好的表单保存到:D:/testPDF.pdf,这样点击运行代码会根据设置的字段添加对应的值。

adac703be674154e731badbac12d4ff4.png

注意:此方法中还包含怎样将图片随pdf打印出来,因为jar的原因,此种方法只能获得pdf的页数,不能获得某一个字段的具体位置,因此只能将其的位置初始化。

源码:

置于插入图片:还有一种能获取具体某一个字段的具体位置的方法,但是因为引入jar包的原因不能保证既满足读取pdf获取具体位置又能将PDF表单赋值

1 //模板文件路径

2 String templatePath = "template.pdf";3 //生成的文件路径

4 String targetPath = "target.pdf";5 //书签名

6 String fieldName = "field";7 //图片路径

8 String imagePath = "image.jpg";9

10 //读取模板文件

11 InputStream input = new FileInputStream(newFile(templatePath));12 PdfReader reader = newPdfReader(input);13 PdfStamper stamper = new PdfStamper(reader, newFileOutputStream(targetPath));14 //提取pdf中的表单

15 AcroFields form =stamper.getAcroFields();16 form.addSubstitutionFont(BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));17

18 //通过域名获取所在页和坐标,左下角为起点

19 int pageNo = form.getFieldPositions(fieldName).get(0).page;20 Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;21 float x =signRect.getLeft();22 float y =signRect.getBottom();23

24 //读图片

25 Image image =Image.getInstance(imagePath);26 //获取操作的页面

27 PdfContentByte under =stamper.getOverContent(pageNo);28 //根据域的大小缩放图片

29 image.scaleToFit(signRect.getWidth(), signRect.getHeight());30 //添加图片

31 image.setAbsolutePosition(x, y);32 under.addImage(image);33

34 stamper.close();35 reader.close();

但引入的包:

importcom.itextpdf.text.Document;importcom.itextpdf.text.DocumentException;importcom.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerHelper;

只有这样以下方法才可用:

Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;

方法二:将html页面打印成PDF

此种方法需要引入的jar包:itextpdf-5.3.2.jar, xmlworker-5.5.3。(注意:如果xmlworker版本不对会报:java.lang.NoSuchMethodError: com.itextpdf.tool.xml.html.pdfelement.NoNewLineParagraph.setMultipliedLeading(F)V )

源码:

importcom.itextpdf.text.Document;importcom.itextpdf.text.DocumentException;importcom.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerHelper;

public static final String HTML = "D:/template.html";public static final String DEST = "D:/helo.pdf";public void createPdf(String file) throwsIOException, DocumentException {//step 1

Document document = newDocument();//step 2

PdfWriter writer = PdfWriter.getInstance(document, newFileOutputStream(file));//step 3

document.open();//step 4

XMLWorkerHelper.getInstance().parseXHtml(writer, document,new FileInputStream(HTML), Charset.forName("UTF-8"));//step 5

document.close();

}public static void main(String[] args) throwsIOException, DocumentException {

File file= newFile(DEST);

file.getParentFile().mkdirs();newTestPdf().createPdf(DEST);

}

测试中文字体:

在网上找到一篇资料:

直接上源码:http://www.bubuko.com/infodetail-1301851.html

public void fillTemplate(){//利用模板生成pdf//模板路径

String templatePath = "pdfFolder/template_demo.pdf";//生成的新文件路径

String newPDFPath = "pdfFolder/newPdf.pdf";

PdfReader reader;

FileOutputStream out;

ByteArrayOutputStream bos;

PdfStamper stamper;try{

out= new FileOutputStream(newPDFPath);//输出流

reader = new PdfReader(templatePath);//读取pdf模板

bos = newByteArrayOutputStream();

stamper= newPdfStamper(reader, bos);

AcroFields form=stamper.getAcroFields();

String[] str= {"123456789","小鲁","男","1994-00-00","130222111133338888","河北省唐山市"};int i = 0;

java.util.Iterator it =form.getFields().keySet().iterator();while(it.hasNext()){

String name=it.next().toString();

System.out.println(name);

form.setField(name, str[i++]);

}

stamper.setFormFlattening(true);//如果为false那么生成的PDF文件还能编辑,一定要设为true

stamper.close();

Document doc= newDocument();

PdfCopy copy= newPdfCopy(doc, out);

doc.open();

PdfImportedPage importPage=copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);

copy.addPage(importPage);

doc.close();

}catch(IOException e) {

System.out.println(1);

}catch(DocumentException e) {

System.out.println(2);

}

}

输出英文:没问题!

1 public void test1(){//生成pdf

2 Document document = newDocument();3 try{4 PdfWriter.getInstance(document, new FileOutputStream("pdfFolder/1.pdf"));5document.open();6 document.add(new Paragraph("hello word"));7document.close();8 } catch (FileNotFoundException |DocumentException e) {9 System.out.println("file create exception");10}11 }

可是如果要输出中文呢,上面这个就不行了,就要用到语言包了

最新亚洲语言包:http://sourceforge.net/projects/itext/files/extrajars/

pdf显示中文:

1 public voidtest1_1(){2BaseFont bf;3 Font font = null;4 try{5 bf = BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H",6 BaseFont.NOT_EMBEDDED);//创建字体

7 font = new Font(bf,12);//使用字体

8 } catch (DocumentException |IOException e) {9e.printStackTrace();10}11 Document document = newDocument();12 try{13 PdfWriter.getInstance(document, new FileOutputStream("pdfFolder/2.pdf"));14document.open();15 document.add(new Paragraph("hello word 你好 世界",font));//引用字体

16document.close();17 } catch (FileNotFoundException |DocumentException e) {18 System.out.println("file create exception");19}20 }

另外一种方法:我不用第三方语言包:

我是在工程目录里面新建了一个字体文件夹Font,然后把宋体的字体文件拷贝到这个文件夹里面了

上程序:

1 public voidtest1_2(){2BaseFont bf;3 Font font = null;4 try{5 bf = BaseFont.createFont("Font/simsun.ttc,1", //注意这里有一个,1

6BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);7 font = new Font(bf,12);8 } catch (DocumentException |IOException e) {9e.printStackTrace();10}11 Document document = newDocument();12 try{13 PdfWriter.getInstance(document, new FileOutputStream("pdfFolder/3.pdf"));14document.open();15 document.add(new Paragraph("使用中文另外一种方法",font));16document.close();17 } catch (FileNotFoundException |DocumentException e) {18 System.out.println("file create exception");19}20 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值