JPGファイルをPDFファイルへ変換する(C++)
JPGファイルをPDFファイルへ変換する事のできるC++のソースコードです。関数になっていますのでそのまま使用できます
ソースコード
10年以上前に作成した古いコードで私すら覚えていないのですが、何かのお役に立てると嬉しいです。
#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); }
スポンサーリンク
関連記事
公開日:2015年01月08日 最終更新日:2015年02月18日
記事NO:00091