How to increase the resolution of image in PDF renderer?
Asked Answered
L

1

6

I want to increase the resolution of a image. I used PDFRenderer-0.9.0 jar . It is downloaded from java.net for converting PDF pages to images.

I want to Convert 46_2.pdf PDF file to image . The converted 46_2.png image is small with dimensions 612 x 792 [ width x height ],

So I want to increase the image dimensions to 1200 x 1400 [ width x height].

I tried previously PdfBox for converting PDF page into PNG image file. There is a problem only page is converted but text is missing. So I tried PdfRenderer library for image conversion.

Code:

package com.pdfrenderer.examples;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import javax.imageio.ImageIO;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

public class ConvertPdfPagesToImage {
    public static void main(String[] args) {
        try {
            String sourceDir = "C:/PDFCopy/46_2.pdf";
            String destinationDir = "C:/PDFCopy/";
            File sourceFile = new File(sourceDir);
            String fileName = sourceFile.getName().replace(".pdf", "");
            if (sourceFile.exists()) {
                RandomAccessFile raf = new RandomAccessFile(sourceFile, "r");
                FileChannel channel = raf.getChannel();
                ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
                PDFFile pdf = new PDFFile(buf);
                int pageNumber = 1;
                for (int i = 0; i < pdf.getNumPages(); i++) {
                    PDFPage page = pdf.getPage(i);
                    // create the image
                    Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
                    BufferedImage bufferedImage = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB);
                    // image width, // image height, // clip rect, // null for the ImageObserver, // fill background with white, // block until drawing is done
                    Image image = page.getImage(rect.width, rect.height, rect, null, true, true );
                    Graphics2D bufImageGraphics = bufferedImage.createGraphics();
                    bufImageGraphics.drawImage(image, 0, 0, null);
                    ImageIO.write(bufferedImage, "png", new File( destinationDir + fileName +"_"+ pageNumber +".png"));
                    pageNumber++;
                }
            } else {
                System.err.println(sourceFile.getName() +" File not exists");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Larimer answered 11/1, 2014 at 15:44 Comment(4)
what happens if double the width and height of the image. Will that not render it at double the resolution?Stronski
@Stronski after change the width and height image size is increased but resolution is same. If we increase the resolution automatically it change their height and width.Larimer
Um .. you want to automatically increase the resolution of a pixel image? You do know those "image enhancement" functions you see in "CSI" are fake, don't you?Recalescence
@Recalescence it is possible in pdfbox.Larimer
L
5

Convert the selected pageNumber from PDF File 46_2.pdf into image format 46_2.png with the desired dimensions. Resolution of image is increased with desired dimensions.

How to Convert Single PDF page to png or jpeg image format with resolution.

Code:

package com.pdfrenderer.examples;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import javax.imageio.ImageIO;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

public class PdfToImageWithDimensions {
    public static void main(String[] args) {
        try {
        String sourceDir = "C:/PDFCopy/46_2.pdf";// PDF file must be placed in DataGet folder
        String destinationDir = "C:/PDFCopy/Converted/";//Converted PDF page saved in this folder

        File sourceFile = new File(sourceDir);
        File destinationFile = new File(destinationDir);

        String fileName = sourceFile.getName().replace(".pdf", "");
        if (sourceFile.exists()) {
            if (!destinationFile.exists()) {
                destinationFile.mkdir();
                System.out.println("Folder created in: "+ destinationFile.getCanonicalPath());
            }

            RandomAccessFile raf = new RandomAccessFile(sourceFile, "r");
            FileChannel channel = raf.getChannel();
            ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
            PDFFile pdf = new PDFFile(buf);

            int pageNumber = 1;// which PDF page to be convert
            PDFPage page = pdf.getPage(pageNumber);

            // image dimensions 
            int width = 1200;
            int height = 1400;

            // create the image
            Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            // width & height, // clip rect, // null for the ImageObserver, // fill background with white, // block until drawing is done
            Image image = page.getImage(width, height, rect, null, true, true );
            Graphics2D bufImageGraphics = bufferedImage.createGraphics();
            bufImageGraphics.drawImage(image, 0, 0, null);

            File imageFile = new File( destinationDir + fileName +"_"+ pageNumber +".png" );// change file format here. Ex: .png, .jpg, .jpeg, .gif, .bmp

            ImageIO.write(bufferedImage, "png", imageFile);

            System.out.println(imageFile.getName() +" File created in: "+ destinationFile.getCanonicalPath());
        } else {
            System.err.println(sourceFile.getName() +" File not exists");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

OutPut: Converted files are saved in C:\PDFCopy\Converted Folder. Below one is Console output.

46_2_1.png File created in: C:\PDFCopy\Converted

Thanks Jeff Friesen based on your example of jRebel I tried it in pdfrenderer

Another Solution:

How to Convert All PDF pages into png / jpeg / jpg/ gif/ bmp image format with resoultion in java using PDF renderer. File to be converted 04-Request-Headers.pdf

Code:

package com.pdfrenderer.examples;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import javax.imageio.ImageIO;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

public class ConvertAllPDFPagesToImageWithDimenstions {
    public static void main(String[] args) {
        try {
            String sourceDir = "C:/Documents/04-Request-Headers.pdf";// PDF file must be placed in DataGet folder
            String destinationDir = "C:/Documents/Converted/";//Converted PDF page saved in this folder

        File sourceFile = new File(sourceDir);
        File destinationFile = new File(destinationDir);

        String fileName = sourceFile.getName().replace(".pdf", "");
        if (sourceFile.exists()) {
            if (!destinationFile.exists()) {
                destinationFile.mkdir();
                System.out.println("Folder created in: "+ destinationFile.getCanonicalPath());
            }

            RandomAccessFile raf = new RandomAccessFile(sourceFile, "r");
            FileChannel channel = raf.getChannel();
            ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
            PDFFile pdf = new PDFFile(buf);
            System.out.println("Total Pages: "+ pdf.getNumPages());
            int pageNumber = 1;
            for (int i = 0; i < pdf.getNumPages(); i++) {
                PDFPage page = pdf.getPage(i);

                // image dimensions 
                int width = 1200;
                int height = 1400;

                // create the image
                Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
                BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

                // width & height, // clip rect, // null for the ImageObserver, // fill background with white, // block until drawing is done
                Image image = page.getImage(width, height, rect, null, true, true );
                Graphics2D bufImageGraphics = bufferedImage.createGraphics();
                bufImageGraphics.drawImage(image, 0, 0, null);

                File imageFile = new File( destinationDir + fileName +"_"+ pageNumber +".png" );// change file format here. Ex: .png, .jpg, .jpeg, .gif, .bmp

                ImageIO.write(bufferedImage, "png", imageFile);
                pageNumber++;

                System.out.println(imageFile.getName() +" File created in Folder: "+ destinationFile.getCanonicalPath());
            }
        } else {
            System.err.println(sourceFile.getName() +" File not exists");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

OutPut: All the files are saved in C:/Documents/Converted/ Folder. Below one is Console output

Total Pages: 13
04-Request-Headers_1.png File created in Folder: C:\Documents\Converted
04-Request-Headers_2.png File created in Folder: C:\Documents\Converted
04-Request-Headers_3.png File created in Folder: C:\Documents\Converted
04-Request-Headers_4.png File created in Folder: C:\Documents\Converted
04-Request-Headers_5.png File created in Folder: C:\Documents\Converted
04-Request-Headers_6.png File created in Folder: C:\Documents\Converted
04-Request-Headers_7.png File created in Folder: C:\Documents\Converted
04-Request-Headers_8.png File created in Folder: C:\Documents\Converted
04-Request-Headers_9.png File created in Folder: C:\Documents\Converted
04-Request-Headers_10.png File created in Folder: C:\Documents\Converted
04-Request-Headers_11.png File created in Folder: C:\Documents\Converted
04-Request-Headers_12.png File created in Folder: C:\Documents\Converted
04-Request-Headers_13.png File created in Folder: C:\Documents\Converted
Larimer answered 12/1, 2014 at 5:26 Comment(2)
It seems quite odd / code-smell in lines using Rectangle, Image, BufferedImage, Graphics, and ImageIO. Why not just do the following: BufferedImage buffImage = (BufferedImage) page.getImage(rect.width, rect.height, rect, null, true, true); and then write the image to a file: ImageIO.write(buffImage, "png", destImage.toFile()); -- exclude Image and GraphicsPinball
i have used your solution and got one problem it works fine when the pdf contains text but when i have tried with pdf created using image it is not found working gives error on this line Image image = page.getImage(width, height, rect, null, true, true );Pennyroyal

© 2022 - 2024 — McMap. All rights reserved.