X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2Fpdf.cc;h=f7fb640e729bd589d87f6df081f4f80879205f1f;hb=21a3f7b017e8bc721f55c9f3365005b57b19816a;hp=7d13c7b1db509bd59a7dc9899783b177339a21b0;hpb=dd130e1db77e857ace5d225d3fca175526c55681;p=swftools.git diff --git a/lib/pdf/pdf.cc b/lib/pdf/pdf.cc index 7d13c7b..f7fb640 100644 --- a/lib/pdf/pdf.cc +++ b/lib/pdf/pdf.cc @@ -6,7 +6,9 @@ #include "GlobalParams.h" #include "InfoOutputDev.h" #include "GFXOutputDev.h" +#include "FullBitmapOutputDev.h" #include "BitmapOutputDev.h" +#include "DummyOutputDev.h" #include "../mem.h" #include "pdf.h" #define NO_ARGPARSER @@ -34,12 +36,14 @@ typedef struct _pdf_page_info typedef struct _pdf_doc_internal { int protect; + int nocopy; PDFDoc*doc; Object docinfo; InfoOutputDev*info; CommonOutputDev*outputDev; pdf_page_info_t*pages; gfxdevice_t* middev; + char*filename; } pdf_doc_internal_t; typedef struct _pdf_page_internal @@ -147,6 +151,10 @@ void pdf_doc_destroy(gfxdocument_t*gfx) free(i->pages); i->pages = 0; i->docinfo.free(); + + if(i->filename) { + free(i->filename);i->filename=0; + } if(i->info) { delete i->info;i->info=0; @@ -187,6 +195,10 @@ gfxpage_t* pdf_doc_getpage(gfxdocument_t*doc, int page) if(page < 1 || page > doc->num_pages) return 0; + if(di->nocopy) { + msg(" PDF disallows copying."); + return 0; + } gfxpage_t* pdf_page = (gfxpage_t*)malloc(sizeof(gfxpage_t)); pdf_page_internal_t*pi= (pdf_page_internal_t*)malloc(sizeof(pdf_page_internal_t)); @@ -283,10 +295,21 @@ char* pdf_doc_getinfo(gfxdocument_t*doc, const char*name) static void storeDeviceParameter(const char*name, const char*value) { + parameter_t*o = device_config; + while(o) { + if(!strcmp(name, o->name)) { + /* overwrite old value */ + free(o->value); + o->value = strdup(value); + return; + } + o = o->next; + } parameter_t*p = new parameter_t(); p->name = strdup(name); p->value = strdup(value); p->next = 0; + if(device_config_next) { device_config_next->next = p; device_config_next = p; @@ -299,6 +322,7 @@ static void storeDeviceParameter(const char*name, const char*value) typedef struct _gfxsource_internal { int config_bitmap_optimizing; + int config_full_bitmap_optimizing; } gfxsource_internal_t; static void pdf_set_parameter(gfxsource_t*src, const char*name, const char*value) @@ -332,6 +356,8 @@ static void pdf_set_parameter(gfxsource_t*src, const char*name, const char*value storeDeviceParameter("ppmsubpixels", buf); } else if(!strcmp(name, "poly2bitmap")) { 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, "multiply")) { multiply = atoi(value); } else if(!strcmp(name, "help")) { @@ -354,7 +380,7 @@ static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) pdf_doc->internal = i; char*userPassword=0; - filename = strdup(filename); + i->filename = strdup(filename); char*x = 0; if((x = strchr(filename, '|'))) { @@ -387,8 +413,7 @@ static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) i->protect = 0; if (i->doc->isEncrypted()) { if(!i->doc->okToCopy()) { - printf("PDF disallows copying.\n"); - return 0; + i->nocopy = 1; } if(!i->doc->okToChange() || !i->doc->okToAddNotes()) i->protect = 1; @@ -415,7 +440,10 @@ static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) } } - if(isrc->config_bitmap_optimizing) { + if(isrc->config_full_bitmap_optimizing) { + FullBitmapOutputDev*outputDev = new FullBitmapOutputDev(i->info, i->doc); + i->outputDev = (CommonOutputDev*)outputDev; + } else if(isrc->config_bitmap_optimizing) { BitmapOutputDev*outputDev = new BitmapOutputDev(i->info, i->doc); i->outputDev = (CommonOutputDev*)outputDev; } else { @@ -446,6 +474,14 @@ static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) return pdf_doc; } + +void pdf_destroy(gfxsource_t*src) +{ + if(!src->internal) + return; + gfxsource_internal_t*i = (gfxsource_internal_t*)src->internal; + free(src->internal);src->internal=0; +} gfxsource_t*gfxsource_pdf_create() { @@ -453,6 +489,7 @@ gfxsource_t*gfxsource_pdf_create() memset(src, 0, sizeof(gfxsource_t)); src->set_parameter = pdf_set_parameter; src->open = pdf_open; + src->destroy = pdf_destroy; src->internal = malloc(sizeof(gfxsource_internal_t)); memset(src->internal, 0, sizeof(gfxsource_internal_t));