JPEG2PDF,JPEGtoPDF,JPG2PDF,JPGToPDF

/* -----------------------------------------------------------------------------
   JPEG2PDF,JPEGtoPDF,JPG2PDF,JPGToPDF
 
                                                                  (C) 2003 PAPY
                                              http://homepage1.nifty.com/MADIA/
----------------------------------------------------------------------------- */

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef unsigned long       DWORD;

#define FALSE               0
#define TRUE                1

WORD  SwapEndian(WORD S);
DWORD GetFileSize(FILE *fp);
BOOL  CopyStream(FILE *Src,FILE *Dest);
BOOL  GetJPEGSize(FILE *JPGStream,WORD *AWidth,WORD *AHeight,BOOL *CMYK);
void  Write_CrossReferenceTable(FILE *AStream,DWORD ObjectPosArray[],int Count);
void  Write_ContentsObject(FILE *AStream,DWORD ObjectPosArray[],int *ObjectIndex,int w,int h);
int   JPGtoPDF(const char *OpenName,const char *SaveName);

int main(int argc,char *argv[])
{
   if (argc >= 2)
     return (JPGtoPDF(argv[1],"c://jpg2pdf.pdf"));
   else
   {
     printf("Not Found!/n");
     return(0);
   }
}

WORD SwapEndian(WORD S)
{
 return ((S & 0x00FF) << 8) | ((S & 0xFF00) >> 8)  ;
}

DWORD GetFileSize(FILE *fp)
{
 int Pos;
 DWORD Size;
 
 Pos =ftell(fp);
 fseek(fp, 0, SEEK_END );   
 Size = ftell(fp);   
 fseek(fp, Pos, SEEK_SET );
 return Size;
}

BOOL CopyStream(FILE *Src,FILE *Dest)
{
 BYTE  *buffer;
 int   Pos;
 DWORD FileSize;

 Pos =ftell(Src);
 FileSize=GetFileSize(Src);

 buffer=(BYTE *)malloc(FileSize);
 if (buffer==NULL)
   return FALSE;
 fseek(Src,0,SEEK_SET);
 fread(buffer,1,FileSize,Src);      
 fwrite(buffer,1,FileSize,Dest);
 free(buffer);

 fseek(Src,Pos,SEEK_SET);
 return TRUE;
}

BOOL GetJPEGSize(FILE *JPGStream,WORD *AWidth,WORD *AHeight,BOOL *CMYK)
{
 WORD wrk;
 BYTE Sampling;

 WORD SOF0 =0xFFC0; /* Normal */
 WORD SOF2 =0xFFC2; /* Progressive */

 /* JFIF */
 if (fread(&wrk,2,1,JPGStream)<1)
   return FALSE;

 if (SwapEndian(wrk)!=0xFFD8)
    return FALSE;     

 while (1)
 {
     if (fread(&wrk,2,1,JPGStream)<1)
       return FALSE;
     wrk=SwapEndian(wrk);
    
     /* JPEG Maker */
     if ((wrk==SOF0) | (wrk==SOF2))
     { 
        /* Skip Segment Length  */
        if (fseek(JPGStream,ftell(JPGStream)+2,SEEK_SET))
         return FALSE;

        /* Skip Sample */
        if (fseek(JPGStream,ftell(JPGStream)+1,SEEK_SET))
         return FALSE;

        /* Height */
        if (fread(&wrk,2,1,JPGStream)<1)
          return FALSE;
        *AHeight=SwapEndian(wrk);

        /* Width */         
        if (fread(&wrk,2,1,JPGStream)<1)
         return FALSE;
        *AWidth=SwapEndian(wrk);
       
        /* ColorMode */
        if (fread(&Sampling,1,1,JPGStream)<1)
          return FALSE;
       
        switch (Sampling)
        {
          case 3  : *CMYK = FALSE; break; /* RGB  */
          case 4  : *CMYK = TRUE ; break; /* CMYK */
          default : return FALSE;         /* ???  */
        }

        return TRUE;
     }
     else if ((wrk==0xFFFF) | (wrk==0xFFD9))
     {
         return FALSE; 
     }

     /* Skip Segment */ 
     if (fread(&wrk,2,1,JPGStream)<1)
       return FALSE;
    
     if (fseek(JPGStream,ftell(JPGStream)+SwapEndian(wrk)-2,SEEK_SET ))
       return FALSE;
 }
}

void Write_CrossReferenceTable(FILE *AStream,DWORD ObjectPosArray[],int Count)
{
   int i;

   fprintf(AStream,"xref/n");
   fprintf(AStream,"0 %d/n",Count+1);
   fprintf(AStream,"0000000000 65535 f /n");

   for (i= 0; i<=Count-1;i++)
      fprintf(AStream,"%0.10d 00000 n /n",ObjectPosArray[i]);
}

void Write_ContentsObject(FILE *AStream,DWORD ObjectPosArray[],int *ObjectIndex,int w,int h)
{
   int Length;

   /* Contents */
   ObjectPosArray[*ObjectIndex]  =(DWORD)ftell(AStream);
     fprintf(AStream,"%d 0 obj/n",*ObjectIndex+1);
     fprintf(AStream,"<< /Length %d 0 R >>/n",*ObjectIndex+2);
     fprintf(AStream,"stream/n");

        /* stream */
        Length=ftell(AStream);
          fprintf(AStream,"q/n");
          fprintf(AStream,"%d 0 0 %d 0 0 cm/n",w,h);
          fprintf(AStream,"/Im0 Do/n");
          fprintf(AStream,"Q/n");
        Length=ftell(AStream)-Length;

     fprintf(AStream,"endstream/n");
     fprintf(AStream,"endobj/n");
   *ObjectIndex=*ObjectIndex+1;

   /* stream Length */
   ObjectPosArray[*ObjectIndex] =(DWORD)ftell(AStream);
     fprintf(AStream,"%d 0 obj/n",*ObjectIndex+1);
     fprintf(AStream,"%d/n",Length);
     fprintf(AStream,"endobj/n");
   *ObjectIndex=*ObjectIndex+1;
}

int JPGtoPDF(const char *OpenName,const char *SaveName)
{
 BOOL  cmyk;
 WORD  w,h;
 int   ObjectIndex;
 DWORD ObjectPosArray[10];
 FILE  *JPGStream,*AStream;

    ObjectIndex=0;

    /* Open Jpeg File */
    JPGStream=fopen(OpenName,"rb");
    if(JPGStream==NULL)
    {
       printf("Error : Can not Open File./n");
       return(-1); 
    }

    /* Get JPEG size */
    if (GetJPEGSize(JPGStream,&w,&h,&cmyk)==FALSE)
    {
       printf("Error : Can not get JPEG size./n");
       return(-1); 
    }

    /* Create PDF File */
    AStream=fopen(SaveName,"wb+");
    if(AStream==NULL)
    {
        printf("Error : Can not Create File./n");
        fclose(JPGStream);
        return(-1);
    }

    /* ------------------------------------------------------------- */
    /*  Writting PDF                                                 */
    /* ------------------------------------------------------------- */

    /* PDF version */
    fprintf(AStream,"%%PDF-1.2/n");

    /* Catalog */
    ObjectPosArray[ObjectIndex] =ftell(AStream);
      fprintf(AStream,"%d 0 obj/n",ObjectIndex+1);
      fprintf(AStream,"<</n");
      fprintf(AStream,"/Type /Catalog/n");
      fprintf(AStream,"/Pages 2 0 R/n");
      /* View Option (100%) */
      /*fprintf(AStream,"/OpenAction [3 0 R /XYZ -32768 -32768 1 ]/n"); */
      fprintf(AStream,">>/n");
      fprintf(AStream,"endobj/n");
    ObjectIndex++;

     /* Parent Pages */
     ObjectPosArray[ObjectIndex] =ftell(AStream);
       fprintf(AStream,"%d 0 obj/n",ObjectIndex+1);
       fprintf(AStream,"<</n");
       fprintf(AStream,"/Type /Pages/n");
       fprintf(AStream,"/Kids [ 3 0 R ]/n");
       fprintf(AStream,"/Count 1/n");
       fprintf(AStream,">>/n");
       fprintf(AStream,"endobj/n");
     ObjectIndex++;

     /* Kids Page */
     ObjectPosArray[ObjectIndex] =ftell(AStream);
       fprintf(AStream,"%d 0 obj/n",ObjectIndex+1);
       fprintf(AStream,"<</n");
       fprintf(AStream,"/Type /Page/n");
       fprintf(AStream,"/Parent 2 0 R/n");
       fprintf(AStream,"/Resources/n");
       fprintf(AStream,"<</n");
       fprintf(AStream,"/XObject << /Im0 4 0 R >>/n");
       fprintf(AStream,"/ProcSet [ /PDF /ImageC ]/n");
       fprintf(AStream,">>/n");
       fprintf(AStream,"/MediaBox [ 0 0 %d %d ]/n",w,h);
       fprintf(AStream,"/Contents 5 0 R/n");
       fprintf(AStream,">>/n");
       fprintf(AStream,"endobj/n");
     ObjectIndex++;

     /* XObject Resource */
     ObjectPosArray[ObjectIndex] =ftell(AStream);
       fprintf(AStream,"%d 0 obj/n",ObjectIndex+1);
       fprintf(AStream,"<</n");
       fprintf(AStream,"/Type /XObject/n");
       fprintf(AStream,"/Subtype /Image/n");
       fprintf(AStream,"/Name /Im0/n");
       fprintf(AStream,"/Width %d/n",w);
       fprintf(AStream,"/Height %d/n",h);
       fprintf(AStream,"/BitsPerComponent 8/n");
       fprintf(AStream,"/Filter [/DCTDecode]/n");
       if (cmyk==FALSE)
         fprintf(AStream,"/ColorSpace /DeviceRGB/n");
       else
       {
         fprintf(AStream,"/ColorSpace /DeviceCMYK/n");
         fprintf(AStream,"/Decode[1 0 1 0 1 0 1 0]/n"); /* Photoshop CMYK (NOT BIT) */
       }
       fprintf(AStream,"/Length %d >>/n",GetFileSize(JPGStream));
       fprintf(AStream,"stream/n");      
       if (CopyStream(JPGStream,AStream)==FALSE)
       {
          printf("Error : No Memory /n");
          return(-1);
       }
       fprintf(AStream,"endstream/n");
       fprintf(AStream,"endobj/n");
     ObjectIndex++;

    /* Contents Stream & Object */
    Write_ContentsObject(AStream,ObjectPosArray,&ObjectIndex,w,h);

    /* CrossReferenceTable */
    ObjectPosArray[ObjectIndex] =ftell(AStream);
    Write_CrossReferenceTable(AStream,ObjectPosArray,(int)ObjectIndex);

    /* trailer */
    fprintf(AStream,"trailer/n");
    fprintf(AStream,"<</n");
    fprintf(AStream,"/Size %d/n",ObjectIndex+1);
    fprintf(AStream,"/Root 1 0 R/n");
    fprintf(AStream,">>/n");
    fprintf(AStream,"startxref/n");
    fprintf(AStream,"%d/n",ObjectPosArray[ObjectIndex]);
    fprintf(AStream,"%%%%EOF/n");

    fclose(JPGStream); fclose(AStream);

    printf("/nSuccess!/n");

    return (0);
}
 

發佈了6 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章