You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDF转图片再转回PDF后分辨率大幅降低的问题排查与解决方案咨询

PDF转图片再转回PDF后分辨率大幅降低的问题排查与解决方案咨询

我之前找人写了个Java程序,用来把单页36英寸高×48英寸宽的PDF切割成3个单页(尺寸分别是12×36、24×36、12×36),方便后续打印和粘贴到三折纸板上——我是做Canva模板生意的,主打科学展、毕业照片拼贴这类模板,导出的PDF都是36×48的原尺寸,切割后比直接打印大尺寸成品更便于粘贴,发货也更省心。

这个程序的运行逻辑是:先把PDF转换成图片,完成切割操作后再转回PDF格式,但现在遇到了棘手的问题——转换后的PDF分辨率下降得特别明显。

我本身不是程序员,但能在Eclipse里打开代码查看逻辑。之前查资料了解到PDFBox工具可以设置PDF转JPG时的DPI,我用AI生成的代码做了修改,但没起到改善分辨率的作用;后来我儿子建议换成无损的PNG格式来转换,我又让AI写了对应的代码,结果还是没解决问题。

我的程序一共有4个.java文件,核心的转换和切割代码都在Separate.java里,也就是我一直在修改的那个文件。

现在有两个问题想请教各位:

  1. 我要编译测试这个程序的话,是不是必须把4个.java文件都在Eclipse里打开,才能导出可运行的JAR包?
  2. 下面这段我修改后的PNG转换代码里,有没有什么明显的错误导致分辨率下降?
package abc;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.rendering.PDFRenderer;

public class Separate {
    private File file;
    private static PDDocument pdf;
    private float lefta;
    private float leftb;
    private float centrea;
    private float centreb;
    private float righta;
    private float rightb;
    private int height;

    public Separate(File f, float[] nums) {
        file = f;
        lefta = nums[0];
        leftb = nums[1];
        centrea = nums[2];
        centreb = nums[3];
        righta = nums[4];
        rightb = nums[5];
    }

    public PDDocument Divide_pdf() throws IOException {
        pdf = Loader.loadPDF(file);

        BufferedImage image = convertto_png(pdf);

        height = image.getHeight();
        List<BufferedImage> images = operate(image);

        PDDocument proc_document = convertto_pdf(images);
        pdf.close();
        return proc_document;
    }

    public BufferedImage convertto_png(PDDocument doc) throws IOException {
        PDFRenderer renderer = new PDFRenderer(doc);
        
        // Set DPI (e.g., 600 DPI) for high-resolution rendering
        int dpi = 600;
        BufferedImage img = renderer.renderImageWithDPI(0, dpi);
        return img;
    }

    public List<BufferedImage> operate(BufferedImage image) throws IOException {
        lefta = lefta * 72;
        leftb = leftb * 72;
        centrea = centrea * 72;
        centreb = centreb * 72;
        righta = righta * 72;
        rightb = rightb * 72;
        BufferedImage img1 = image.getSubimage(((int) lefta), 0, ((int) (leftb - lefta)), image.getHeight());
        BufferedImage img2 = image.getSubimage(((int) centrea), 0, (((int) centreb) - ((int) centrea)), image.getHeight());
        BufferedImage img3 = image.getSubimage(((int) righta), 0, (((int) rightb) - ((int) righta) - 1), image.getHeight());
        List<BufferedImage> images = new ArrayList<BufferedImage>();
        images.add(img1);
        images.add(img2);
        images.add(img3);
        return images;
    }

    public PDDocument convertto_pdf(List<BufferedImage> files) throws IOException {
        List<byte[]> images = new ArrayList<byte[]>();
        for (BufferedImage image : files) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            
            // Save as PNG with high quality
            ImageWriter pngWriter = ImageIO.getImageWritersByFormatName("png").next();
            ImageWriteParam pngWriteParam = pngWriter.getDefaultWriteParam();
            
            ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
            pngWriter.setOutput(ios);
            pngWriter.write(null, new javax.imageio.IIOImage(image, null, null), pngWriteParam);
            byte[] bytes = baos.toByteArray();
            images.add(bytes);
        }
        PDDocument document = new PDDocument();
        List<PDRectangle> rectangles = new ArrayList<PDRectangle>();
        PDRectangle rec = new PDRectangle(0, 0, ((int) leftb), height);
        PDRectangle rec1 = new PDRectangle(0, 0, (((int) centreb) - ((int) centrea)), height);
        PDRectangle rec2 = new PDRectangle(0, 0, (((int) rightb) - ((int) righta) - 1), height);
        rectangles.add(rec);
        rectangles.add(rec1);
        rectangles.add(rec2);
        int i = 0;
        for (byte[] f : images) {
            PDPage page = new PDPage();
            page.setMediaBox(rectangles.get(i));
            document.addPage(page);
            PDImageXObject img = PDImageXObject.createFromByteArray(document, f, "output");
            PDPageContentStream contentStream = new PDPageContentStream(document, page);
            contentStream.drawImage(img, 0, 0);
            contentStream.close();
            i++;
        }
        return document;
    }
}

效果对比示例

  • 处理前的原图:
    Example Before
  • 处理后的页面1:
    Example After pg 1
  • 处理后的页面2:
    Example After pg 2
  • 处理后的页面3:
    Example After pg 3

备注:内容来源于stack exchange,提问作者David Owens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:23:01