当前位置: 首页 > 面试题库 >

将PDF页面导出为Java中的一系列图像

东郭赞
2023-03-14
问题内容

我需要将任意PDF文档的页面导出为jpeg / png / etc格式的一系列单个图像。我需要用Java做到这一点。

尽管我确实了解iText,PDFBox和其他各种Java pdf库,但我希望找到一些工作示例或操作方法的指针。

谢谢。


问题答案:

这是一种实现方法,它结合了Web上的一些代码片段。

如何将PDF绘制到图像中?

https://pdf-
renderer.dev.java.net/examples.html

从图像创建缓冲图像

原文:http :
//www.exampledepot.com/egs/java.awt.image/Image2Buf.html

更新:如何将缓冲的图像转换为图像,反之亦然?

将生成的图形保存到PNG或JPEG文件

原文:http :
//www.exampledepot.com/egs/javax.imageio/Graphic2File.html

更新:http :
//docs.oracle.com/javase/tutorial/2d/images/saveimage.html

组合成类似这样的东西,可以将所有页面变成图像:

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Transparency;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import javax.swing.*;
import javax.imageio.*;
import java.awt.image.*;

public class ImageMain {
    public static void setup() throws IOException {
        // load a pdf from a byte buffer
        File file = new File("test.pdf");
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
        PDFFile pdffile = new PDFFile(buf);
        int numPgs = pdffile.getNumPages();
        for (int i = 0; i < numPgs; i++) {
            // draw the first page to an image
            PDFPage page = pdffile.getPage(i);
            // get the width and height for the doc at the default zoom
            Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
            // generate the image
            Image img = page.getImage(rect.width, rect.height, // width & height
                    rect, // clip rect
                    null, // null for the ImageObserver
                    true, // fill background with white
                    true // block until drawing is done
                    );
            // save it as a file
            BufferedImage bImg = toBufferedImage(img);
            File yourImageFile = new File("page_" + i + ".png");
            ImageIO.write(bImg, "png", yourImageFile);
        }
    }

    // This method returns a buffered image with the contents of an image
    public static BufferedImage toBufferedImage(Image image) {
        if (image instanceof BufferedImage) {
            return (BufferedImage) image;
        }
        // This code ensures that all the pixels in the image are loaded
        image = new ImageIcon(image).getImage();
        // Determine if the image has transparent pixels; for this method's
        // implementation, see e661 Determining If an Image Has Transparent
        // Pixels
        boolean hasAlpha = hasAlpha(image);
        // Create a buffered image with a format that's compatible with the
        // screen
        BufferedImage bimage = null;
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        try {
            // Determine the type of transparency of the new buffered image
            int transparency = Transparency.OPAQUE;
            if (hasAlpha) {
                transparency = Transparency.BITMASK;
            }
            // Create the buffered image
            GraphicsDevice gs = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc = gs.getDefaultConfiguration();
            bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
        } catch (HeadlessException e) {
            // The system does not have a screen
        }
        if (bimage == null) {
            // Create a buffered image using the default color model
            int type = BufferedImage.TYPE_INT_RGB;
            if (hasAlpha) {
                type = BufferedImage.TYPE_INT_ARGB;
            }
            bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
        }
        // Copy image to buffered image
        Graphics g = bimage.createGraphics();
        // Paint the image onto the buffered image
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return bimage;
    }

    public static boolean hasAlpha(Image image) {
        // If buffered image, the color model is readily available
        if (image instanceof BufferedImage) {
            BufferedImage bimage = (BufferedImage) image;
            return bimage.getColorModel().hasAlpha();
        }
        // Use a pixel grabber to retrieve the image's color model;
        // grabbing a single pixel is usually sufficient
        PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
        try {
            pg.grabPixels();
        } catch (InterruptedException e) {
        }
        // Get the image's color model
        ColorModel cm = pg.getColorModel();
        return cm.hasAlpha();
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    ImageMain.setup();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }
}


 类似资料:
  • 问题内容: 我必须提供一些导出功能到我的网站,例如CSV或PDF。Java是否有功能强大且免费的工具将HTML页面转换为PDF格式? 问题答案: 与一起使用可以将HTML内容转换为PDF。 以下示例在某种程度上帮助您理解XHTML到PDF的转换。 使用飞碟API的示例 : 您需要以下库: core-renderer.jar iText-2.0.8.jar 您可以在中找到这些资源。 例1:使用XML

  • 问题内容: 我正在尝试使用Python将多页PDF转换为一系列JPEG。我可以使用可用的工具轻松地将PDF拆分为单个页面,但是我找不到能够将PDF转换为图像的任何东西。 PIL无法工作,因为它无法读取PDF。我找到的两个选项是通过外壳使用GhostScript或ImageMagick。对于我来说,这不是一个可行的选择,因为该程序需要跨平台,而且我不确定这些程序中的任何一个都可以在将要安装和使用的计

  • 问题内容: 如何使用Java生成PDF文档中页面的缩略图? 问题答案: 我认为http://pdfbox.apache.org/可以满足您的需求,因为您可以从页面创建图像,然后缩放图像 从他们的示例代码中-

  • 我有一个针对xml内容和xsl标记运行apache fop的代码,并为我提供apache中间格式输出: 然后我使用中间格式文件来渲染pdf和png文件。我可以在这里设置我自己的serilaizer(FPSIFSeriezer())。 我有几页报告,但我不需要处理所有的报告。是否有任何方法可以跳过某些页面或从IntermediateFormat中提取它们,以便我能够例如仅将第一页呈现为png,然后将

  • 如何替换PDF中的图像与另一个图像PDF框。怎么做? 我想用另一个图像更改pdf上的VisualSignature。

  • 在java swing(桌面)应用程序中,我需要将jasper报告导出为PDF文件。下面的代码输出jasper报告和pdf文件,但问题是pdf的大小为零,没有显示报告内容,甚至无法打开pdf,jasper版本为3.1.4,jasperreports-3.1.4。罐子