1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C语言实现png图片转为pdf文件

C语言实现png图片转为pdf文件

时间:2018-09-25 13:39:35

相关推荐

C语言实现png图片转为pdf文件

png图片转PDF文件(C语言)

准备代码展示效果展示功能描述

准备

linux系统,libharu库,libgtk库。

代码展示

#include <png.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <setjmp.h>#include "hpdf.h"#include <zlib.h>#include <dirent.h>#include <sys/stat.h>#include <unistd.h>#include <gtk/gtk.h>#define HEADLINESIZE 45#define HEADLINEPOSX 225#define HEADLINEPOSY (1300-100)#define OTHERSIZE 20#define OTHERX 20 //距离pdf页左边位置#define FIRSTY (1300-175)#define SECONDY (1300-185)#define THIRDY (1300-215)#define FORTHY (1300-255)#define FIFTHY (1300-265)#define SIXTHY (245)#define SEVENTHY (195)#define EIGHTHY 185#define LASTY 160#define PICSH (1300-1000)#define PICFH (1300-635)//第一行图片纵坐标char filename3[50][255];//读取目标目录文件名存放int j=0;char filename4[50][255];//读取源目录文件名存放int pngnum=0,n=0;int x=0,b=0,pstn=1;#ifndef HPDF_NOPNGLIBjmp_buf env;#ifdef HPDF_DLLvoid __stdcall#elsevoid#endif//关于PDF操作的错误处理error_handler (HPDF_STATUS error_no,HPDF_STATUS detail_no,void *user_data){printf ("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no,(HPDF_UINT)detail_no);longjmp(env, 1);}//读取目的目录文件void printdir(char *dir){int i=0;DIR *dp;struct dirent *entry;if((dp =opendir(dir)) ==NULL)//打开目录,错误就报错{fprintf(stderr,"cannot open directory: %s\n",dir);return;}chdir(dir);//进入目录//读取目录下的文件,将名字保存至filename3while((entry = readdir(dp)) != NULL){if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0)continue;strcat(filename3[i],entry->d_name);printf("%s\n",filename3[i]);i++;pngnum++;}}//读取源目录文件void scaldir(char *dir){int i=0;DIR *dp;struct dirent *entry;if((dp =opendir(dir)) ==NULL)//打开目录,错误就报错{fprintf(stderr,"cannot open directory: %s\n",dir);return;}chdir(dir);//进入目录//读取目录下的文件,将名字保存至filename3while((entry = readdir(dp)) != NULL){if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0)continue;strcat(filename4[i],entry->d_name);printf("%s\n",filename4[i]);i++;j++;}}//将png图像插入PDF页上int draw_image (HPDF_Doc pdf,const char *filename,float x,float y){const char* FILE_SEPARATOR = "/";char filename1[255];HPDF_Page page = HPDF_GetCurrentPage (pdf);HPDF_Image image;strcpy(filename1, "pictureo");strcat(filename1, FILE_SEPARATOR);strcat(filename1, filename);image = HPDF_LoadPngImageFromFile (pdf, filename1);HPDF_Page_DrawImage (page, image, x, y, HPDF_Image_GetWidth (image),HPDF_Image_GetHeight (image));return 0; }//横线绘制void line(HPDF_Doc pdf,int y){ HPDF_Page page = HPDF_GetCurrentPage (pdf);HPDF_Page_SetDash (page, NULL, 0, 0);HPDF_Page_MoveTo (page, 0, y);HPDF_Page_LineTo (page, 900, y);HPDF_Page_Stroke (page);}//插入文字void word_display(HPDF_Doc pdf,HPDF_Font font,const char *word,int x,int y,int size){HPDF_Page page = HPDF_GetCurrentPage (pdf);HPDF_Page_BeginText (page);HPDF_Page_SetFontAndSize (page, font, size);//字体,尺寸HPDF_Page_MoveTextPos (page, x,y);//文字位置HPDF_Page_ShowText (page,word);HPDF_Page_EndText (page);}//PDF制作void page_display(HPDF_Doc pdf,HPDF_Font font){HPDF_Page page = HPDF_GetCurrentPage (pdf);HPDF_Page_SetWidth (page, 900);HPDF_Page_SetHeight (page,1300);word_display(pdf,font,"超声医学影像报告单",HEADLINEPOSX,HEADLINEPOSY,HEADLINESIZE);word_display(pdf,font,"医院名称:检查日期:23-07-",OTHERX,FIRSTY,OTHERSIZE);line(pdf,SECONDY);word_display(pdf,font,"ID:0723110209 姓名:",OTHERX,THIRDY,OTHERSIZE);word_display(pdf,font,"性别: 年龄:0天 检查项目:颈动脉 超声号:1",OTHERX,FORTHY,OTHERSIZE);line(pdf,FIFTHY);word_display(pdf,font,"超声所见:",OTHERX,SIXTHY,OTHERSIZE);word_display(pdf,font,"诊断意见:",OTHERX,SEVENTHY,OTHERSIZE);line(pdf,EIGHTHY);word_display(pdf,font,"诊断医生: 主治医生:",OTHERX,LASTY,OTHERSIZE);//将在目标目录下读取到的文件插入对应的PDF页中,一页最多四张图if((pngnum%4) != 0){ if(x < (n-1)){while(1){ switch(pstn){case 1:draw_image(pdf,filename3[b],OTHERX,PICFH);pstn++;break;case 2:draw_image(pdf,filename3[b],(OTHERX+460),PICFH);pstn++;break;case 3:draw_image(pdf,filename3[b],OTHERX,PICSH);pstn++;break;case 4:draw_image(pdf,filename3[b],(OTHERX+460),PICSH);pstn = 1;break;}b++;if(b == (4*(x+1)))break;}}else if((x>=(n-1))&&(pngnum%4 == 3)){while(1){switch(pstn){case 1:draw_image(pdf,filename3[b++],OTHERX,PICFH);pstn++;break;case 2:draw_image(pdf,filename3[b++],(OTHERX+460),PICFH);pstn++;break;case 3:draw_image(pdf,filename3[b++],OTHERX,PICSH);pstn++;break;}if(pstn == 4)break;}}else if((x>=(n-1))&&(pngnum%4 == 2)){while(1){switch(pstn){case 1:draw_image(pdf,filename3[b++],OTHERX,PICFH);pstn++;break;case 2:draw_image(pdf,filename3[b++],(OTHERX+460),PICFH);pstn++;break;}if(pstn == 3)break;}}else if((x>=(n-1))&&(pngnum%4 == 1)){draw_image(pdf,filename3[b],OTHERX,PICFH);}}else{while(1){switch(pstn){case 1:draw_image(pdf,filename3[b],OTHERX,PICFH);pstn++;break;case 2:draw_image(pdf,filename3[b],(OTHERX+460),PICFH);pstn++;break;case 3:draw_image(pdf,filename3[b],OTHERX,PICSH);pstn++;break;case 4:draw_image(pdf,filename3[b],(OTHERX+460),PICSH);pstn = 1;break;}b++;if(b == 4*(x+1))break;}}x++; }int main (int argc, char **argv){//文件处理变量定义int temp=0;const char * handle;const char* FILE_SEPARATOR = "/";const GdkPixbuf *src_pixbuf[50];GdkPixbuf *dest_pixbuf[50];//PDF处理变量定义HPDF_Doc pdf;HPDF_Font font;HPDF_Page page[100];char fname[256];int i=0;HPDF_Destination dst;strcpy (fname, argv[0]);strcat (fname, ".pdf");scaldir("./pictures");//将源目录下读取到的文件缩小,并存放至目标目录while(1){src_pixbuf[temp] = gdk_pixbuf_new_from_file(filename4[temp], NULL);temp++;if(temp == j){temp=0;break;}}chdir("../pictureo");//进入目标目录while(1){dest_pixbuf[temp]=gdk_pixbuf_scale_simple(src_pixbuf[temp],440,360,GDK_INTERP_BILINEAR);gdk_pixbuf_save (dest_pixbuf[temp],filename4[temp],"png",NULL,NULL,NULL);temp++;if(temp == j){temp=0;break;}}chdir("..");//返回上级目录printdir("./pictureo");//获取png文件夹下的文件名chdir("..");pdf = HPDF_New (error_handler, NULL);//创建新的PDF文档if (!pdf) {printf ("error: cannot create PdfDoc object\n");return 1;}/* error-handler */if (setjmp(env)) {HPDF_Free (pdf);return 1;}HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL);//设置PDF的压缩模式为图片文字等全压缩//设置PDF文档字体HPDF_UseCNSFonts(pdf);HPDF_UseCNTFonts(pdf);HPDF_UseCNTEncodings(pdf);HPDF_UseCNSEncodings(pdf);font = HPDF_GetFont(pdf, "SimSun", "GBK-EUC-H");//设置为宋体,方正//pdf页创建,并在各页上绘制文字,图像if((pngnum%4) != 0)n=pngnum/4+1;elsen=pngnum/4;while(1){if(i >= n)break;page[i] = HPDF_AddPage (pdf);page_display(pdf,font);i++;}/* save the document to a file */HPDF_SaveToFile (pdf,fname);HPDF_Free (pdf);return 0;}#else /* HPDF_NOPNGLIB */int main(){printf("WARNING: if you want to run this demo, \n""make libhpdf with HPDF_USE_PNGLIB option.\n");return 0;}#endif /* HPDF_NOPNGLIB */

效果展示

功能描述

该程序实现了从源目录读取图片,并将图片缩小后保存至目标文件,之后从目标文件获得图片并将其添加至pdf页上,每页pdf上最多四张图片,即假如我有九张图,程序就会生成三页pdf,图片和文字是分开的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。