1

我们如何将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

4

2 回答 2

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"));

当然,您已经拥有图像,无需像本例中那样从文件中获取图像。

于 2012-08-08T13:14:20.380 回答
0

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

将其转换为代码对您来说应该不是问题。

于 2012-08-08T13:08:54.140 回答