Java下载300分辨率图片。Java修改PDF内容插入图片

如何用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>

以上只提供部分解决代码和思路,其他请自行根据业务拓展。如有更好的解决方案希望多多交流!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Java的`java.awt.image.BufferedImage`类和`javax.imageio.ImageIO`类来修改图片分辨率。下面是一个示例代码: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ModifyResolution { public static void main(String[] args) throws IOException { // 读取图片 BufferedImage image = ImageIO.read(new File("input.jpg")); // 获取原图分辨率 int originalDpiX = (int) image.getProperty("dpi_x"); int originalDpiY = (int) image.getProperty("dpi_y"); // 修改分辨率 int newDpi = 300; int newWidth = (int) (image.getWidth() * newDpi / (double) originalDpiX); int newHeight = (int) (image.getHeight() * newDpi / (double) originalDpiY); // 创建新图片 BufferedImage newImage = new BufferedImage(newWidth, newHeight, image.getType()); newImage.createGraphics().drawImage(image, 0, 0, newWidth, newHeight, null); // 设置新图片分辨率 newImage.setProperty("dpi_x", newDpi); newImage.setProperty("dpi_y", newDpi); // 保存新图片 ImageIO.write(newImage, "jpg", new File("output.jpg")); } } ``` 在上述代码,我们首先使用`ImageIO.read`方法读取了一张图片,并使用`image.getProperty`方法获取了原图的分辨率。然后,我们根据需要的分辨率和原图的分辨率计算出新图片的宽度和高度,并使用`BufferedImage`类创建了一个新的图片对象。接着,我们将原图绘制到新图片上,并使用`setProperty`方法设置了新图片分辨率。最后,我们使用`ImageIO.write`方法将新图片保存到文件。 需要注意的是,不是所有图片格式都支持设置分辨率。比如JPEG格式的图片可以设置分辨率,而PNG格式的图片则不支持设置分辨率。如果图片格式不支持设置分辨率,可以尝试使用前面提到的`ImageWriter`类来重新写入图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值