PDF 报表 Java 组件 iText5 中的单位注意事项
这里面涉及到这几个单位:
点(磅)(pt)、像素(px)、英寸(inch)、毫米(mm)
分辨率单位有:
dpi(点每英寸):出现于打印或印刷领域。
lpi (线每英寸):描述光学分辨率的尺度。
ppi(像素每英寸):存在于电脑显示领域。
下面举一个例子进行说明,比如:
一个图片 test.jpg 的像素是 2468*3437
Image png = Image.getInstance(imagePath); png.getWidth(); //获取到的是2468 png.getHeight(); //获取到的是3437
单位都是像素 px。
默认的度量系统大多以排版单位磅为基础得出其他单位的近似值,iText 中 PageSize 使用的单位就是“磅”,所以设置 PageSize 大小的时候需要将“像素”转化为“磅”。
换算过程是这样的:
1inch = 72pt = 25.4mm
这里按照 300ppi 的分辨率进行计算(为什么是300呢?这是我们公司规定的冲印分辨率),则图片的宽度由 px 换算为 pt 就是:
2468px / 300ppi * 72pt = 210pt
所以,应该这样获取 PageSize。
Rectangle pageSize = new Rectangle(png.getWidth()/300*72, png.getHeight()/300*72);
下面是根据我们公司需求写的代码,需求是将一个目录下的图片按照原尺寸合成为PDF文档,现在开始测试,将桌面上test目录下的图片合成为 测试版.pdf 文档:
1 package com.demo.util.iText; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 6 import com.itextpdf.text.Document; 7 import com.itextpdf.text.Image; 8 import com.itextpdf.text.PageSize; 9 import com.itextpdf.text.Rectangle; 10 import com.itextpdf.text.pdf.PdfWriter; 11 /** 12 * 13 * @author wangbo 14 * 15 */ 16 public class test { 17 18 public static void main(String[] args) { 19 20 try { 21 22 String pdfUrl = "C:\\Users\\Administrator\\Desktop\\测试版.pdf"; 23 String fileUrl = "C:/Users/Administrator/Desktop/test/"; 24 25 //建立com.itextpdf.text.Document对象的实例 26 Document doc = new Document(PageSize.A4, 0, 0, 0, 0); 27 //建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中 28 PdfWriter.getInstance(doc, new FileOutputStream(pdfUrl)); 29 //打开文档 30 doc.open(); 31 32 File file = new File(fileUrl); 33 if (file.isDirectory()) { 34 File[] list = file.listFiles(); 35 Image png = null; 36 for (File file2 : list) { 37 png = Image.getInstance(file2.getAbsolutePath()); 38 //根据图片像素设置图片的大小,单位是磅 39 png.scaleAbsolute(png.getWidth()/300*72, png.getHeight()/300*72); 40 System.out.println(png.getScaledWidth()+ "*" +png.getScaledHeight()); 41 //根据图片大小设置页面的大小 42 Rectangle pageSize = new Rectangle(png.getScaledWidth(), png.getScaledHeight()); 43 doc.setPageSize(pageSize); 44 //新加一页 45 doc.newPage(); 46 //将图片放入文档中 47 doc.add(png); 48 } 49 } 50 51 //关闭文档 52 doc.close(); 53 54 //进行pdf文件生产 55 File pdfFile = new File(pdfUrl); 56 if (pdfFile.exists()) { 57 pdfFile.createNewFile(); 58 } 59 60 } catch (Exception e) { 61 e.printStackTrace(); 62 } 63 64 } 65 66 }
补充一下:我这用的是iText5,没研究iText7,据说这两相差的还比较大,需要的jar包有:(其中的clover包生成World文档的时候能用到)
再补充一篇网上找的帮助文档:https://files.cnblogs.com/files/wbyp/iText中文教程%28含代码%29.pdf