1

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

我读了这么多开源文件 iText、PDFReader 和 PDfViewer,但没有一个能完美地完成这项工作。有人能在这方面帮助我吗?

4

2 回答 2

2
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;
}

公共静态无效设置()抛出 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,但是当运行异常时说矩形和图形不支持..我犯了什么错误..?有任何想法吗..?

于 2012-10-31T07:46:11.813 回答
1

I found it..I used ghostscript in my webserver and converted to images then store in webfolder.

refer this to convert using ghostscript http://view.samurajdata.se/

Then you have to count the files.

Then i retrieved my images to my app using URL with the help of for loop and displayed in an bitmap format..

The code i used to retrieve from url:

public String Downloadfromurl(String Url)

{

 String filepath=null;

 try {

  URL url = new URL(Url);

  //create the new connection

  HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

  //set up some things on the connection
  urlConnection.setRequestMethod("GET");

  urlConnection.setDoOutput(true); 

   //and connect!

  urlConnection.connect();

  //set the path where we want to save the file
  //in this case, going to save it on the root directory of the
  //sd card.

  folder = new File(Environment.getExternalStorageDirectory().toString()+"/img");

  folder.mkdirs();

  //create a new file, specifying the path, and the filename
  //which we want to save the file as.

  String filename= "page"+no+".PNG";   

  file = new File(folder,filename);

  if(file.createNewFile())

  {

   file.createNewFile();

  }

  //this will be used to write the downloaded data into the file we created
  FileOutputStream fileOutput = new FileOutputStream(file);

  //this will be used in reading the data from the internet
  InputStream inputStream = urlConnection.getInputStream();

  //this is the total size of the file
  int totalSize = urlConnection.getContentLength();
  //variable to store total downloaded bytes
  int downloadedSize = 0;

  //create a buffer...
  byte[] buffer = new byte[1024];
  int bufferLength = 0; //used to store a temporary size of the buffer

  //now, read through the input buffer and write the contents to the file
  while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
   //add the data in the buffer to the file in the file output stream (the file on the sd card
   fileOutput.write(buffer, 0, bufferLength);
   //add up the size so we know how much is downloaded
   downloadedSize += bufferLength;
   //this is where you would do something to report the prgress, like this maybe
   Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ;
  }
  //close the output stream when done
  fileOutput.close();
  if(downloadedSize==totalSize)  
      filepath=file.getPath();

 //catch some possible errors...
 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (IOException e) {
  filepath=null;
  e.printStackTrace();
 }
 Log.i("filepath:"," "+filepath) ;


 return filepath;

}

I hope this might be useful.

于 2012-11-01T09:24:18.630 回答