gfxresult_t* pdf_finish(gfxdevice_t*dev) { internal_t*i = (internal_t*)dev->internal; if(i->config_addblankpages) { int mod = i->num_pages%i->config_addblankpages; if(mod) { int count = i->config_addblankpages - mod; int t; for(t=0;t<count;t++) { dev->startpage(dev, i->width, i->height); dev->endpage(dev); } } } PDF_end_document(i->p, ""); //PDF_close(i->p); PDF_delete(i->p); gfxresult_t*result = (gfxresult_t*)malloc(sizeof(gfxresult_t)); memset(result, 0, sizeof(gfxresult_t)); result->save = pdfresult_save; result->get = pdfresult_get; result->destroy = pdfresult_destroy; result->internal = 0; result->internal = malloc(sizeof(pdfresult_internal_t)); pdfresult_internal_t*ri = (pdfresult_internal_t*)result->internal; ri->tempfile = i->tempfile;i->tempfile=0; free(dev->internal);dev->internal = 0;i=0; return result; }
/* The default error handler for C and C++ clients */ static void pdf_c_errorhandler(PDF *p, int type, const char* shortmsg) { char msg[2048]; /* * A line like this allows custom error handlers to supply their * own program name */ sprintf(msg, "PDFlib %s: %s\n", pdf_error_names[type], shortmsg); switch (type) { /* Issue a warning message and continue */ case PDF_NonfatalError: (void) fprintf(stderr, msg); return; /* give up in all other cases */ case PDF_MemoryError: case PDF_IOError: case PDF_RuntimeError: case PDF_IndexError: case PDF_TypeError: case PDF_DivisionByZero: case PDF_OverflowError: case PDF_SyntaxError: case PDF_ValueError: case PDF_SystemError: case PDF_UnknownError: default: (void) fprintf(stderr, msg); /* print message */ PDF_delete(p); /* clean up PDFlib */ exit(99); /* good-bye */ } }
int create(char *filename, char *options) { // find a place int i; PDF *pdf; for (i = 0; i < MAX_PDF; i++) { if (instances[i] == 0) { break; } } if (i >= MAX_PDF) { SET_ERROR("pdflib pool full"); return -1; } pdf = PDF_new(); if (pdf == (PDF *) 0) { SET_ERROR("can't create new PDF object"); return -1; } instances[i] = pdf; PDF_TRY(pdf) { #if PDFLIB_MAJORVERSION < 9 PDF_set_parameter(pdf, "hypertextencoding", "host"); #else PDF_set_option(pdf, "errorpolicy=return"); #endif if (PDF_begin_document(pdf, filename, 0, options) == -1) { SET_ERROR(PDF_get_errmsg(pdf)); PDF_delete(pdf); instances[i] = 0; return -1; } } PDF_CATCH(pdf) { SET_ERROR(PDF_get_errmsg(pdf)); PDF_delete(pdf); instances[i] = 0; return -1; } return i; }
int abort(Dart_CObject *handle) { int i; if (handle->type != Dart_CObject_kInt32) { SET_ERROR("handle required"); return -1; } i = handle->value.as_int32; if (i >= MAX_PDF || instances[i] == 0) { SET_ERROR("bad handle"); return -1; } PDF_delete(instances[i]); instances[i] = 0; return 0; }
int main(void) { PDF *p; int manual, page; int font, row, col; const int maxrow = 2; const int maxcol = 2; char optlist[128]; int startpage = 1, endpage = 4; const float width = 500, height = 770; int pageno; const char *infile = "reference.pdf"; /* This is where font/image/PDF input files live. Adjust as necessary. */ char *searchpath = "../data"; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { /* open new PDF file */ if (PDF_open_file(p, "quickreference.pdf") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(2); } PDF_set_parameter(p, "SearchPath", searchpath); /* This line is required to avoid problems on Japanese systems */ PDF_set_parameter(p, "hypertextencoding", "host"); PDF_set_info(p, "Creator", "quickreference.c"); PDF_set_info(p, "Author", "Thomas Merz"); PDF_set_info(p, "Title", "mini imposition demo (C)"); manual = PDF_open_pdi(p, infile, "", 0); if (manual == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(2); } row = 0; col = 0; PDF_set_parameter(p, "topdown", "true"); for (pageno = startpage; pageno <= endpage; pageno++) { if (row == 0 && col == 0) { PDF_begin_page(p, width, height); font = PDF_load_font(p, "Helvetica-Bold", 0, "host", ""); PDF_setfont(p, font, 18); PDF_set_text_pos(p, 24, 24); PDF_show(p, "PDFlib Quick Reference"); } page = PDF_open_pdi_page(p, manual, pageno, ""); if (page == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(2); } sprintf(optlist, "scale %f", (float) 1/maxrow); PDF_fit_pdi_page(p, page, width/maxcol*col, (row + 1) * height/maxrow, optlist); PDF_close_pdi_page(p, page); col++; if (col == maxcol) { col = 0; row++; } if (row == maxrow) { row = 0; PDF_end_page(p); } } /* finish the last partial page */ if (row != 0 || col != 0) PDF_end_page(p); PDF_close(p); PDF_close_pdi(p, manual); } PDF_CATCH(p) { printf("PDFlib exception occurred in quickreference sample:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); return 0; }
int main(void) { /* This is where the data files are. Adjust as necessary.*/ const char * searchpath = "../data"; const char *targetname = "x5target.pdf"; PDF *p; char optlist[1024]; int font, proxy; double linewidth=2; double width, height; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); PDF_set_parameter(p, "SearchPath", searchpath); if (PDF_begin_document(p, "starter_pdfx5g.pdf", 0, "pdfx=PDF/X-5g") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_set_info(p, "Creator", "PDFlib starter sample"); PDF_set_info(p, "Title", "starter_pdfx5g"); /* Open the output intent profile */ if (PDF_load_iccprofile(p, "ISOcoated.icc", 0, "usage=outputintent") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); printf("Please install the ICC profile package from " "www.pdflib.com to run the PDF/X-5g starter sample.\n"); PDF_delete(p); return(2); } /* Font embedding is required for PDF/X */ font = PDF_load_font(p, "LuciduxSans-Oblique", 0, "winansi", "embedding"); if (font == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } /* Create a template which will serve as proxy. The referenced * page (the target) is attached to the proxy. * The template width and height will be determined automatically, * so we don't have to supply them. */ sprintf(optlist, "reference={filename=%s pagenumber=1}", targetname); proxy = PDF_begin_template_ext(p, 0, 0, optlist); if (proxy == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } width = PDF_info_image(p, proxy, "imagewidth", ""); height = PDF_info_image(p, proxy, "imageheight", ""); /* Draw a crossed-out rectangle to visualize the proxy. * Attention: if we use the exact corner points, one half of the * linewidth would end up outside the template, and therefore be * clipped. */ PDF_setlinewidth(p, linewidth); PDF_moveto(p, linewidth/2, linewidth/2); PDF_lineto(p, width-linewidth/2, linewidth/2); PDF_lineto(p, width-linewidth/2, height-linewidth/2); PDF_lineto(p, linewidth/2, height-linewidth/2); PDF_lineto(p, linewidth/2, linewidth/2); PDF_lineto(p, width-linewidth/2, height-linewidth/2); PDF_moveto(p, width-linewidth/2, linewidth/2); PDF_lineto(p, linewidth/2, height-linewidth/2); PDF_stroke(p); PDF_setfont(p, font, 24); sprintf(optlist, "fitmethod=auto position=center boxsize={%f %f}", width, height); PDF_fit_textline(p, "Proxy replaces target here", 0, 0, 0, optlist); PDF_end_template_ext(p, 0, 0); /* Create the page */ PDF_begin_page_ext(p, 595, 842, ""); PDF_setfont(p, font, 18); PDF_fit_textline(p, "PDF/X-5 starter sample with reference to an external page", 0, 50, 700, ""); /* Place the proxy on the page */ PDF_fit_image(p, proxy, 50, 50, "boxsize={500 500} fitmethod=meet"); PDF_end_page_ext(p, ""); PDF_end_document(p, ""); } PDF_CATCH(p) { printf("PDFlib exception occurred:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); return 0; }
int main(int argc, char *argv[]) { char *pdffilename = NULL; FILE *imagefile; PDF *p; int image; int opt; int resolution = 0; int page_numbering = 0; int current_page = 1; char optlist[128]; while ((opt = getopt(argc, argv, "r:o:p:w")) != -1) switch (opt) { case 'o': pdffilename = optarg; break; case 'p': page_numbering = 1; if (optarg) { current_page = atoi(optarg); } break; case 'r': if (!optarg || (resolution = atoi(optarg)) <= 0) { fprintf(stderr, "Error: non-positive resolution.\n"); usage(); } case '?': default: usage(); } if (optind == argc) { fprintf(stderr, "Error: no image files given.\n"); usage(); } if (pdffilename == NULL) { fprintf(stderr, "Error: no output file given.\n"); usage(); } p = PDF_new(); if (PDF_open_file(p, pdffilename) == -1) { fprintf(stderr, "Error: cannot open output file %s.\n", pdffilename); exit(1); } PDF_set_info(p, "Creator", "pdfimage"); while (optind++ < argc) { fprintf(stderr, "Processing image file '%s'...\n", argv[optind-1]); image = PDF_load_image(p, "auto", argv[optind-1], 0, ""); if (image == -1) { fprintf(stderr, "Error: %s (skipped).\n", PDF_get_errmsg(p)); continue; } /* dummy page size, will be adjusted later */ PDF_begin_page(p, 20, 20); /* define outline with filename or page number */ if (page_numbering) { char buf[32]; sprintf(buf, "Page %d", current_page++); PDF_add_bookmark(p, buf, 0, 0); } else { PDF_add_bookmark(p, argv[optind-1], 0, 0); } if (resolution != 0) sprintf(optlist, "dpi %d", resolution); else sprintf(optlist, "adjustpage"); PDF_fit_image(p, image, 0.0, 0.0, optlist); PDF_end_page(p); } PDF_close(p); PDF_delete(p); exit(0); }
int main(void) { /* This is where the data files are. Adjust as necessary. */ const char *searchpath = "../data"; const char *outfile = "starter_block.pdf"; const char *infile = "block_template.pdf"; const char *imagefile = "new.jpg"; PDF *p; int i, j, inpage, indoc, image; char optlist[1024], buf[1024]; /* Names of the person-related blocks contained on the imported page */ const char *addressblocks[] = { "name", "street", "city" }; /* number of address blocks */ const int nblocks = sizeof(addressblocks) / sizeof(addressblocks[0]); /* Data related to various persons used for personalization */ const char *persons[][3] = { {"Mr Maurizio Moroni", "Strada Provinciale 124", "Reggio Emilia"}, {"Ms Dominique Perrier", "25, rue Lauriston", "Paris"}, {"Mr Liu Wong", "55 Grizzly Peak Rd.", "Butte"} }; /* number of persons */ const int npersons = sizeof(persons) / sizeof(persons[0]); /* Static text simulates database-driven variable contents */ const char *intro = "Dear"; const char *goodbye = "Yours sincerely,\nVictor Kraxi"; const char *announcement = "Our <fillcolor=red>BEST PRICE OFFER<fillcolor=black> includes today:" "\n\n" "Long Distance Glider\nWith this paper rocket you can send all your " "messages even when sitting in a hall or in the cinema pretty near " "the back.\n\n" "Giant Wing\nAn unbelievable sailplane! It is amazingly robust and " "can even do aerobatics. But it is best suited to gliding.\n\n" "Cone Head Rocket\nThis paper arrow can be thrown with big swing. " "We launched it from the roof of a hotel. It stayed in the air a " "long time and covered a considerable distance.\n\n" "Super Dart\nThe super dart can fly giant loops with a radius of 4 " "or 5 meters and cover very long distances. Its heavy cone point is " "slightly bowed upwards to get the lift required for loops.\n\n" "Visit us on our Web site at www.kraxi.com!"; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { PDF_set_parameter(p, "SearchPath", searchpath); /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); if (PDF_begin_document(p, outfile, 0, "destination={type=fitwindow} pagelayout=singlepage") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_set_info(p, "Creator", "PDFlib starter sample"); PDF_set_info(p, "Title", "starter_block"); /* Open the Block template which contains PDFlib Blocks */ indoc = PDF_open_pdi_document(p, infile, 0, ""); if (indoc == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } /* Open the first page and clone the page size */ inpage = PDF_open_pdi_page(p, indoc, 1, "cloneboxes"); if (inpage == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } image = PDF_load_image(p, "auto", imagefile, 0, ""); if (image == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(3); } /* Based on the imported page generate several pages with the blocks * being filled with data related to different persons */ for (i = 0; i < npersons; i++) { /* Start the output page with a dummy size */ PDF_begin_page_ext(p, 10, 10, ""); /* Place the imported page on the output page, and clone all * page boxes which are present in the input page; this will * override the dummy size used in begin_page_ext(). */ PDF_fit_pdi_page(p, inpage, 0, 0, "cloneboxes"); /* Option list for text blocks */ strcpy(optlist, "encoding=winansi embedding"); /* Loop over all person-related blocks. Fill the j-th block with the * corresponding entry of the persons array. */ for (j = 0; j < nblocks; j++) { if (PDF_fill_textblock(p, inpage, addressblocks[j], persons[i][j], 0, optlist) == -1) printf("Warning: %s\n", PDF_get_errmsg(p)); } /* Fill the "intro" block */ sprintf(buf, "%s %s,", intro, persons[i][0]); if (PDF_fill_textblock(p, inpage, "intro", buf, 0, optlist) == -1) printf("Warning: %s\n", PDF_get_errmsg(p)); /* Fill the "announcement" block */ if (PDF_fill_textblock(p, inpage, "announcement", announcement, 0, optlist) == -1) printf("Warning: %s\n", PDF_get_errmsg(p)); /* Fill the "goodbye" block */ if (PDF_fill_textblock(p, inpage, "goodbye", goodbye, 0, optlist) == -1) printf("Warning: %s\n", PDF_get_errmsg(p)); /* Fill the image block */ strcpy(optlist, ""); /* Option list */ if (PDF_fill_imageblock(p, inpage, "icon", image, optlist) == -1) printf("Warning: %s\n", PDF_get_errmsg(p)); PDF_end_page_ext(p, ""); } PDF_close_pdi_page(p, inpage); PDF_close_pdi_document(p, indoc); PDF_close_image(p, image); PDF_end_document(p, ""); } PDF_CATCH(p) { printf("PDFlib exception occurred:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); return 0; }
int main(void) { PDF *p; int image; char *imagefile = "nesrin.jpg"; /* This is where font/image/PDF input files live. Adjust as necessary. */ char *searchpath = "../data"; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p){ /* open new PDF file */ if (PDF_open_file(p, "image.pdf") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(2); } PDF_set_parameter(p, "SearchPath", searchpath); /* This line is required to avoid problems on Japanese systems */ PDF_set_parameter(p, "hypertextencoding", "host"); PDF_set_info(p, "Creator", "image.c"); PDF_set_info(p, "Author", "Thomas Merz"); PDF_set_info(p, "Title", "image sample (C)"); image = PDF_load_image(p, "auto", imagefile, 0, ""); if (image == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(3); } /* dummy page size, will be adjusted by PDF_fit_image() */ PDF_begin_page(p, 10, 10); PDF_fit_image(p, image, (float) 0.0, (float) 0.0, "adjustpage"); PDF_close_image(p, image); PDF_end_page(p); /* close page */ PDF_close(p); /* close PDF document */ } PDF_CATCH(p) { printf("PDFlib exception occurred in image sample:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); /* delete the PDFlib object */ return 0; }
int main(void) { /* This is where the data files are. Adjust as necessary.*/ const char * searchpath = "../data"; PDF *p; const char * imagefile = "nesrin.jpg"; char optlist[1024]; int font, image, spot, icc; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); PDF_set_parameter(p, "SearchPath", searchpath); if (PDF_begin_document(p, "starter_pdfx.pdf", 0, "pdfx=PDF/X-3:2002") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_set_info(p, "Creator", "PDFlib starter sample"); PDF_set_info(p, "Title", "starter_pdfx"); /* * You can use one of the Standard output intents (e.g. for SWOP * printing) which do not require an ICC profile: PDF_load_iccprofile(p, "CGATS TR 001", 0, "usage=outputintent"); * However, if you use ICC or Lab color you must load an ICC * profile as output intent: */ if (PDF_load_iccprofile(p, "ISOcoated.icc", 0, "usage=outputintent") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); printf("Please install the ICC profile package from " "www.pdflib.com to run the PDF/X starter sample.\n"); PDF_delete(p); return(2); } PDF_begin_page_ext(p, 595, 842, ""); /* Font embedding is required for PDF/X */ font = PDF_load_font(p, "LuciduxSans-Oblique", 0, "winansi", "embedding"); if (font == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_setfont(p, font, 24); spot = PDF_makespotcolor(p, "PANTONE 123 C", 0); PDF_setcolor(p, "fill", "spot", spot, 1.0, 0.0, 0.0); PDF_fit_textline(p, "PDF/X-3:2002 starter", 0, 50, 700, ""); /* The RGB image below needs an ICC profile; we use sRGB. */ icc = PDF_load_iccprofile(p, "sRGB", 0, ""); sprintf(optlist, "iccprofile=%d", icc); image = PDF_load_image(p, "auto", imagefile, 0, optlist); if (image == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_fit_image(p, image, (float) 0.0, (float) 0.0, "scale=0.5"); PDF_end_page_ext(p, ""); PDF_end_document(p, ""); } PDF_CATCH(p) { printf("PDFlib exception occurred:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); return 0; }
int main(void) { /* This is where the data files are. Adjust as necessary. */ const char* searchpath = "../data"; PDF * p; const char* imagefile = "nesrin.jpg"; char* optlist; int font, image; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); PDF_set_parameter(p, "SearchPath", searchpath); if (PDF_begin_document(p, "starter_basic.pdf", 0, "") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_set_info(p, "Creator", "PDFlib starter sample"); PDF_set_info(p, "Title", "starter_basic"); /* We load the image before the first page, and use it * on all pages */ image = PDF_load_image(p, "auto", imagefile, 0, ""); if (image == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } /* Page 1 */ PDF_begin_page_ext(p, 595, 842, ""); font = PDF_load_font(p, "Helvetica-Bold", 0, "winansi", ""); if (font == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_setfont(p, font, 24); PDF_set_text_pos(p, 50, 700); PDF_show(p, "Hello world!"); PDF_fit_image(p, image, (float) 0.0, (float) 0.0, "scale=0.25"); PDF_end_page_ext(p, ""); /* Page 2 */ PDF_begin_page_ext(p, 595, 842, ""); /* red rectangle */ PDF_setcolor(p, "fill", "rgb", 1.0, 0.0, 0.0, 0.0); PDF_rect(p, 200, 200, 250, 150); PDF_fill(p); /* blue circle */ PDF_setcolor(p, "fill", "rgb", 0.0, 0.0, 1.0, 0.0); PDF_arc(p, 400, 600, 100, 0, 360); PDF_fill(p); /* thick gray line */ PDF_setcolor(p, "stroke", "gray", 0.5, 0.0, 0.0, 0.0); PDF_setlinewidth(p, 10); PDF_moveto(p, 100, 500); PDF_lineto(p, 300, 700); PDF_stroke(p); /* Using the same image handle means the data will be copied * to the PDF only once, which saves space. */ PDF_fit_image(p, image, 150.0, 25.0, "scale=0.25"); PDF_end_page_ext(p, ""); /* Page 3 */ PDF_begin_page_ext(p, 595, 842, ""); /* Fit the image to a box of predefined size (without distortion) */ optlist = "boxsize={400 400} position={center} fitmethod=meet"; PDF_fit_image(p, image, 100, 200, optlist); PDF_end_page_ext(p, ""); PDF_close_image(p, image); PDF_end_document(p, ""); } PDF_CATCH(p) { printf("PDFlib exception occurred:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); return 0; }
int main(void) { /* This is where the data files are. Adjust as necessary. */ const char* searchpath = "../data"; const char* outfile = "starter_layer.pdf"; PDF * p; const char* rgb = "nesrin.jpg"; const char* gray = "nesrin_gray.jpg"; #define BUFLEN 1024 char buf[BUFLEN]; int font, imageRGB, imageGray, layerRGB, layerGray, layerEN, layerDE; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { PDF_set_parameter(p, "SearchPath", searchpath); /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); /* Open the document with the "Layers" navigation tab visible */ if (PDF_begin_document(p, outfile, 0, "openmode=layers") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_set_info(p, "Creator", "PDFlib starter sample"); PDF_set_info(p, "Title", "starter_layer"); /* Load the font */ font = PDF_load_font(p, "Helvetica", 0, "winansi", ""); if (font == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } /* Load the Grayscale image */ imageGray = PDF_load_image(p, "auto", gray, 0, ""); if (imageGray == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } /* Load the RGB image */ imageRGB = PDF_load_image(p, "auto", rgb, 0, ""); if (imageRGB == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } /* * Define all layers which will be used, and their relationships. * This should be done before the first page if the layers are * used on more than one page. */ /* Define the layer "RGB" */ layerRGB = PDF_define_layer(p, "RGB", 0, ""); /* Define the layer "Grayscale" which is hidden when opening the * document or printing it. */ layerGray = PDF_define_layer(p, "Grayscale", 0, "initialviewstate=false initialprintstate=false"); /* At most one of the "Grayscale" and "RGB" layers should be visible */ sprintf(buf, "group={%d %d}", layerGray, layerRGB); PDF_set_layer_dependency(p, "Radiobtn", buf); /* Define the layer "English" */ layerEN = PDF_define_layer(p, "English", 0, ""); /* Define the layer "German" which is hidden when opening the document * or printing it. */ layerDE = PDF_define_layer(p, "German", 0, "initialviewstate=false initialprintstate=false"); /* At most one of the "English" and "German" layers should be visible */ sprintf(buf, "group={%d %d}", layerEN, layerDE); PDF_set_layer_dependency(p, "Radiobtn", buf); /* Start page */ PDF_begin_page_ext(p, 0, 0, "width=a4.width height=a4.height"); /* Place the RGB image on the layer "RGB" */ PDF_begin_layer(p, layerRGB); PDF_fit_image(p, imageRGB, 100, 400, "boxsize={400 300} fitmethod=meet"); /* Place the Grayscale image on the layer "Grayscale" */ PDF_begin_layer(p, layerGray); PDF_fit_image(p, imageGray, 100, 400, "boxsize={400 300} fitmethod=meet"); /* Place an English image caption on the layer "English" */ PDF_begin_layer(p, layerEN); sprintf(buf, "font=%d fontsize=20", font); PDF_fit_textline(p, "This is the Nesrin image.", 0, 100, 370, buf); /* Place a German image caption on the layer "German". */ PDF_begin_layer(p, layerDE); sprintf(buf, "font=%d fontsize=20", font); PDF_fit_textline(p, "Das ist das Nesrin-Bild.", 0, 100, 370, buf); PDF_end_layer(p); PDF_end_page_ext(p, ""); PDF_end_document(p, ""); } PDF_CATCH(p) { printf("PDFlib exception occurred:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); return 0; }
/* ** cg_create_document() ** Create the ouput PDF file. */ yerr_t cg_create_document(char *output, cg_t *carta) { PDF *p; int i; yerr_t return_value = YENOERR; if (!(carta->p = p = PDF_new())) { YLOG_ADD(YLOG_ERR, "PDF allocation error."); return (YEUNDEF); } PDF_TRY(p) { ystr_t ys = ys_new(""); /* document's initialization */ ys_printf(&ys, "compatibility %s", (carta->pdf_version == PDF_13) ? "1.3" : (carta->pdf_version == PDF_15) ? "1.5" : "1.4"); if (carta->master_password && carta->user_password) { ys_cat(&ys, " masterpassword "); ys_cat(&ys, carta->master_password); ys_cat(&ys, " userpassword "); ys_cat(&ys, carta->user_password); } if (PDF_begin_document(p, output, 0, ys) == -1) { YLOG_ADD(YLOG_ERR, "Unable to create file '%s'", output); PDF_delete(p); ys_del(&ys); return (YEUNDEF); } ys_del(&ys); PDF_set_info(p, "Creator", DEFAULT_CREATOR); if (carta->author) PDF_set_info(p, "Author", carta->author); if (carta->title) PDF_set_info(p, "Title", carta->title); if (carta->subject) PDF_set_info(p, "Subject", carta->subject); if (carta->keywords) PDF_set_info(p, "Keywords", carta->keywords); if (carta->copyright) PDF_set_info(p, "Copyright", carta->copyright); if (carta->version) PDF_set_info(p, "Version", carta->version); if (carta->language) PDF_set_info(p, "Language", carta->language); if (carta->note) PDF_set_info(p, "Note", carta->note); /* load variables, fonts and images */ cg_load_variables(carta); cg_load_fonts(carta); cg_load_images(carta); /* process every decks */ for (i = 0; i < yv_len(carta->decks); ++i) { cg_deck_t *deck = carta->decks[i]; /* update variables */ cg_expr_set_scalar(carta, "DECK_INDEX", (double)i + 1); cg_expr_set_element(carta, "PAGE", deck->paper_width, deck->paper_height); cg_expr_set_element(carta, "PAGE_DIM", deck->paper_width, deck->paper_height); cg_expr_set_element(carta, "PAGE_DIMENSION", deck->paper_width, deck->paper_height); cg_expr_set_element(carta, "CARD", deck->card_width, deck->card_height); cg_expr_set_element(carta, "CARD_DIM", deck->card_width, deck->card_height); cg_expr_set_element(carta, "CARD_DIMENSION", deck->card_width, deck->card_height); cg_expr_set_element(carta, "MARGIN", deck->paper_margin_w, deck->paper_margin_h); cg_expr_set_element(carta, "MARGIN_DIM", deck->paper_margin_w, deck->paper_margin_h); cg_expr_set_element(carta, "MARGIN_DIMENSION", deck->paper_margin_w, deck->paper_margin_h); cg_expr_set_element(carta, "SPACE", deck->space_width, deck->space_height); cg_expr_set_element(carta, "SPACE_DIM", deck->space_width, deck->space_height); cg_expr_set_element(carta, "SPACE_DIMENSION", deck->space_width, deck->space_height); cg_expr_set_scalar(carta, "CARD_DECK", (double)cg_deck_get_nb_cards(carta, deck)); cg_expr_set_scalar(carta, "CARDS_IN_DECK", (double)cg_deck_get_nb_cards(carta,deck)); cg_expr_set_scalar(carta, "NBR_CARDS_IN_DECK", (double)cg_deck_get_nb_cards(carta,deck)); /* process deck */ cg_process_deck(carta, deck); } cg_unload_images(carta); PDF_end_document(p, ""); } PDF_CATCH(p) { YLOG_ADD(YLOG_ERR, "PDFlib exception:\n[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); return_value = YEUNDEF; } PDF_delete(p); return (return_value); }
int main(void) { PDF *p; float alpha; time_t timer; struct tm ltime; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { /* open new PDF file */ if (PDF_open_file(p, "pdfclock.pdf") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(2); } /* This line is required to avoid problems on Japanese systems */ PDF_set_parameter(p, "hypertextencoding", "host"); PDF_set_info(p, "Creator", "pdfclock.c"); PDF_set_info(p, "Author", "Thomas Merz"); PDF_set_info(p, "Title", "PDF clock (C)"); PDF_begin_page(p, (float) (2 * (RADIUS + MARGIN)), (float) (2 * (RADIUS + MARGIN))); PDF_translate(p, RADIUS + MARGIN, RADIUS + MARGIN); PDF_setcolor(p, "fillstroke", "rgb", 0, 0, 1, 0); PDF_save(p); /* minute strokes */ PDF_setlinewidth(p, 2); for (alpha = 0; alpha < 360; alpha += 6) { PDF_rotate(p, 6); PDF_moveto(p, RADIUS, 0); PDF_lineto(p, (float) (RADIUS-MARGIN/3), 0); PDF_stroke(p); } PDF_restore(p); PDF_save(p); /* 5 minute strokes */ PDF_setlinewidth(p, 3); for (alpha = 0; alpha < 360; alpha += 30) { PDF_rotate(p, 30); PDF_moveto(p, RADIUS, 0); PDF_lineto(p, RADIUS-MARGIN, 0); PDF_stroke(p); } time(&timer); ltime = *localtime(&timer); /* draw hour hand */ PDF_save(p); PDF_rotate(p, (float)(-((ltime.tm_min/60.0) + ltime.tm_hour - 3.0) * 30.0)); PDF_moveto(p, -RADIUS/10, -RADIUS/20); PDF_lineto(p, RADIUS/2, 0); PDF_lineto(p, -RADIUS/10, RADIUS/20); PDF_closepath(p); PDF_fill(p); PDF_restore(p); /* draw minute hand */ PDF_save(p); PDF_rotate(p, (float) (-((ltime.tm_sec/60.0) + ltime.tm_min - 15.0) * 6.0)); PDF_moveto(p, -RADIUS/10, -RADIUS/20); PDF_lineto(p, RADIUS * 0.8f, 0); PDF_lineto(p, -RADIUS/10, RADIUS/20); PDF_closepath(p); PDF_fill(p); PDF_restore(p); /* draw second hand */ PDF_setcolor(p, "fillstroke", "rgb", 1, 0, 0, 0); PDF_setlinewidth(p, 2); PDF_save(p); PDF_rotate(p, (float) -((ltime.tm_sec - 15.0) * 6.0)); PDF_moveto(p, -RADIUS/5, 0); PDF_lineto(p, RADIUS, 0); PDF_stroke(p); PDF_restore(p); /* draw little circle at center */ PDF_circle(p, 0, 0, (float) RADIUS/30); PDF_fill(p); PDF_restore(p); PDF_end_page(p); PDF_close(p); } PDF_CATCH(p) { printf("PDFlib exception occurred in pdfclock sample:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); /* delete the PDFlib object */ return 0; }
BOOL CTWainHelper::SaveAsPdf(const char* pFileName, std::vector< HANDLE > m_pic_handles) { PDF *p; int image; const char *imagefile = "/pvf/pic.jpg"; /* This is where font/image/PDF input files live. Adjust as necessary. */ const char *searchpath = "./"; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return FALSE; } PDF_TRY(p){ /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); /* This line is required to avoid problems on Japanese systems */ PDF_set_parameter(p, "hypertextencoding", "host"); if (PDF_begin_document(p, pFileName, 0, "") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return FALSE; } PDF_set_parameter(p, "SearchPath", searchpath); PDF_set_info(p, "Creator", "TWainApp"); PDF_set_info(p, "Author", "Snail"); PDF_set_info(p, "Title", "image sample (C)"); std::vector< HANDLE >::iterator it; for(it = m_pic_handles.begin(); it != m_pic_handles.end(); it++) { //将Handle转换为CxImage对象 HANDLE imageHandle = (HANDLE)(*it); CxImage cxImage; cxImage.CreateFromHANDLE(imageHandle); //cxImage.Save("C:\\bmp.bmp", CXIMAGE_FORMAT_BMP); cxImage.Save(".\\temp\\temp.jpg", CXIMAGE_FORMAT_JPG); char* imagedata = NULL; DWORD size = 0; CFile file(".\\temp\\temp.jpg", CFile::modeRead); size = file.GetLength(); imagedata = new char[size]; memset(imagedata, 0, size); file.Read(imagedata, size); file.Close(); PDF_create_pvf(p, imagefile, 0, (const char*)imagedata, size, ""); image = PDF_load_image(p, "auto", imagefile, 0, ""); if (image == -1) { char logInfo[LOGSIZE]; sprintf(logInfo, "Error: 加载PVF图像数据失败!错误号:%d, %s:%d\r\n", PDF_get_errmsg(p), __FILE__, __LINE__); CTWainHelper::LogMessage(logInfo); if(imagedata) delete imagedata; continue; } /* dummy page size, will be adjusted by PDF_fit_image() */ PDF_begin_page_ext(p, 10, 10, ""); PDF_fit_image(p, image, 0.0, 0.0, "adjustpage dpi {300 300}"); PDF_end_page_ext(p, ""); /* Delete the virtual file to free the allocated memory */ PDF_delete_pvf(p, imagefile, 0); if(imagedata) delete imagedata; } PDF_end_document(p, ""); ::DeleteFile(".\\temp\\temp.jpg"); } PDF_CATCH(p) { char logInfo[LOGSIZE]; sprintf(logInfo, "EXCEPTION: PDFlib接口调用过程发生异常!错误信息:[%d] %s: %s, %s:%d\r\n", PDF_get_errmsg(p), PDF_get_apiname(p), PDF_get_errmsg(p), __FILE__, __LINE__); CTWainHelper::LogMessage(logInfo); PDF_delete(p); return FALSE; } PDF_delete(p); return TRUE; }
int main(int argc, char *argv[]) { char *pdffilename = NULL; char *imagetype = "auto"; char *useroptions = ""; PDF *p; int image; #ifndef PDFLIB_LITE int tagged, opt; int item=0; char *pdfalevel = NULL, *intent = "sRGB"; #endif /* PDFLIB_LITE */ int resolution = 0; int page_numbering = 0; double graylevel = -1.0; int frame; int current_page = 1; #define BUFLEN 1024 char optlist[BUFLEN]; char buf[BUFLEN]; #ifndef PDFLIB_LITE while ((opt = getopt(argc, argv, "a:g:I:i:o:p:r:t:")) != -1) #else while ((opt = getopt(argc, argv, "g:i:o:p:r:t:")) != -1) #endif /* PDFLIB_LITE */ switch (opt) { #ifndef PDFLIB_LITE case 'a': if (strcmp(optarg, "none")) pdfalevel = optarg; break; #endif /* PDFLIB_LITE */ case 'g': if (optarg) { graylevel = atof(optarg); if (graylevel < 0.0 || graylevel > 1.0) { fprintf(stderr, "Error: Bad gray level %.2g for -g.\n", graylevel); usage(); } } break; #ifndef PDFLIB_LITE case 'I': if (!strcmp(optarg, "none")) intent = NULL; else intent = optarg; break; #endif /* PDFLIB_LITE */ case 'i': useroptions = optarg; if (strlen(useroptions) > BUFLEN-20) { fprintf(stderr, "Error: image option list too long.\n"); usage(); } break; case 'o': pdffilename = optarg; break; case 'p': page_numbering = 1; if (optarg) { current_page = atoi(optarg); } break; case 'r': if (!optarg || (resolution = atoi(optarg)) <= 0) { fprintf(stderr, "Error: non-positive resolution.\n"); usage(); } break; case 't': imagetype = optarg; break; case '?': default: usage(); } if (optind == argc) { fprintf(stderr, "Error: no image files given.\n"); usage(); } if (pdffilename == NULL) { fprintf(stderr, "Error: no output file given.\n"); usage(); } if ((p = PDF_new()) == (PDF *) 0) { fprintf(stderr, "Couldn't create PDFlib object (out of memory)!\n"); exit(99); } PDF_TRY(p) { optlist[0] = 0; #ifndef PDFLIB_LITE tagged = pdfalevel && !strcmp(pdfalevel, "PDF/A-1a:2005"); if (pdfalevel) { /* disabled (see bug #1577) if (tagged) sprintf(optlist, "pdfa=%s lang=en", pdfalevel); else */ sprintf(optlist, "pdfa=%s", pdfalevel); } #endif /* PDFLIB_LITE */ if (PDF_begin_document(p, pdffilename, 0, optlist) == -1) { fprintf(stderr, "Error: cannot open output file %s.\n", pdffilename); exit(1); } #ifndef PDFLIB_LITE if (pdfalevel && intent) { if (strcmp("sRGB", intent)) { sprintf(optlist, "Intent=%s", intent); PDF_set_parameter(p, "ICCProfile", optlist); } fprintf(stderr, "Using '%s' as PDF/A output intent.\n", intent); PDF_load_iccprofile(p, intent, 0, "usage=outputintent"); } if (tagged) item = PDF_begin_item(p, "Document", "Alt={Images converted with pdfimage by PDFlib GmbH}"); #endif /* PDFLIB_LITE */ PDF_set_info(p, "Creator", "pdfimage"); PDF_set_parameter(p, "warning", "false"); while (optind++ < argc) { #ifndef PDFLIB_LITE int item2=0; #endif /* PDFLIB_LITE */ int parent=0; fprintf(stderr, "Processing image file '%s'...", argv[optind-1]); /* process all frames in a multi-page image file */ for (frame=1; /* */; frame++) { sprintf(optlist, "%s page %d", useroptions, frame); image = PDF_load_image(p, imagetype, argv[optind-1],0, optlist); if (image == -1) { if (frame == 1) fprintf(stderr, "\n%s (skipped).\n", PDF_get_errmsg(p)); break; } /* dummy page size, will be adjusted later */ PDF_begin_page_ext(p, 20, 20, ""); if (graylevel >= 0.0) { if (pdfalevel) { PDF_setcolor(p, "fill", "lab", graylevel, 0.0, 0.0, 0.0); } else { PDF_setcolor(p, "fill", "gray", graylevel, 0.0, 0.0, 0.0); } PDF_rect(p, 0, 0, 10000, 10000); PDF_fill(p); } /* define outline with filename or page number */ if (page_numbering) { sprintf(buf, "Page %d", current_page++); PDF_create_bookmark(p, buf, 0, ""); } else { if (frame == 1) { parent = PDF_create_bookmark(p, argv[optind-1], 0, "open"); } else { sprintf(buf, "page %d", frame); sprintf(optlist, "parent=%d", parent); PDF_create_bookmark(p, buf, 0, optlist); } } #ifndef PDFLIB_LITE if (tagged) { /* The file name is the best /Alt value we can provide */ sprintf(optlist, "Alt={%s}", argv[optind-1]); item2 = PDF_begin_item(p, "Figure", optlist); } #endif /* PDFLIB_LITE */ if (resolution != 0) sprintf(optlist, "dpi %d adjustpage", resolution); else sprintf(optlist, "adjustpage"); PDF_fit_image(p, image, 0.0, 0.0, optlist); #ifndef PDFLIB_LITE if (tagged) PDF_end_item(p, item2); #endif /* PDFLIB_LITE */ PDF_end_page_ext(p, ""); } if (frame > 2) fprintf(stderr, "(%d frames)", frame-1); fprintf(stderr, "\n"); } #ifndef PDFLIB_LITE if (tagged) PDF_end_item(p, item); #endif /* PDFLIB_LITE */ PDF_end_document(p, ""); } PDF_CATCH(p) { printf("\npdfimage: error while creating PDF output (%s(): %s)\n", PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); exit(99); } PDF_delete(p); exit(0); }
int main(int argc, char *argv[]) { char buf[BUFLEN], *s; char *pdffilename = NULL; FILE *textfile = stdin; PDF *p; int opt; int font; char *fontname, *encoding; double fontsize; double x, y, width = a4_width, height = a4_height, margin = 20; char ff, nl; fontname = "Courier"; fontsize = 12.0; encoding = "host"; nl = '\n'; ff = '\f'; while ((opt = getopt(argc, argv, "e:f:h:m:o:s:w:")) != -1) switch (opt) { case 'e': encoding = optarg; break; case 'f': fontname = optarg; break; case 'h': height = atof(optarg); if (height < 0) { fprintf(stderr, "Error: bad page height %f!\n", height); usage(); } break; case 'm': margin = atof(optarg); if (margin < 0) { fprintf(stderr, "Error: bad margin %f!\n", margin); usage(); } break; case 'o': pdffilename = optarg; break; case 's': fontsize = atof(optarg); if (fontsize < 0) { fprintf(stderr, "Error: bad font size %f!\n", fontsize); usage(); } break; case 'w': width = atof(optarg); if (width < 0) { fprintf(stderr, "Error: bad page width %f!\n", width); usage(); } break; case '?': default: usage(); } if (!strcmp(encoding, "ebcdic")) { /* form feed is 0x0C in both ASCII and EBCDIC */ nl = 0x15; } if (pdffilename == NULL) usage(); if (optind < argc) { if ((textfile = fopen(argv[optind], READMODE)) == NULL) { fprintf(stderr, "Error: cannot open input file %s.\n",argv[optind]); exit(2); } } else textfile = stdin; p = PDF_new(); if (p == NULL) { fprintf(stderr, "Error: cannot open output file %s.\n", pdffilename); exit(1); } PDF_begin_document(p, pdffilename, 0, ""); PDF_set_info(p, "Title", "Converted text"); PDF_set_info(p, "Creator", "text2pdf"); x = margin; y = height - margin; while ((s = fgets(buf, BUFLEN, textfile)) != NULL) { if (s[0] == ff) { if (y == height - margin) PDF_begin_page_ext(p, width, height, ""); PDF_end_page_ext(p, ""); y = height - margin; continue; } if (s[0] != '\0' && s[strlen(s) - 1] == nl) s[strlen(s) - 1] = '\0'; /* remove newline character */ if (y < margin) { /* page break necessary? */ y = height - margin; PDF_end_page_ext(p, ""); } if (y == height - margin) { PDF_begin_page_ext(p, width, height, ""); font = PDF_load_font(p, fontname, 0, encoding, ""); PDF_setfont(p, font, fontsize); PDF_set_text_pos(p, x, y); y -= fontsize; } PDF_continue_text(p, s); y -= fontsize; } if (y != height - margin) PDF_end_page_ext(p, ""); PDF_end_document(p, ""); PDF_delete(p); exit(0); }
int main(void) { /* This is where the data files are. Adjust as necessary. */ const char * searchpath = "../data"; PDF * p; double width, height; const char * infile = "boilerplate.pdf"; int i, page, indoc, blockcount; char * optlist; /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); PDF_set_parameter(p, "SearchPath", searchpath); if (PDF_begin_document(p, "starter_block.pdf", 0, "") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_set_info(p, "Creator", "PDFlib starter sample"); PDF_set_info(p, "Title", "starter_block"); /* Open a PDF containing blocks */ indoc = PDF_open_pdi_document(p, infile, 0, ""); if (indoc == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } /* Open the first page */ page = PDF_open_pdi_page(p, indoc, 1, ""); if (page == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); PDF_delete(p); return(2); } width = PDF_pcos_get_number(p, indoc, "pages[0]/width"); height = PDF_pcos_get_number(p, indoc, "pages[0]/height"); PDF_begin_page_ext(p, width, height, ""); /* Place the imported page on the output page */ PDF_fit_pdi_page(p, page, 0, 0, ""); /* Query the number of blocks on the first page */ blockcount = (int) PDF_pcos_get_number(p, indoc, "length:pages[0]/blocks"); if (blockcount == 0) { printf("Error: %s does not contain any PDFlib blocks", infile); PDF_delete(p); return(2); } /* Loop over all blocks on the page */ for (i = 0; i < blockcount; i++) { char buf[1024]; const char * blockname; const char * blocktype; /* Fetch the name and type of the i-th block on the first page * (one of Text/Image/PDF) */ sprintf(buf, "pages[0]/blocks[%d]/Name",i); blockname = PDF_pcos_get_string(p, indoc, buf); sprintf(buf, "pages[0]/blocks[%d]/Subtype", i); blocktype = PDF_pcos_get_string(p, indoc, buf); /* Visualize all text blocks */ if (!strcmp(blocktype, "Text")) { optlist = "fontname=Helvetica encoding=winansi " "fillcolor={rgb 1 0 0} " "bordercolor={gray 0} linewidth=0.25"; /* We simply use the blockname as content */ if (PDF_fill_textblock(p, page, blockname, blockname, 0, optlist) == -1) { printf("Warning: %s\n", PDF_get_errmsg(p)); } } } PDF_end_page_ext(p, ""); PDF_close_pdi_page(p, page); PDF_end_document(p, ""); PDF_close_pdi_document(p, indoc); } PDF_CATCH(p) { printf("PDFlib exception occurred:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); return 0; }
int main(int argc, char *argv[]) { char *pdffilename = NULL; char *pdfversion = NULL; PDF *p; int opt; int doc, page; int pageno, docpages; char *filename; int quiet = 0, landscape = 0, boxes = 0, newpage = 0; int cols = 1, rows = 1; int c = 0, r = 0; float sheetwidth = 595.0f, sheetheight = 842.0f; float width, height, scale = 1.0f; float rowheight = 0.0f, colwidth = 0.0f; while ((opt = getopt(argc, argv, "bg:lnp:o:qv:")) != -1) switch (opt) { case 'b': boxes = 1; break; case 'g': if (sscanf(optarg, "%dx%d", &rows, &cols) != 2) { fprintf(stderr, "Error: Couldn't parse -g option.\n"); usage(); } if (rows <= 0 || cols <= 0) { fprintf(stderr, "Bad row or column number.\n"); usage(); } break; case 'l': landscape = 1; break; case 'n': newpage = 1; break; case 'p': for(c = 0; c < PAGESIZELISTLEN; c++) if (!strcmp((const char *) optarg, PageSizes[c].name)) { sheetheight = PageSizes[c].height; sheetwidth = PageSizes[c].width; break; } if (c == PAGESIZELISTLEN) { /* page size name not found */ fprintf(stderr, "Error: Unknown page size '%s'.\n", optarg); usage(); } break; case 'o': pdffilename = optarg; break; case 'v': pdfversion = optarg; if (strcmp(pdfversion, "1.3") && strcmp(pdfversion, "1.4") && strcmp(pdfversion, "1.5")) { fprintf(stderr, "Error: bad PDF version number '%s'.\n", optarg); usage(); } break; case 'q': quiet = 1; break; case '?': default: usage(); } if (optind == argc) { fprintf(stderr, "Error: no PDF files given.\n"); usage(); } if (pdffilename == NULL) { fprintf(stderr, "Error: no PDF output file given.\n"); usage(); } p = PDF_new(); if (pdfversion) PDF_set_parameter(p, "compatibility", pdfversion); if (PDF_open_file(p, pdffilename) == -1) { fprintf(stderr, "Error: %s.\n", PDF_get_errmsg(p)); exit(1); } PDF_set_info(p, "Creator", "pdfimpose by PDFlib GmbH"); PDF_set_parameter(p, "openaction", "fitpage"); if (!quiet) PDF_set_parameter(p, "pdiwarning", "true"); /* report PDI problems */ /* multi-page imposition: calculate scaling factor and cell dimensions */ if (rows != 1 || cols != 1) { if (landscape) { height = sheetheight; sheetheight = sheetwidth; sheetwidth = height; } if (rows > cols) scale = 1.0f / rows; else scale = 1.0f / cols; rowheight = sheetheight * scale; colwidth = sheetwidth * scale; } /* process all PDF documents */ while (optind++ < argc) { filename = argv[optind-1]; if (!quiet) fprintf(stderr, "Imposing '%s'...\n", filename); if ((doc = PDF_open_pdi(p, filename, "", 0)) == -1) { if (quiet) fprintf(stderr, "Error: %s.\n", PDF_get_errmsg(p)); continue; } /* query number of pages in the document */ docpages = (int) PDF_get_pdi_value(p, "/Root/Pages/Count", doc, -1, 0); /* single cell only: concatenate, using original page dimensions */ if (rows == 1 && cols == 1) { /* open all pages and add to the output file */ for (pageno = 1; pageno <= docpages ; pageno++) { page = PDF_open_pdi_page(p, doc, pageno, ""); if (page == -1) { /* we'll get an exception in verbose mode anyway */ if (quiet) fprintf(stderr, "Couldn't open page %d of PDF file '%s' (%s)\n", pageno, filename, PDF_get_errmsg(p)); break; } sheetwidth = PDF_get_pdi_value(p, "width", doc, page, 0); sheetheight = PDF_get_pdi_value(p, "height", doc, page, 0); PDF_begin_page(p, sheetwidth, sheetheight); /* define bookmark with filename */ if (pageno == 1) PDF_add_bookmark(p, argv[optind-1], 0, 0); PDF_place_pdi_page(p, page, 0.0f, 0.0f, 1.0f, 1.0f); PDF_close_pdi_page(p, page); PDF_end_page(p); } } else { /* impose multiple pages */ if (newpage) r = c = 0; /* open all pages and add to the output file */ for (pageno = 1; pageno <= docpages ; pageno++) { page = PDF_open_pdi_page(p, doc, pageno, ""); if (page == -1) { /* we'll get an exception in verbose mode anyway */ if (quiet) fprintf(stderr, "Couldn't open page %d of PDF file '%s' (%s)\n", pageno, filename, PDF_get_errmsg(p)); break; } /* start a new page */ if (r == 0 && c == 0) PDF_begin_page(p, sheetwidth, sheetheight); /* define bookmark with filename */ if (pageno == 1) PDF_add_bookmark(p, argv[optind-1], 0, 0); width = PDF_get_pdi_value(p, "width", doc, page, 0); height = PDF_get_pdi_value(p, "height", doc, page, 0); /* * The save/restore pair is required to get the clipping right, * and helps PostScript printing manage its memory efficiently. */ PDF_save(p); PDF_rect(p, c * colwidth, sheetheight - (r + 1) * rowheight, colwidth, rowheight); PDF_clip(p); PDF_setcolor(p, "stroke", "gray", 0.0f, 0.0f, 0.0f, 0.0f); /* TODO: adjust scaling factor if page doesn't fit into cell */ PDF_place_pdi_page(p, page, c * colwidth, sheetheight - (r + 1) * rowheight, scale, scale); PDF_close_pdi_page(p, page); /* only half of the linewidth will be drawn due to clip() */ if (boxes) { PDF_setlinewidth(p, 1.0f * scale); PDF_rect(p, c * colwidth, sheetheight - (r + 1) * rowheight, colwidth, rowheight); PDF_stroke(p); } PDF_restore(p); c++; if (c == cols) { c = 0; r++; } if (r == rows) { r = 0; PDF_end_page(p); } } } PDF_close_pdi(p, doc); } /* finish last page if multi-page imposition */ if ((rows != 1 || cols != 1) && (r != 0 || c != 0)) PDF_end_page(p); PDF_close(p); PDF_delete(p); exit(0); }
int main(void) { PDF *p; int i, blockcontainer, page; char *infile = "boilerplate.pdf"; /* * This is where font/image/PDF input files live. Adjust as necessary. * * Note that this directory must also contain the LuciduxSans font outline * and metrics files. */ char *searchpath = "../data"; typedef struct { char *name; char *value; } blockdata; blockdata data[] = { { "name", "Victor Kraxi" }, { "business.title", "Chief Paper Officer" }, { "business.address.line1", "17, Aviation Road" }, { "business.address.city", "Paperfield" }, { "business.telephone.voice","phone +1 234 567-89" }, { "business.telephone.fax", "fax +1 234 567-98" }, { "business.email", "*****@*****.**" }, { "business.homepage", "www.kraxi.com" }, }; #define BLOCKCOUNT (sizeof(data)/sizeof(data[0])) /* create a new PDFlib object */ if ((p = PDF_new()) == (PDF *) 0) { printf("Couldn't create PDFlib object (out of memory)!\n"); return(2); } PDF_TRY(p) { /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); /* Set the search path for fonts and PDF files */ PDF_set_parameter(p, "SearchPath", searchpath); /* This line is required to avoid problems on Japanese systems */ PDF_set_parameter(p, "hypertextencoding", "host"); if (PDF_begin_document(p, "businesscard.pdf", 0, "") == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(2); } PDF_set_info(p, "Creator", "businesscard.c"); PDF_set_info(p, "Author", "Thomas Merz"); PDF_set_info(p, "Title","PDFlib block processing sample (C)"); blockcontainer = PDF_open_pdi_document(p, infile, 0, ""); if (blockcontainer == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(2); } page = PDF_open_pdi_page(p, blockcontainer, 1, ""); if (page == -1) { printf("Error: %s\n", PDF_get_errmsg(p)); return(2); } PDF_begin_page_ext(p, 20, 20, ""); /* dummy page size */ /* This will adjust the page size to the block container's size. */ PDF_fit_pdi_page(p, page, 0, 0, "adjustpage"); /* Fill all text blocks with dynamic data */ for (i = 0; i < (int) BLOCKCOUNT; i++) { if (PDF_fill_textblock(p, page, data[i].name, data[i].value, 0, "embedding encoding=host") == -1) { printf("Warning: %s\n", PDF_get_errmsg(p)); } } PDF_end_page_ext(p, ""); PDF_close_pdi_page(p, page); PDF_end_document(p, ""); PDF_close_pdi_document(p, blockcontainer); } PDF_CATCH(p) { printf("PDFlib exception occurred in businesscard sample:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } PDF_delete(p); return 0; }