【问题标题】:convert a pdf file to single jpeg?将pdf文件转换为单个jpeg?
【发布时间】:2012-08-05 13:48:30
【问题描述】:

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

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

【问题讨论】:

    标签: java pdf servlets image-processing jpeg


    【解决方案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"));
    

    当然,你已经有了图片,不需要像这个例子那样从文件中获取它。

    【讨论】:

      【解决方案2】:

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

      • 那么你到底想要什么?
      • 将所有 PDF 页面“平铺”成一个巨大的 JPEG?

      例如,如果您希望将官方 ISO 3200_2008 PDF-1.7 规范的前 12 页平铺成 4 列和 3 行(“4x3”),每页之间有 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
      

      将它翻译成代码对您来说应该不是问题。

      【讨论】:

        猜你喜欢
        • 2021-01-01
        • 2015-09-05
        • 1970-01-01
        • 2020-03-13
        • 1970-01-01
        • 2012-02-22
        • 1970-01-01
        • 2012-12-22
        • 2011-05-16
        相关资源
        最近更新 更多