Click here to Skip to main content
15,513,652 members
Articles / Programming Languages / C
Article
Posted 3 Oct 2008

Stats

85.9K views
3K downloads
48 bookmarked

Simplest PDF Generating API for JPEG Image Content

Rate me:
Please Sign up or sign in to vote.
4.43/5 (19 votes)
19 Dec 2008CPOL1 min read
An article on how to generate PDF file based on JPEG file as page content

Introduction

I was working on a project in which I need to wrap a JPEG file into PDF format. The program needs to be done in C, and after searched on the Internet, I could not find anything that I can refer to. Most of the Open Source PDF engine is based on either Java or PHP, and a few C PDF engines are huge and will add a lot of unnecessary code to my project. I decided to write this simple JPEG to PDF wrapper. And it's the result of reverse-engineering of the simplest PDF file that contains one single JPEG file. I just want to share this API so you can grab and use it if you have a similar requirement.

Using the Code

Just give an example to demonstrate how to generate a 2 page PDF file based on 2 JPEG files. Please refer to testMain.c for details. But the idea is:

C++
PJPEG2PDF pPDF;
int pdfByteSize, pdfOutByteSize;
unsigned char *pdfBuf;

pPDF = Jpeg2PDF_BeginDocument(8.5, 11);    
	/* pdfW, pdfH: Page Size in Inch ( 1 inch=25.4 mm ); Letter Size 8.5x11 */

if(NULL != pPDF) {
    
    Loop For All JPEG Files {
        ... Prepare the current JPEG File to be inserted.
        /* You'll need to know the dimension of the JPEG Image, 
	and the ByteSize of the JPEG Image */
        Jpeg2PDF_AddJpeg(pPDF, JPEG_IMGW, JPEG_IMGH, JPEG_BYTE_SIZE, 
		JPEG_DATA_POINTER, IS_COLOR_JPEG);
    } 
    
    /* Call this after all of the JPEG image has been inserted. 
	The return value is the PDF file Byte Size */
    pdfByteSize = Jpeg2PDF_EndDocument(pPDF);
    
    /* Allocate the buffer for PDF Output */
    pdfBuf = malloc(pdfByteSize);
    
    /* Output the PDF to the pdfBuf */
   Jpeg2PDF_GetFinalDocumentAndCleanup(pPDF, pdfBuf, &pdfOutByteSize);
   
   ... Do something you want to the PDF file in the memory.
}

There are several places that you can fine-tune in the Jpeg2PDF.h file:

C++
#define MAX_PDF_PAGES        256     /* Currently only supports less than 256 Images */

#define PDF_TOP_MARGIN        (0.0 * PDF_DOT_PER_INCH)    /* Currently No Top Margin */
#define PDF_LEFT_MARGIN        (0.0 * PDF_DOT_PER_INCH)   /* Currently No Left Margin */

That's it, guys. Enjoy.

History

  • Updated [2008-12-19] - Added some extra code to auto scan the current folder and automatically obtain the JPEG image dimension from the JPEG file instead of using hard coded value before.
    The JPEG image dimension code is borrowed from here.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionBug or NOOB misunderstanding? Pin
John Smith27-Sep-15 23:43
John Smith27-Sep-15 23:43 
AnswerRe: Bug or NOOB misunderstanding? Pin
Hao Hu28-Sep-15 1:05
Hao Hu28-Sep-15 1:05 
GeneralRe: Bug or NOOB misunderstanding? Pin
John Smith28-Sep-15 1:22
John Smith28-Sep-15 1:22 
GeneralHow to display image in original size Pin
Denny Mathew18-Dec-14 2:26
Denny Mathew18-Dec-14 2:26 
Questionwhy you only supports less than 256 Images? Pin
veeta23-Nov-14 21:20
veeta23-Nov-14 21:20 
QuestionExcellent Pin
T800G27-Sep-14 11:57
T800G27-Sep-14 11:57 
Questionpatches done: keep images's aspect ratio & automatic page rotate for best fit Pin
dab1826-Aug-11 7:55
dab1826-Aug-11 7:55 
QuestionRemove the max 250 pages limitation? Pin
monday200015-Mar-11 2:54
monday200015-Mar-11 2:54 
AnswerRe: Remove the max 250 pages limitation? Pin
Hao Hu15-Mar-11 8:15
Hao Hu15-Mar-11 8:15 
QuestionHow to get DPI from JPEG? Pin
monday200011-Mar-11 6:22
monday200011-Mar-11 6:22 
AnswerRe: How to get DPI from JPEG? Pin
Hao Hu11-Mar-11 6:39
Hao Hu11-Mar-11 6:39 
GeneralRe: How to get DPI from JPEG? Pin
monday200011-Mar-11 11:09
monday200011-Mar-11 11:09 
Generalhttps://sourceforge.net/projects/jpeg2pdf/ Pin
Hao Hu26-Aug-10 13:27
Hao Hu26-Aug-10 13:27 
GeneralRe: https://sourceforge.net/projects/jpeg2pdf/ Pin
monday200012-Mar-11 22:20
monday200012-Mar-11 22:20 
QuestionWhat about the XMP manipulation? [modified] Pin
monday200018-Aug-10 0:11
monday200018-Aug-10 0:11 
AnswerRe: What about the XMP manipulation? Pin
Hao Hu18-Aug-10 7:09
Hao Hu18-Aug-10 7:09 
GeneralDesired enhancements Pin
monday200014-Aug-10 1:09
monday200014-Aug-10 1:09 
GeneralRe: Desired enhancements Pin
Hao Hu14-Aug-10 16:12
Hao Hu14-Aug-10 16:12 
GeneralRe: Desired enhancements Pin
monday200015-Aug-10 20:44
monday200015-Aug-10 20:44 
Computers always have trade-off.
So I just want to keep the code simple.

I totally agree with you. I also will do my best to keep the derived code as simple as possible.
The trade-off of changing 256 to a unlimited number is the simplicity of the program.

By the way - I did not understand yet - where does this limitation come from? Maybe it is the probable RAM memory size limitation? If yes - than introducing a temp file usage would not break the trade-off significantly. The code will remain enough simple and understandable.
Of course, there are many PDF libraries, they might provide more features that the code I have here, if you need those features, you should consider to switch.

It is so much illusionary actually. I need exactly something for C++ - not C# and not Java. And the libs which conform - are too complicated to even compile them (not to tell about anything else).

Probably the trade-off you are speaking about may go broken if I stop using the memory buffers of the pre-set length. So I will think this issue through thouroughly before applying.
GeneralI made my program based on this one Pin
monday200013-Aug-10 2:12
monday200013-Aug-10 2:12 
GeneralRe: I made my program based on this one Pin
monday200016-Mar-11 23:03
monday200016-Mar-11 23:03 
GeneralRe: I made my program based on this one Pin
Hao Hu18-Mar-11 21:16
Hao Hu18-Mar-11 21:16 
GeneralBug found Pin
monday200013-Aug-10 2:08
monday200013-Aug-10 2:08 
GeneralRe: Bug found [modified] Pin
Hao Hu13-Aug-10 6:43
Hao Hu13-Aug-10 6:43 
QuestionMay I re-use your code under the "GPL 2 and later" license? Pin
monday20002-Jul-10 2:32
monday20002-Jul-10 2:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.