65.9K
CodeProject is changing. Read more.
Home

Simple and Free PDF to Image Conversion

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.57/5 (24 votes)

Feb 7, 2010

CPOL

2 min read

viewsIcon

176700

downloadIcon

16995

Simple and free Adobe Acrobat PDF to image conversion.

2-7-2010_2-00-29_PM.png

Introduction

This article is about extracting image files from a PDF file. I was looking for a free solution for converting .pdf files to image files, but I didn't find a simple and free solution. I therefore tried until I found a free solution by using the "Adobe Acrobat COM component" and using the CAcroPDDoc class.

Pre-requisites

You must have "Adobe Acrobat Reader" installed on your system. My system had Adobe Acrobat 9.0 installed.

Using the code and description

First, I added a reference to the Adobe Acrobat COM component.

AddRefrence.png

I then wrote the PDFConvertor class that has a method named Convert(....) which would do the conversion. Here is the code in my class used for accessing a PDF document:

Acrobat.CAcroPDPage pdfPage = null;//the pdf page
Acrobat.CAcroRect pdfRect = new Acrobat.AcroRect();//the pdf region
Acrobat.AcroPoint pdfPoint =new Acrobat.AcroPoint();//the pdf point
  • CAcroPDDoc class is for working with the PDF file
  • CAcroPDPage class is for working with the pages in the PDF file
  • CAcroRect and AcroPoint classes are for defining the dimensions of a page

Here is how I open a PDF document:

if (pdfDoc.Open(sourceFileName))//check file is opened?

For opening a specified PDF file, I use the open() method of the pdfDoc object; it returns false in the case of an error.

pageCount = pdfDoc.GetNumPages();//get the count of pdf pages

After reading the page count with pdfDoc.GetNumPages(), I then read a page.

pdfPage = (Acrobat.CAcroPDPage)pdfDoc.AcquirePage(i); //reading current page

Then, I extract a pages in the PDF file using pdfDoc.AcquirePage(i) and assign it to the pdfPage object; the variable i indicates the number of the current page.

pdfPoint = (Acrobat.AcroPoint)pdfPage.GetSize();//geting page size
pdfRect.Left = 0;
pdfRect.right = pdfPoint.x;
pdfRect.Top = 0;
pdfRect.bottom = pdfPoint.y;

I then get the page size with pdfPage.GetSize() and put it into a pdfPoint object. This is required for specifying the region of the PDF page for copying the page into the Clipboard.

pdfPage.CopyToClipboard(pdfRect, 0, 0, 100);//coping region to clipboard

Make sure that pdfPage doesn't have any method for saving as the referenced page. pdfPage.CopyToClipboard(pdfRect, 0, 0, 100) can help us there. It has four arguments: first is the rect of the page that was previously discussed, second and third are x, y offsets of the page that usually are 0, and fourth is the zoom percent.

Clipboard.GetImage().Save(outimg, outPutImageFormat);// saving clipboard image

Finally, with Clipboard.GetImage().Save(...), we can save the output image.

Here is the code for the Convert method of my class:

#region Convert
/// 
/// Converting PDF Files TO Specified Image Format
/// 
/// sourceFileName : Source PDF File Path
/// DestinationPath : Destination PDF File Path
/// outPutImageFormat: Type Of Exported Image
/// Returns Count Of Exported Images
public int Convert(string sourceFileName, 
       string DestinationPath, ImageFormat outPutImageFormat)
{
    if (pdfDoc.Open(sourceFileName))
    {
        // pdfapp.Hide();
        pageCount = pdfDoc.GetNumPages();

        for (int i = 0; i < pageCount; i++)
        {
            pdfPage = (Acrobat.CAcroPDPage)pdfDoc.AcquirePage(i);

            pdfPoint = (Acrobat.AcroPoint)pdfPage.GetSize();
            pdfRect.Left = 0;
            pdfRect.right = pdfPoint.x;
            pdfRect.Top = 0;
            pdfRect.bottom = pdfPoint.y;

            pdfPage.CopyToClipboard(pdfRect, 500, 110, 100);

            string outimg = "";
            string filename=sourceFileName.Substring(
                       sourceFileName.LastIndexOf("\\")); 

            if (pageCount == 1)
                outimg = DestinationPath + "\\" + filename + 
                  "." + outPutImageFormat.ToString();
            else
                outimg = DestinationPath + "\\" + filename + 
                  "_" + i.ToString() + "." + outPutImageFormat.ToString();
            
            Clipboard.GetImage().Save(outimg, outPutImageFormat);

            ////////////Firing Progress Event 
            OnExportProgressChanging(outimg);
        }

          Dispose();
    }
    else
    {
        Dispose();
        throw new System.IO.FileNotFoundException(sourceFileName + 
                  " Not Found!");
    }
    return pageCount;
}
#endregion

I have also implemented a class for indicating the progress with the event handler ProgressChangingEventHandler that exists in the source of my project.

Enjoy!