JAVA 操作PDF裁剪白边

场景:根据模板生成对应票据pdf后,因pdf留白过多导致针式打印机打印出的文件占比过小,故需要裁剪pdf白边使之可以适配打印场景。

思路:本来想的是将pdf先转换成图片,然后对图片裁剪再转换回pdf,发现该情况会导致打印出的pdf质量变低,故改为直接裁剪pdf。下面直接贴代码。

对应依赖:

<dependency>
     <groupId>org.apache.pdfbox</groupId>
     <artifactId>pdfbox</artifactId>
     <version>3.0.0</version>
</dependency>

对应工具类:

package com.t.module.fee.util;

import cn.hutool.core.io.FileUtil;
import com.aspose.cells.PaperSizeType;
import com.aspose.cells.PdfCompliance;
import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;
import com.xtfintek.framework.security.core.util.SecurityFrameworkUtils;
import lombok.experimental.UtilityClass;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

/**
 * excel转pdf
 *
 * @author hch
 * @since 2024/06/06 11:15
 */
@UtilityClass
public class ExportUtil {

    private static final Logger log = LoggerFactory.getLogger(ExportUtil.class);

    /**
     * excel转PDF
     *
     * @param file excel文件
     * @return 字节数组
     */
    public static byte[] excelToPdfByIou(File file) {
        ByteArrayOutputStream excelToPdfOs = new ByteArrayOutputStream();
        try (BufferedInputStream inputStream = FileUtil.getInputStream(file)) {
            Workbook workbook = new Workbook(inputStream);
            // 设置纸张大小
            workbook.getSettings().setPaperSize(PaperSizeType.PAPER_15_X_11);
            // 设置PDF保存选项
            PdfSaveOptions options = new PdfSaveOptions();
            options.setPdfCompression(0);
            options.setCompliance(PdfCompliance.PDF_A_1_B);
            options.setOnePagePerSheet(true);
            // 保存为PDF到输出流
            workbook.save(excelToPdfOs, options);
            croppingPdf(excelToPdfOs);
            return excelToPdfOs.toByteArray();
        } catch (Exception e) {
            throw new RuntimeException("Error converting Excel to PDF", e);
        } finally {
            try {
                excelToPdfOs.flush();
                excelToPdfOs.close();
            } catch (IOException ignored) {
                log.error("pdf制作,文件流关闭失败");
            }

        }
    }

    /**
     * 裁剪pdf
     *
     * @param excelToPdfOs 待转换文件流
     */
    public static void croppingPdf(ByteArrayOutputStream excelToPdfOs) {
        PDDocument pdDocument;
        try {
            pdDocument = Loader.loadPDF(excelToPdfOs.toByteArray());
            PDPage page = pdDocument.getPage(0);
            PDRectangle rectangle = page.getMediaBox();
            rectangle.setUpperRightX(rectangle.getWidth() * 0.85f);
            rectangle.setUpperRightY(rectangle.getHeight());
            page.setCropBox(rectangle);
            page.setMediaBox(rectangle);
            excelToPdfOs.flush();
            pdDocument.save(excelToPdfOs);
            pdDocument.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值