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里,也就是我一直在修改的那个文件。
现在有两个问题想请教各位:
- 我要编译测试这个程序的话,是不是必须把4个.java文件都在Eclipse里打开,才能导出可运行的JAR包?
- 下面这段我修改后的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; } }
效果对比示例
- 处理前的原图:

- 处理后的页面1:

- 处理后的页面2:

- 处理后的页面3:

备注:内容来源于stack exchange,提问作者David Owens
相关产品推荐
相关产品推荐

