android - android 是否可以将pdf文件转换为图像

标签 android pdf

我想在 android 中将 pdf 文件转换为图像。虽然我尝试用 java 进行转换,但它工作得很好,但在 android 中它不接受缓冲类。

我读了很多开源文件 iText、PDFReader 和 PDfViewer,但没有一个能完美地完成这项工作。有人可以帮助我完成这部分工作吗?

最佳答案

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 {


// 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 void setup() 抛出 IOException {

    File file = new File("p.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);

    }

}

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();
            }
        }
    });
}

}

使用的 JAR 文件:PDF RenderER.jar。

这个Java代码可以将pdf页面转换为图像。但是当我尝试转换为android代码时。我收到 java.awt.Rectangle 和 java.awt.graphics 不支持的错误。

我在网上搜索了一个 jtar.jar,它只是删除了错误并运行了 projext,但是在运行时出现异常,说矩形和图形不支持..我犯了什么错误 friend ..?有什么想法..?

关于android - android 是否可以将pdf文件转换为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13134557/

相关文章:

android - 模拟器上的 Environment.getExternalStorageDirectory()

android - 我想将一个 Activity 分成几个类(class)。是否可以?

python - Django Reportlab 生成空 pdf

javascript - 将 PDF 转换为 PNG Node.JS

.net - 如何在服务器上最好地将信息合并到 "form"中,生成 PDF 作为最终输出

image - 将pdf转换为图像,但放大后

java - 在一天内保存用户数据(同一天 -> 许多用户数据)

android - 我可以在我的 maven android 项目中使用 AdMob SDK jar 作为依赖项吗?

Java,SimpleDateFormat 在德语中产生 ParseException。英文作品

ruby-on-rails - "latex-rails"gem 不生成输出