需求

需要在导出PDF时,添加指定大小为 4cm × 4cm 大小的图片印章

问题

客户提供的图片由 PhotoShop 导出,尺寸大小为 4cm × 4cm ,按说使用 itext 添加到 PDF 文件时,只需要保持 100% 缩放就能保证打印出预期的效果。

	FileOutputStream outputStream = new FileOutputStream("a.pdf");
	Document document = new Document();
	PdfWriter writer = PdfWriter.getInstance(document, outputStream);
	document.open();
	writer.getDirectContent();
	Image image = Image.getInstance("stamp.png");
	image.scalePercent(100);
	document.add(image);
	document.close();

但是,实际预览时,印章大约为预期效果的两倍,已经快有半张纸的大小了
在这里插入图片描述

解决

查阅资料发现,iext 默认的 DPI(每英寸像素)为 72,而客户提供的图片尺寸虽然为 40mm × 40mm,但为了保持图像清晰,DPI 设置了 144,这也就能解释为什么印章实际预览效果为原图的两倍了。

于是,我们使用 ImagescaleAbsolute 方法,通过计算来精确设置打印大小:

	/**
	 * 每英寸的像素
	 */
	public static final float DPI = 72f;

	/**
	 * 每毫米像素(1英寸=25.4毫米)
	 */
	public static final float DPMM = DPI / 25.4f;


	public static void main(String[] args) throws IOException, DocumentException {
		FileOutputStream outputStream = new FileOutputStream("a.pdf");
		Document document = new Document();
		PdfWriter writer = PdfWriter.getInstance(document, outputStream);
		document.open();
		writer.getDirectContent();
		Image image = Image.getInstance("stamp.png");
		// 设置印章大小为 40mm × 40mm
		image.scaleAbsolute(40 * DPMM, 40 * DPMM);
		document.add(image);
		document.close();
	}

这样就得到了最终想要的 4cm × 4cm 大小
在这里插入图片描述