2010-12-08 1 views

ответ

18

Я думаю http://pdfbox.apache.org/ будет делать то, что вы ищете, так как вы можете создать образ от страницы, а затем масштабировать изображение

С их пример кода -

/* 
* Licensed to the Apache Software Foundation (ASF) under one or more 
* contributor license agreements. See the NOTICE file distributed with 
* this work for additional information regarding copyright ownership. 
* The ASF licenses this file to You under the Apache License, Version 2.0 
* (the "License"); you may not use this file except in compliance with 
* the License. You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 
package org.apache.pdfbox; 

import java.awt.HeadlessException; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 

import javax.imageio.ImageIO; 

import java.util.List; 

import org.apache.pdfbox.exceptions.InvalidPasswordException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.common.PDRectangle; 
import org.apache.pdfbox.util.PDFImageWriter; 

/** 
* Convert a PDF document to an image. 
* 
* @author <a href="[email protected]">Ben Litchfield</a> 
* @version $Revision: 1.6 $ 
*/ 
public class PDFToImage 
{ 

    private static final String PASSWORD = "-password"; 
    private static final String START_PAGE = "-startPage"; 
    private static final String END_PAGE = "-endPage"; 
    private static final String IMAGE_FORMAT = "-imageType"; 
    private static final String OUTPUT_PREFIX = "-outputPrefix"; 
    private static final String COLOR = "-color"; 
    private static final String RESOLUTION = "-resolution"; 
    private static final String CROPBOX = "-cropbox"; 

    /** 
    * private constructor. 
    */ 
    private PDFToImage() 
    { 
     //static class 
    } 

    /** 
    * Infamous main method. 
    * 
    * @param args Command line arguments, should be one and a reference to a file. 
    * 
    * @throws Exception If there is an error parsing the document. 
    */ 
    public static void main(String[] args) throws Exception 
    { 
     String password = ""; 
     String pdfFile = null; 
     String outputPrefix = null; 
     String imageFormat = "jpg"; 
     int startPage = 1; 
     int endPage = Integer.MAX_VALUE; 
     String color = "rgb"; 
     int resolution; 
    float cropBoxLowerLeftX = 0; 
    float cropBoxLowerLeftY = 0; 
    float cropBoxUpperRightX = 0; 
    float cropBoxUpperRightY = 0; 
     try 
     { 
      resolution = Toolkit.getDefaultToolkit().getScreenResolution(); 
     } 
     catch(HeadlessException e) 
     { 
      resolution = 96; 
     } 
     for(int i = 0; i < args.length; i++) 
     { 
      if(args[i].equals(PASSWORD)) 
      { 
       i++; 
       if(i >= args.length) 
       { 
        usage(); 
       } 
       password = args[i]; 
      } 
      else if(args[i].equals(START_PAGE)) 
      { 
       i++; 
       if(i >= args.length) 
       { 
        usage(); 
       } 
       startPage = Integer.parseInt(args[i]); 
      } 
      else if(args[i].equals(END_PAGE)) 
      { 
       i++; 
       if(i >= args.length) 
       { 
        usage(); 
       } 
       endPage = Integer.parseInt(args[i]); 
      } 
      else if(args[i].equals(IMAGE_FORMAT)) 
      { 
       i++; 
       imageFormat = args[i]; 
      } 
      else if(args[i].equals(OUTPUT_PREFIX)) 
      { 
       i++; 
       outputPrefix = args[i]; 
      } 
      else if(args[i].equals(COLOR)) 
      { 
       i++; 
       color = args[i]; 
      } 
      else if(args[i].equals(RESOLUTION)) 
      { 
       i++; 
       resolution = Integer.parseInt(args[i]); 
      } 
      else if(args[i].equals(CROPBOX)) 
      { 
       i++; 
      cropBoxLowerLeftX = Float.valueOf(args[i]).floatValue(); 
       i++; 
      cropBoxLowerLeftY = Float.valueOf(args[i]).floatValue(); 
       i++; 
      cropBoxUpperRightX = Float.valueOf(args[i]).floatValue(); 
       i++; 
      cropBoxUpperRightY = Float.valueOf(args[i]).floatValue(); 
      } 
      else 
      { 
       if(pdfFile == null) 
       { 
        pdfFile = args[i]; 
       } 
      } 
     } 
     if(pdfFile == null) 
     { 
      usage(); 
     } 
     else 
     { 
      if(outputPrefix == null) 
      { 
       outputPrefix = pdfFile.substring(0, pdfFile.lastIndexOf('.')); 
      } 

      PDDocument document = null; 
      try 
      { 
       document = PDDocument.load(pdfFile); 


       //document.print(); 
       if(document.isEncrypted()) 
       { 
        try 
        { 
         document.decrypt(password); 
        } 
        catch(InvalidPasswordException e) 
        { 
         if(args.length == 4)//they supplied the wrong password 
         { 
          System.err.println("Error: The supplied password is incorrect."); 
          System.exit(2); 
         } 
         else 
         { 
          //they didn't supply a password and the default of "" was wrong. 
          System.err.println("Error: The document is encrypted."); 
          usage(); 
         } 
        } 
       } 
       int imageType = 24; 
       if ("bilevel".equalsIgnoreCase(color)) 
       { 
        imageType = BufferedImage.TYPE_BYTE_BINARY; 
       } 
       else if ("indexed".equalsIgnoreCase(color)) 
       { 
        imageType = BufferedImage.TYPE_BYTE_INDEXED; 
       } 
       else if ("gray".equalsIgnoreCase(color)) 
       { 
        imageType = BufferedImage.TYPE_BYTE_GRAY; 
       } 
       else if ("rgb".equalsIgnoreCase(color)) 
       { 
        imageType = BufferedImage.TYPE_INT_RGB; 
       } 
       else if ("rgba".equalsIgnoreCase(color)) 
       { 
        imageType = BufferedImage.TYPE_INT_ARGB; 
       } 
       else 
       { 
        System.err.println("Error: the number of bits per pixel must be 1, 8 or 24."); 
        System.exit(2); 
       } 

       //si une cropBox a ete specifier, appeler la methode de modification de cropbox 
     //changeCropBoxes(PDDocument document,float a, float b, float c,float d) 
     if (cropBoxLowerLeftX!=0 || cropBoxLowerLeftY!=0 || cropBoxUpperRightX!=0 || cropBoxUpperRightY!=0) 
     { 
      changeCropBoxes(document,cropBoxLowerLeftX, cropBoxLowerLeftY, cropBoxUpperRightX, cropBoxUpperRightY); 
     } 

       //Make the call 
       PDFImageWriter imageWriter = new PDFImageWriter(); 
       boolean success = imageWriter.writeImage(document, imageFormat, password, 
         startPage, endPage, outputPrefix, imageType, resolution); 
       if (!success) 
       { 
        System.err.println("Error: no writer found for image format '" 
          + imageFormat + "'"); 
        System.exit(1); 
       } 
      } 
      catch (Exception e) 
      { 
       System.err.println(e); 
      } 
      finally 
      { 
       if(document != null) 
       { 
        document.close(); 
       } 
      } 
     } 
    } 

    /** 
    * This will print the usage requirements and exit. 
    */ 
    private static void usage() 
    { 
     System.err.println("Usage: java org.apache.pdfbox.PDFToImage [OPTIONS] <PDF file>\n" + 
      " -password <password>   Password to decrypt document\n" + 
      " -imageType <image type>  (" + getImageFormats() + ")\n" + 
      " -outputPrefix <output prefix> Filename prefix for image files\n" + 
      " -startPage <number>   The first page to start extraction(1 based)\n" + 
      " -endPage <number>    The last page to extract(inclusive)\n" + 
      " -color <string>    The color depth (valid: bilevel, indexed, gray, rgb, rgba)\n" + 
      " -resolution <number>   The bitmap resolution in dpi\n" + 
      " -cropbox <number> <number> <number> <number> The page area to export\n" + 
      " <PDF file>      The PDF document to use\n" 
      ); 
     System.exit(1); 
    } 

    private static String getImageFormats() 
    { 
     StringBuffer retval = new StringBuffer(); 
     String[] formats = ImageIO.getReaderFormatNames(); 
     for(int i = 0; i < formats.length; i++) 
     { 
      retval.append(formats[i]); 
      if(i + 1 < formats.length) 
      { 
       retval.append(","); 
      } 
     } 
     return retval.toString(); 
    } 

    private static void changeCropBoxes(PDDocument document,float a, float b, float c,float d) 
    { 
     List pages = document.getDocumentCatalog().getAllPages(); 
     for(int i = 0; i < pages.size(); i++) 
     { 
       System.out.println("resizing page"); 
      PDPage page = (PDPage)pages.get(i); 
      PDRectangle rectangle = new PDRectangle(); 
       rectangle.setLowerLeftX(a); 
       rectangle.setLowerLeftY(b); 
       rectangle.setUpperRightX(c); 
       rectangle.setUpperRightY(d); 
      page.setMediaBox(rectangle); 
      page.setCropBox(rectangle); 

     } 

    } 

} 
+0

также сохраняет арабские символы, потому что у меня проблема с этим. http://stackoverflow.com/questions/16665300/setting-ttf-for-pdf-to-image-on-pdfbox – Genjuro 2013-05-22 08:47:37

+2

Для создания изображений с версией pdfx 2.x см. http://stackoverflow.com/a/ 23327024/580021 – Jollyjagga 2017-05-22 12:47:52

5

Вы могли бы также иметь посмотрите на JPedal (подробности на)

4

IcePdf - лучшее, что я видел (это бесплатно) для чтения pdf-файлов. JPedal потрясающий, но не бесплатный.

Если вы собираетесь генерировать изображения из pdf-файлов, которые может отправить вам широкая публика, я заверяю вас (из опыта), что вы получите pdf-файлы, которые приведут к сбою JVM. (т. е. если они многослойные pdf-файлы со всей векторной графикой). This pdf - пример, который приведет к сбою многих библиотек (но это абсолютно достоверный PDF-код без каких-либо смешных событий, таких как Javascript и т. Д.).

Мы пошли по пути использования множества библиотек и в конечном итоге прибегли к делегированию работы по созданию эскиза к ImageMagick, который является высоко оптимизированной программой для обработки изображений.

+0

JPedal и Icepdf имеют LGPL и коммерческие версии с различными функциями - в обоих случаях версия LGPL имеет меньше возможностей. Существует также PDF-Renderer, но это не поддерживает все файлы PDF. – 2010-12-09 14:02:54

-2

This post не только PDF, но и многие другие типы файлов, как офис, изображение, текст ....