X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2Fpdf.cc;h=3e6a5941499af03c65dd2077b0214d68fcf06fdc;hb=98caa66dc7bb7a304b7b9d4d95d8d0849cefec01;hp=189a05cadae723f39673cf2a3148191d60c22114;hpb=5f1e7e9ebbac00effaae0545c32fe9060215d125;p=swftools.git diff --git a/lib/pdf/pdf.cc b/lib/pdf/pdf.cc index 189a05c..3e6a594 100644 --- a/lib/pdf/pdf.cc +++ b/lib/pdf/pdf.cc @@ -1,3 +1,5 @@ +#include +#include #include "../gfxdevice.h" #include "../gfxsource.h" #include "../devices/rescale.h" @@ -14,8 +16,7 @@ #include "../args.h" static double zoom = 72; /* xpdf: 86 */ -static int jpeg_dpi = 0; -static int ppm_dpi = 0; +static int zoomtowidth = 0; static int multiply = 1; static char* global_page_range = 0; @@ -45,19 +46,20 @@ typedef struct _pdf_page_info typedef struct _pdf_doc_internal { - int config_bitmap_optimizing; - int config_full_bitmap_optimizing; + char config_bitmap_optimizing; + char config_full_bitmap_optimizing; + char config_print; parameterlist_t parameters; int protect; int nocopy; + int noprint; PDFDoc*doc; Object docinfo; InfoOutputDev*info; pdf_page_info_t*pages; - gfxdevice_t* middev; char*filename; /* page map */ @@ -133,6 +135,9 @@ static void render2(gfxpage_t*page, gfxdevice_t*dev, int x,int y, int x1,int y1, pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; gfxsource_internal_t*i = (gfxsource_internal_t*)pi->parent->internal; + if(!pi->config_print && pi->nocopy) {msg(" PDF disallows copying");exit(0);} + if(pi->config_print && pi->noprint) {msg(" PDF disallows printing");exit(0);} + CommonOutputDev*outputDev = 0; if(pi->config_full_bitmap_optimizing) { FullBitmapOutputDev*d = new FullBitmapOutputDev(pi->info, pi->doc); @@ -150,6 +155,12 @@ static void render2(gfxpage_t*page, gfxdevice_t*dev, int x,int y, int x1,int y1, outputDev->setParameter(p->name, p->value); p = p->next; } + p = pi->parameters.device_config; + while(p) { + outputDev->setParameter(p->name, p->value); + p = p->next; + } + outputDev->setPageMap(pi->pagemap, pi->pagemap_pos); outputDev->setMove(x,y); outputDev->setClip(x1,y1,x2,y2); @@ -160,7 +171,7 @@ static void render2(gfxpage_t*page, gfxdevice_t*dev, int x,int y, int x1,int y1, gfxdevice_rescale_init(middev, 0x00000000, 0, 0, 1.0 / multiply); gfxdevice_rescale_setdevice(middev, dev); middev->setparameter(middev, "protect", "1"); - dev = pi->middev; + dev = middev; } if(!pi) { @@ -178,15 +189,17 @@ static void render2(gfxpage_t*page, gfxdevice_t*dev, int x,int y, int x1,int y1, } outputDev->setDevice(dev); - pi->doc->displayPage((OutputDev*)outputDev, page->nr, zoom*multiply, zoom*multiply, /*rotate*/0, true, true, /*doLinks*/(int)1); + pi->doc->displayPage((OutputDev*)outputDev, page->nr, zoom*multiply, zoom*multiply, /*rotate*/0, true, true, pi->config_print); pi->doc->processLinks((OutputDev*)outputDev, page->nr); outputDev->finishPage(); outputDev->setDevice(0); + delete outputDev; if(middev) { gfxdevice_rescale_setdevice(middev, 0x00000000); middev->finish(middev); } + } @@ -274,6 +287,8 @@ void pdf_doc_set_parameter(gfxdocument_t*gfx, const char*name, const char*value) i->config_bitmap_optimizing = atoi(value); } else if(!strcmp(name, "bitmapfonts") || !strcmp(name, "bitmap")) { i->config_full_bitmap_optimizing = atoi(value); + } else if(!strcmp(name, "asprint")) { + i->config_print = 1; } else { storeDeviceParameter(&i->parameters, name, value); } @@ -392,23 +407,13 @@ static void pdf_set_parameter(gfxsource_t*src, const char*name, const char*value addGlobalFont(value); } else if(!strncmp(name, "languagedir", strlen("languagedir"))) { addGlobalLanguageDir(value); + } else if(!strcmp(name, "zoomtowidth")) { + zoomtowidth = atoi(value); } else if(!strcmp(name, "zoom")) { char buf[80]; zoom = atof(value); - sprintf(buf, "%f", (double)jpeg_dpi/(double)zoom); - storeDeviceParameter(p, "jpegsubpixels", buf); - sprintf(buf, "%f", (double)ppm_dpi/(double)zoom); - storeDeviceParameter(p, "ppmsubpixels", buf); - } else if(!strcmp(name, "jpegdpi")) { - char buf[80]; - jpeg_dpi = atoi(value); - sprintf(buf, "%f", (double)jpeg_dpi/(double)zoom); - storeDeviceParameter(p, "jpegsubpixels", buf); - } else if(!strcmp(name, "ppmdpi")) { - char buf[80]; - ppm_dpi = atoi(value); - sprintf(buf, "%f", (double)ppm_dpi/(double)zoom); - storeDeviceParameter(p, "ppmsubpixels", buf); + } else if(!strcmp(name, "jpegdpi") || !strcmp(name, "ppmdpi")) { + msg(" %s not supported anymore. Please use jpegsubpixels/ppmsubpixels"); } else if(!strcmp(name, "multiply")) { multiply = atoi(value); } else if(!strcmp(name, "help")) { @@ -424,6 +429,12 @@ static void pdf_set_parameter(gfxsource_t*src, const char*name, const char*value } } +void pdf_doc_prepare(gfxdocument_t*doc, gfxdevice_t*dev) +{ + pdf_doc_internal_t*i= (pdf_doc_internal_t*)doc->internal; + i->info->dumpfonts(dev); +} + static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) { gfxsource_internal_t*isrc = (gfxsource_internal_t*)src->internal; @@ -438,7 +449,7 @@ static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) i->filename = strdup(filename); char*x = 0; - if((x = strchr(filename, '|'))) { + if((x = strchr((char*)filename, '|'))) { *x = 0; userPassword = x+1; } @@ -470,9 +481,20 @@ static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) if(!i->doc->okToCopy()) { i->nocopy = 1; } + if(!i->doc->okToPrint()) { + i->noprint = 1; + } if(!i->doc->okToChange() || !i->doc->okToAddNotes()) i->protect = 1; } + + if(zoomtowidth && i->doc->getNumPages()) { + Page*page = i->doc->getCatalog()->getPage(1); + PDFRectangle *r = page->getCropBox(); + double width_before = r->x2 - r->x1; + zoom = 72.0 * zoomtowidth / width_before; + msg(" Rendering at %f DPI. (Page width at 72 DPI: %f, target width: %d)", zoom, width_before, zoomtowidth); + } i->info = new InfoOutputDev(i->doc->getXRef()); int t; @@ -480,7 +502,7 @@ static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) memset(i->pages,0,sizeof(pdf_page_info_t)*pdf_doc->num_pages); for(t=1;t<=pdf_doc->num_pages;t++) { if(!global_page_range || is_in_range(t, global_page_range)) { - i->doc->displayPage((OutputDev*)i->info, t, zoom, zoom, /*rotate*/0, /*usemediabox*/true, /*crop*/true, /*doLinks*/(int)1); + i->doc->displayPage((OutputDev*)i->info, t, zoom, zoom, /*rotate*/0, /*usemediabox*/true, /*crop*/true, i->config_print); i->doc->processLinks((OutputDev*)i->info, t); i->pages[t-1].xMin = i->info->x1; i->pages[t-1].yMin = i->info->y1; @@ -500,8 +522,8 @@ static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) pdf_doc->set_parameter = pdf_doc_set_parameter; pdf_doc->getinfo = pdf_doc_getinfo; pdf_doc->getpage = pdf_doc_getpage; - - + pdf_doc->prepare = pdf_doc_prepare; + return pdf_doc; }