如何用Java实现优惠券,当时有两套解决方案。一种是使用Java生成300分辨率的图片,这是打印店要求的。另外一种解决方案是生成96分辨率图片然后使用Java转成PDF文件来交给打印店进行打印。总体来说,当时打印出来的效果96(PDF)和300(PDF)的区别是不大的。考虑到使用图片,在转发过程中可能会压缩使分辨率下降问题,于是选择第二种解决方案。当时需要解决的问题是我们优惠券中一部分内容是会动态改变的,所以我们有两种解决思路,一种是动态生成我们需要的图片然后将它插入到PDF文件中。一种是在PDF模板上,然后将我们所需要的内容进行修改和添加。目前选择的是第一种解决方案。
https://pan.baidu.com/s/1Osy7kmZRnhrVo89uTlk7nQ
提取码: usw3 (使用的jar包)
生成300分辨率的图片(原图300分辨率)
public static void tiffOutput(RenderedImage image, String outputFilePath, int dpi) throws Exception {
try {
if (image != null) {
TIFFEncodeParam param = new TIFFEncodeParam();
param.setCompression(TIFFEncodeParam.COMPRESSION_NONE);
TIFFField[] extras = new TIFFField[2];
extras[0] = new TIFFField(282, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) dpi, 1}, {0, 0}});
extras[1] = new TIFFField(283, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) dpi, 1}, {0, 0}});
param.setExtraFields(extras);
File outputFile = new File(outputFilePath);
outputFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(outputFile);
TIFFImageEncoder encoder = new TIFFImageEncoder(outputStream, param);
encoder.encode(image);
outputStream.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
将图片插入到PDF中
public static void addPdfMark2(String inputPdfPath, String outPdfFile, String imgPath) throws Exception {
try {
//加载PDF文档
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile(inputPdfPath);
//加载一张图片
BufferedImage read = ImageIO.read(new File(imgPath));
PdfImage pdfImage = PdfImage.fromImage(read);
//获取第一页(水印解决方案)
PdfPageBase add = pdf.getPages().add();
pdf.getPages().remove(add);
PdfPageBase page = pdf.getPages().get(0);
//使用加载的图片替换第一页上的第一张图片
page.replaceImage(0, pdfImage);
//保存文档
pdf.saveToFile(outPdfFile);
pdf.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
集成Spring Boot导入依赖项
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai-imageio</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai-codec</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>3.11.6</version>
</dependency>
其中依赖难以导入和下载
问题1 下载不了如何处理
请在pom中添加如下代码
<repositories>
<repository>
<id>com.sun.media</id>
<url>https://software.rescarta.org/nexus/content/repositories/thirdparty/</url>
</repository>
</repositories>
id使用红色的即可,URL可能出现在蓝色框部分
问题2 下载了却导入不了类如何处理
找本地Maven下载保存依赖的地方,然后定位依赖找到该文件_remote.repositories,进行如下修改
#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
#Wed Mar 02 16:29:20 CST 2022
#spire.pdf-3.11.6.jar>com.e-iceblue=
#spire.pdf-3.11.6.pom>com.e-iceblue=
#方法一
spire.pdf-3.11.6.jar>central=
spire.pdf-3.11.6.pom>central=
#方法二
spire.pdf-3.11.6.jar>
spire.pdf-3.11.6.pom>
以上只提供部分解决代码和思路,其他请自行根据业务拓展。如有更好的解决方案希望多多交流!!!