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

これは、JavaImageIOを利用します。

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ページを1つの巨大な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 に答える