我想将pdf文件转换为android中的图像。虽然我尝试使用 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;
}
公共静态无效设置()抛出 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,但是当运行异常时说矩形和图形不支持..我犯了什么错误..?有任何想法吗..?
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.