将pdf文件转换为单个jpeg?

时间:2012-08-08 12:40:13

标签: java pdf servlets image-processing jpeg

我们如何将pdf文件转换为单个jpeg?现在我使用以下代码转换为不同的图像..但我如何能够作为单个jpeg图像实现    package packagename;

import antlr.ByteBuffer;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Praveen
*/
public class Pdf2ImageCon extends HttpServlet {

/**
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String pdfname="C:/san.pdf";
    try {
        BufferedImage img=null;

        File file = new File(pdfname);
    RandomAccessFile raf;
    try {
        raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        MappedByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
        PDFFile pdffile = new PDFFile(buf);
        // draw the first page to an image
        int num = pdffile.getNumPages();

int length;
length=num;
        for (int i = 0; i <= num; i++) {
            PDFPage page = pdffile.getPage(i);
            //get the width and height for the doc at the default zoom
            int width = (int) page.getBBox().getWidth();
            int height = (int) page.getBBox().getHeight();
            Rectangle rect = new Rectangle(0, 0, width, height);
            int rotation = page.getRotation();
            Rectangle rect1 = rect;
            if (rotation == 180) {
                rect1 =
new Rectangle(0, 0, rect.height, rect.width);
            }
            //generate the image


                    img = (BufferedImage) page.getImage(
                    rect.width, rect.height, //width & height
                    rect1, // clip rect
                    null, // null for the ImageObserver
                    true, // fill background with white
                    true // block until drawing is done
                    );

        }
        ImageIO.write(img, "png", new File("C:\\newone.png"));
    } catch (FileNotFoundException e1) {
        System.err.println(e1.getLocalizedMessage());
    } catch (IOException e) {
        System.err.println(e.getLocalizedMessage());
    }



    } finally {
        out.close();
    }
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
 * Handles the HTTP <code>GET</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

/**
 * Handles the HTTP <code>POST</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

/**
 * Returns a short description of the servlet.
 * @return a String containing servlet description
 */

public String getServletInfo() {
    return "Short description";
}// </editor-fold>

}

这样每个pdf文件页面都会生成一个新的jpeg图像。我如何从pdf文件中获取单个jpeg / png

2 个答案:

答案 0 :(得分:1)

首先,这看起来很复杂。 Ghost4J实现了更好的转换:

// load PDF document
PDFDocument document = new PDFDocument();
document.load(new File("input.pdf"));

// create renderer
SimpleRenderer renderer = new SimpleRenderer();

// set resolution (in DPI)
renderer.setResolution(300);

// render
List<Image> images = renderer.render(document);

然后,看一下这篇博文(尚未尝试过,但看起来这就是你想要的:http://kalanir.blogspot.de

它使用了Java ImageIO:

int rows = images.size();  
int cols = 1;  
int chunks = rows * cols;  

int chunkWidth, chunkHeight;  
int type;  
//fetching image files  
File[] imgFiles = new File[chunks];  
for (int i = 0; i < chunks; i++) {  
        imgFiles[i] = new File("archi" + i + ".jpg");  
    }  

   //creating a bufferd image array from image files  
    BufferedImage[] buffImages = new BufferedImage[chunks];  
    for (int i = 0; i < chunks; i++) {  
        buffImages[i] = ImageIO.read(imgFiles[i]);  
    }  
    type = buffImages[0].getType();  
    chunkWidth = buffImages[0].getWidth();  
    chunkHeight = buffImages[0].getHeight();  

    //Initializing the final image  
    BufferedImage finalImg = new BufferedImage(chunkWidth*cols, chunkHeight*rows, type);  

    int num = 0;  
    for (int i = 0; i < rows; i++) {  
        for (int j = 0; j < cols; j++) {  
            finalImg.createGraphics().drawImage(buffImages[num], chunkWidth * j, chunkHeight * i, null);  
            num++;  
        }  
    }  
    System.out.println("Image concatenated.....");  
    ImageIO.write(finalImg, "jpeg", new File("finalImg.jpg"));

当然,您已经拥有了图像,无需从此示例中的文件中获取图像。

答案 1 :(得分:0)

JPEG不是多页图像格式(例如TIFF是,或GIF动画)。

  • 那你究竟想要什么?
  • 将所有PDF页面“拼凑”成一个巨大的JPEG?

例如,如果您想要在4列和3行('4x3')中平铺官方ISO 3200_2008 PDF-1.7规范的前12页,每页之间有2个像素的额外间距),请运行此ImageMagick命令:

montage \
   http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf[1-12] \
  -tile 4x3 -geometry +2+2 \
  -background white \
   tiled.png

将它翻译成代码应该不是问题。