diff --git a/filter/pdf.cxx b/filter/pdf.cxx index e1760b7..6737a04 100644 --- a/filter/pdf.cxx +++ b/filter/pdf.cxx @@ -124,68 +124,66 @@ extern "C" void pdf_prepend_stream(pdf_t *doc, { XRef *xref = doc->getXRef(); Ref *pageref = doc->getCatalog()->getPageRef(page); - Object dict, lenobj, stream, streamrefobj; + Object dict, stream; Object pageobj, contents; Object array; Ref r; - xref->fetch(pageref->num, pageref->gen, &pageobj); - if (!pageobj.isDict() || !pageobj.dictLookupNF("Contents", &contents)) { + pageobj = xref->fetch(pageref->num, pageref->gen); + if (!pageobj.isDict()) { + fprintf(stderr, "Error: malformed pdf\n"); + return; + } + + contents = pageobj.dictLookupNF("Contents"); + if (contents.isNull()) { fprintf(stderr, "Error: malformed pdf\n"); return; } if (contents.isRef()) - xref->fetch(contents.getRefNum(), contents.getRefGen(), &contents); + contents = xref->fetch(contents.getRefNum(), contents.getRefGen()); - lenobj.initInt(len); - dict.initDict(xref); - dict.dictSet("Length", &lenobj); - stream.initStream(new MemStream(buf, 0, len, &dict)); + dict = Object(new Dict(xref)); + dict.dictSet("Length", Object(int(len))); + MemStream *mem_stream = new MemStream(buf, 0, len, std::move(dict)); + stream = Object(static_cast(mem_stream)); r = xref->addIndirectObject(&stream); - streamrefobj.initRef(r.num, r.gen); - array.initArray(xref); - array.arrayAdd(&streamrefobj); + array = Object(new Array(xref)); + array.arrayAdd(Object(r.num, r.gen)); if (contents.isStream()) { - pageobj.dictLookupNF("Contents", &contents); // streams must be indirect, i.e. not fetch()-ed - array.arrayAdd(&contents); + contents = pageobj.dictLookupNF("Contents"); // streams must be indirect, i.e. not fetch()-ed + array.arrayAdd(std::move(contents)); } else if (contents.isArray()) { int i, len = contents.arrayGetLength(); - Object obj; for (i = 0; i < len; i++) { - contents.arrayGetNF(i, &obj); - array.arrayAdd(&obj); + array.arrayAdd(contents.arrayGetNF(i)); } } else fprintf(stderr, "Error: malformed pdf\n"); - pageobj.dictSet("Contents", &array); + pageobj.dictSet("Contents", std::move(array)); xref->setModifiedObject(&pageobj, *pageref); - pageobj.free(); } -static Object * name_object(const char *s) +static Object name_object(const char *s) { - Object *o = new Object(); - o->initName((char *)s); - return o; + return Object(objName, s); } /* * Create new PDF integer type object. */ -static Object * int_object(int i) +static Object int_object(int i) { - Object *o = new Object(); - o->initInt(i); - return o; + return Object(i); } static Object * get_resource_dict(XRef *xref, @@ -196,21 +194,21 @@ static Object * get_resource_dict(XRef *xref, Object res; /* TODO resource dict can also be inherited */ - if (!pagedict->lookupNF("Resources", &res)) + res = pagedict->lookupNF("Resources"); + if (res.isNull()) return NULL; if (res.isRef()) { *resref = res.getRef(); - xref->fetch(resref->num, resref->gen, resdict); + *resdict = xref->fetch(resref->num, resref->gen); } else if (res.isDict()) { - res.copy(resdict); + *resdict = res.copy(); resref->num = 0; } else resdict = NULL; - res.free(); return resdict; } @@ -226,7 +224,7 @@ extern "C" void pdf_add_type1_font(pdf_t *doc, Object resdict; Ref resref; - xref->fetch(pageref->num, pageref->gen, &pageobj); + pageobj = xref->fetch(pageref->num, pageref->gen); if (!pageobj.isDict()) { fprintf(stderr, "Error: malformed pdf\n"); return; @@ -234,21 +232,20 @@ extern "C" void pdf_add_type1_font(pdf_t *doc, if (!get_resource_dict(xref, pageobj.getDict(), &resdict, &resref)) { fprintf(stderr, "Error: malformed pdf\n"); - pageobj.free(); return; } - font.initDict(xref); + font = Object(new Dict(xref)); font.dictSet("Type", name_object("Font")); font.dictSet("Subtype", name_object("Type1")); font.dictSet("BaseFont", name_object(name)); xref->addIndirectObject(&font); - resdict.dictLookupNF("Font", &fonts); + fonts = resdict.dictLookupNF("Font"); if (fonts.isNull()) { /* Create new font dic obj in page's resources */ - fonts.initDict(xref); - resdict.dictSet("Font", &fonts); + fonts = Object(new Dict(xref)); + resdict.dictSet("Font", std::move(fonts)); } Object *fonts_dic; @@ -259,7 +256,7 @@ extern "C" void pdf_add_type1_font(pdf_t *doc, fonts_dic = &fonts; } else if ( fonts.isRef() ) { /* "Font" resource is indirect reference object */ - xref->fetch(fonts.getRefNum(), fonts.getRefGen(), &dereferenced_obj); + dereferenced_obj = xref->fetch(fonts.getRefNum(), fonts.getRefGen()); fonts_dic = &dereferenced_obj; } @@ -269,7 +266,7 @@ extern "C" void pdf_add_type1_font(pdf_t *doc, } /* Add new entry to "Font" resource */ - fonts_dic->dictSet("bannertopdf-font", &font); + fonts_dic->dictSet("bannertopdf-font", std::move(font)); /* Notify poppler about changes */ if ( fonts.isRef() ) { @@ -280,8 +277,6 @@ extern "C" void pdf_add_type1_font(pdf_t *doc, xref->setModifiedObject(&pageobj, *pageref); else xref->setModifiedObject(&resdict, resref); - - pageobj.free(); } @@ -293,23 +288,18 @@ static bool dict_lookup_rect(Object *dict, Array *array; int i; - if (!dict->dictLookup(key, &o)) + o = dict->dictLookup(key); + if (!o.isArray()) return false; - if (!o.isArray()) { - o.free(); - return false; - } - array = o.getArray(); for (i = 0; i < 4; i++) { Object el; - if (array->get(i, &el) && el.isNum()) + el = array->get(i); + if (el.isNum()) rect[i] = el.getNum(); - el.free(); } - o.free(); return i == 4; } @@ -322,15 +312,13 @@ static void dict_set_rect(XRef *xref, Object array; int i; - array.initArray(xref); + array = Object(new Array(xref)); for (i = 0; i < 4; i++) { - Object el; - el.initReal(rect[i]); - array.arrayAdd(&el); + array.arrayAdd(Object(double(rect[i]))); } - dict->dictSet(key, &array); + dict->dictSet(key, std::move(array)); } @@ -361,7 +349,7 @@ extern "C" void pdf_resize_page (pdf_t *doc, float mediabox[4] = { 0.0, 0.0, width, length }; float old_mediabox[4]; - xref->fetch(pageref->num, pageref->gen, &pageobj); + pageobj = xref->fetch(pageref->num, pageref->gen); if (!pageobj.isDict()) { fprintf(stderr, "Error: malformed pdf\n"); return; @@ -381,7 +369,6 @@ extern "C" void pdf_resize_page (pdf_t *doc, dict_set_rect (xref, &pageobj, "BleedBox", mediabox); xref->setModifiedObject(&pageobj, *pageref); - pageobj.free(); } @@ -391,24 +378,24 @@ extern "C" void pdf_duplicate_page (pdf_t *doc, { XRef *xref = doc->getXRef(); Ref *pageref = doc->getCatalog()->getPageRef(pagenr); - Object page, parentref, parent, kids, ref, countobj; + Object page, parentref, parent, kids; int i; - xref->fetch(pageref->num, pageref->gen, &page); + page = xref->fetch(pageref->num, pageref->gen); if (!page.isDict("Page")) { fprintf(stderr, "Error: malformed pdf (invalid Page object)\n"); return; } - page.dictLookupNF("Parent", &parentref); - parentref.fetch(xref, &parent); + parentref = page.dictLookupNF("Parent"); + parent = parentref.fetch(xref); if (!parent.isDict("Pages")) { fprintf(stderr, "Error: malformed pdf (Page.Parent must point to a " "Pages object)\n"); return; } - parent.dictLookup("Kids", &kids); + kids = parent.dictLookup("Kids"); if (!kids.isArray()) { fprintf(stderr, "Error: malformed pdf (Pages.Kids must be an array)\n"); return; @@ -420,14 +407,10 @@ extern "C" void pdf_duplicate_page (pdf_t *doc, // the pages tree (not supported by major pdf implementations). for (i = 1; i < count; i++) { Ref r = xref->addIndirectObject(&page); - ref.initRef(r.num, r.gen); - kids.arrayAdd(&ref); - ref.free(); + kids.arrayAdd(Object(r.num, r.gen)); } - countobj.initInt(count); - parent.dictSet("Count", &countobj); - countobj.free(); + parent.dictSet("Count", Object(count)); xref->setModifiedObject(&parent, parentref.getRef()); } @@ -521,9 +504,8 @@ extern "C" int pdf_fill_form(pdf_t *doc, opt_t *opt) fprintf(stderr, "Can't get page from PDF tamplate file.\n"); return 0; } - Object pageobj; Ref pageref = page->getRef(); - xref->fetch(pageref.num, pageref.gen, &pageobj); + Object pageobj = xref->fetch(pageref.num, pageref.gen); const char *font_size = lookup_opt(opt, "banner-font-size"); if ( ! font_size ) { @@ -613,9 +595,7 @@ extern "C" int pdf_fill_form(pdf_t *doc, opt_t *opt) appearance->append(" Tf"); /* Modify field's appearance */ - Object appearance_obj; - appearance_obj.initString(appearance); - field_obj->getDict()->set("DA", &appearance_obj); + field_obj->getDict()->set("DA", Object(appearance)); /* * Create /AP - entry stuff. @@ -652,8 +632,7 @@ extern "C" int pdf_fill_form(pdf_t *doc, opt_t *opt) appearance_stream->append("ET\n"); appearance_stream->append("EMC\n"); - Object appearance_stream_dic; - appearance_stream_dic.initDict(xref); + Object appearance_stream_dic = Object(new Dict(xref)); /* * Appearance stream dic. @@ -663,48 +642,35 @@ extern "C" int pdf_fill_form(pdf_t *doc, opt_t *opt) appearance_stream_dic.dictSet("Type", name_object("XObject")); appearance_stream_dic.dictSet("Subtype", name_object("Form")); appearance_stream_dic.dictSet("FormType", int_object(1)); - Object obj_ref_x; - obj_ref_x.initRef(resref.num, resref.gen); - appearance_stream_dic.dictSet("Resources", &obj_ref_x); + appearance_stream_dic.dictSet("Resources", Object(resref.num, resref.gen)); /* BBox array: TODO. currently out of the head. */ - Object array; - array.initArray(xref); - Object el; - el.initReal(0); - array.arrayAdd(&el); - el.initReal(0); - array.arrayAdd(&el); - el.initReal(237); - array.arrayAdd(&el); - el.initReal(25); - array.arrayAdd(&el); - appearance_stream_dic.dictSet("BBox", &array); + Object array = Object(new Array(xref)); + array.arrayAdd(Object(double(0))); + array.arrayAdd(Object(double(0))); + array.arrayAdd(Object(double(237))); + array.arrayAdd(Object(double(25))); + appearance_stream_dic.dictSet("BBox", std::move(array)); appearance_stream_dic.dictSet("Length", int_object(appearance_stream->getLength())); MemStream *mem_stream = new MemStream(appearance_stream->getCString(), - 0, appearance_stream->getLength(), &appearance_stream_dic); + 0, appearance_stream->getLength(), std::move(appearance_stream_dic)); /* Make obj stream */ - Object stream; - stream.initStream(mem_stream); + Object stream = Object(static_cast(mem_stream)); Ref r; r = xref->addIndirectObject(&stream); - /* Update Xref table */ - Object obj_ref; - obj_ref.initRef(r.num, r.gen); - /* * Fill Annotation's appearance streams dic /AP * See: 8.4.4 Appearance Streams */ - Object appearance_streams_dic; - appearance_streams_dic.initDict(xref); - appearance_streams_dic.dictSet("N", &obj_ref); + Object appearance_streams_dic = Object(new Dict(xref)); + /* Update Xref table */ + appearance_streams_dic.dictSet("N", Object(r.num, r.gen)); - field_obj->getDict()->set("AP", &appearance_streams_dic); + field_obj->getDict()->set("AP", std::move(appearance_streams_dic)); /* Notify poppler about changes */ xref->setModifiedObject(field_obj, field_ref); @@ -721,24 +687,19 @@ extern "C" int pdf_fill_form(pdf_t *doc, opt_t *opt) * OpenOffice - by default sets it to 'true'. */ Object *obj_form = catalog->getAcroForm(); - Object obj1; - obj1.initBool(gFalse); - obj_form->dictSet("NeedAppearances", &obj1); + obj_form->dictSet("NeedAppearances", Object(gFalse)); /* Add AccroForm as indirect obj */ Ref ref_form = xref->addIndirectObject(obj_form); /* * So update Catalog object. */ - Object* catObj = new Object(); - catObj = xref->getCatalog(catObj); + Object catObj = xref->getCatalog(); Ref catRef; catRef.gen = xref->getRootGen(); catRef.num = xref->getRootNum(); - Object obj2; - obj2.initRef(ref_form.num, ref_form.gen); - catObj->dictSet("AcroForm", &obj2); - xref->setModifiedObject(catObj, catRef); + catObj.dictSet("AcroForm", Object(ref_form.num, ref_form.gen)); + xref->setModifiedObject(&catObj, catRef); /* Success */ return 1; @@ -779,8 +740,7 @@ static int pdf_embed_font(pdf_t *doc, XRef *xref = doc->getXRef(); /* Font dictionary object for embeded font */ - Object f_dic; - f_dic.initDict(xref); + Object f_dic = Object(new Dict(xref)); f_dic.dictSet("Type", name_object("Font")); /* Stream lenght */ @@ -799,11 +759,10 @@ static int pdf_embed_font(pdf_t *doc, /* Create memory stream font. Add it to font dic. */ MemStream *mem_stream = new MemStream(font_stream->getCString(), - 0, outlen, &f_dic); + 0, outlen, std::move(f_dic)); /* Make obj stream */ - Object stream; - stream.initStream(mem_stream); + Object stream = Object(static_cast(mem_stream)); Ref r; @@ -813,7 +772,7 @@ static int pdf_embed_font(pdf_t *doc, /* Get page object */ Object pageobj; Ref pageref = page->getRef(); - xref->fetch(pageref.num, pageref.gen, &pageobj); + pageobj = xref->fetch(pageref.num, pageref.gen); if (!pageobj.isDict()) { fprintf(stderr, "Error: malformed pdf.\n"); return 0; @@ -825,18 +784,17 @@ static int pdf_embed_font(pdf_t *doc, Object *ret = get_resource_dict(xref, pageobj.getDict(), &resdict, &resref); if ( !ret ) { fprintf(stderr, "Error: malformed pdf\n"); - pageobj.free(); return 0; } /* Dictionary for all fonts in page's resources */ Object fonts; - resdict.dictLookupNF("Font", &fonts); + fonts = resdict.dictLookupNF("Font"); if (fonts.isNull()) { /* Create new one, if doesn't exists */ - fonts.initDict(xref); - resdict.dictSet("Font", &fonts); + fonts = Object(new Dict(xref)); + resdict.dictSet("Font", std::move(fonts)); fprintf(stderr, "Create new font dict in page's resources.\n"); } @@ -864,10 +822,6 @@ static int pdf_embed_font(pdf_t *doc, Object *cidfont_resource_dic = make_cidfont_dic(doc, Font, Fdes->fontname, r); r = xref->addIndirectObject(cidfont_resource_dic); - /* r - cid resource dic */ - Object font_res_obj_ref; - font_res_obj_ref.initRef(r.num, r.gen); - Object *fonts_dic; Object dereferenced_obj; @@ -876,7 +830,7 @@ static int pdf_embed_font(pdf_t *doc, fonts_dic = &fonts; } else if ( fonts.isRef() ) { /* "Font" resource is indirect reference object */ - xref->fetch(fonts.getRefNum(), fonts.getRefGen(), &dereferenced_obj); + dereferenced_obj = xref->fetch(fonts.getRefNum(), fonts.getRefGen()); fonts_dic = &dereferenced_obj; } @@ -886,7 +840,8 @@ static int pdf_embed_font(pdf_t *doc, } /* Add to fonts dic new font */ - fonts_dic->dictSet("stanv_font", &font_res_obj_ref); + /* r - cid resource dic */ + fonts_dic->dictSet("stanv_font", Object(r.num, r.gen)); /* Notify poppler about changes in fonts dic */ if ( fonts.isRef() ) { @@ -897,8 +852,6 @@ static int pdf_embed_font(pdf_t *doc, xref->setModifiedObject(&resdict, resref); fprintf(stderr, "Resource dict was changed.\n"); - pageobj.free(); - /* Success */ return 1; } @@ -1104,8 +1057,7 @@ static Object *make_fontdescriptor_dic( XRef *xref = doc->getXRef(); /* Font dictionary for embeded font */ - Object *dic = new Object(); - dic->initDict(xref); + Object *dic = new Object(new Dict(xref)); dic->dictSet("Type", name_object("FontDescriptor")); dic->dictSet( @@ -1119,24 +1071,17 @@ static Object *make_fontdescriptor_dic( dic->dictSet("StemV", int_object(fdes->stemV)); /* FontBox array */ - Object array; - array.initArray(xref); - - Object el; + Object array = Object(new Array(xref)); - el.initReal(fdes->bbxmin); - array.arrayAdd(&el); + array.arrayAdd(Object(fdes->bbxmin)); - el.initReal(fdes->bbymin); - array.arrayAdd(&el); + array.arrayAdd(Object(fdes->bbymin)); - el.initReal(fdes->bbxmax); - array.arrayAdd(&el); + array.arrayAdd(Object(fdes->bbxmax)); - el.initReal(fdes->bbymax); - array.arrayAdd(&el); + array.arrayAdd(Object(fdes->bbymax)); - dic->dictSet("FontBBox", &array); + dic->dictSet("FontBBox", std::move(array)); if (fdes->xHeight) { dic->dictSet("XHeight", int_object(fdes->xHeight)); @@ -1148,21 +1093,15 @@ static Object *make_fontdescriptor_dic( if (fdes->panose) { /* Font dictionary for embeded font */ - Object style_dic; - style_dic.initDict(xref); - - Object panose; + Object style_dic = Object(new Dict(xref)); GooString *panose_str = new GooString(fdes->panose, 12); - panose.initString(panose_str); - style_dic.dictSet("Panose", &panose); + style_dic.dictSet("Panose", Object(panose_str)); - dic->dictSet("Style", &style_dic); + dic->dictSet("Style", std::move(style_dic)); } - Object ref_obj; - ref_obj.initRef(fontfile_obj_ref.num, fontfile_obj_ref.gen); - dic->dictSet(emb_pdf_get_fontfile_key(emb), &ref_obj); + dic->dictSet(emb_pdf_get_fontfile_key(emb), Object(fontfile_obj_ref.num, fontfile_obj_ref.gen)); return dic; } @@ -1181,8 +1120,7 @@ static Object *make_font_dic( /* Get XREF table */ XRef *xref = doc->getXRef(); - Object *dic = new Object(); - dic->initDict(xref); + Object *dic = new Object(new Dict(xref)); dic->dictSet("Type", name_object("Font")); dic->dictSet( @@ -1192,32 +1130,24 @@ static Object *make_font_dic( "BaseFont", name_object(copyString(emb_pdf_escape_name(fdes->fontname,-1)))); - Object ref_obj; - ref_obj.initRef(fontdescriptor_obj_ref.num, fontdescriptor_obj_ref.gen); - dic->dictSet("FontDescriptor", &ref_obj); + dic->dictSet("FontDescriptor", Object(fontdescriptor_obj_ref.num, fontdescriptor_obj_ref.gen)); if ( emb->plan & EMB_A_MULTIBYTE ) { assert(fwid->warray); - Object CIDSystemInfo_dic; - CIDSystemInfo_dic.initDict(xref); - - Object registry; - Object ordering; + Object CIDSystemInfo_dic = Object(new Dict(xref)); GooString *str; str = new GooString(copyString(fdes->registry)); - registry.initString(str); - CIDSystemInfo_dic.dictSet("Registry", ®istry); + CIDSystemInfo_dic.dictSet("Registry", Object(str)); str = new GooString(copyString(fdes->ordering)); - ordering.initString(str); - CIDSystemInfo_dic.dictSet("Ordering", &ordering); + CIDSystemInfo_dic.dictSet("Ordering", Object(str)); CIDSystemInfo_dic.dictSet("Supplement", int_object(fdes->supplement)); - dic->dictSet("CIDSystemInfo", &CIDSystemInfo_dic); + dic->dictSet("CIDSystemInfo", std::move(CIDSystemInfo_dic)); dic->dictSet("DW", int_object(fwid->default_width)); } @@ -1249,8 +1179,7 @@ static Object *make_cidfont_dic( /* Get XREF table */ XRef *xref = doc->getXRef(); - Object *dic = new Object(); - dic->initDict(xref); + Object *dic = new Object(new Dict(xref)); dic->dictSet("Type", name_object("Font")); dic->dictSet("Subtype", name_object("Type0")); @@ -1266,14 +1195,10 @@ static Object *make_cidfont_dic( dic->dictSet("Encoding", name_object(copyString(encoding))); - Object obj; - obj.initRef(fontdescriptor_obj_ref.num, fontdescriptor_obj_ref.gen); - - Object array; - array.initArray(xref); - array.arrayAdd(&obj); + Object array = Object(new Array(xref)); + array.arrayAdd(Object(fontdescriptor_obj_ref.num, fontdescriptor_obj_ref.gen)); - dic->dictSet("DescendantFonts", &array); + dic->dictSet("DescendantFonts", std::move(array)); return dic; } diff --git a/filter/test_pdf1.c b/filter/test_pdf1.c index 0fadea4..8171fcd 100644 --- a/filter/test_pdf1.c +++ b/filter/test_pdf1.c @@ -25,7 +25,7 @@ int main() int cobj=pdfOut_add_xref(pdf); const char buf[]="BT /a 10 Tf (abc) Tj ET"; pdfOut_printf(pdf,"%d 0 obj\n" - "<>\n" "stream\n" "%s\n" diff --git a/filter/test_pdf2.c b/filter/test_pdf2.c index a0c1d8b..912e71c 100644 --- a/filter/test_pdf2.c +++ b/filter/test_pdf2.c @@ -73,7 +73,7 @@ int main() const int clobj=pdfOut_add_xref(pdf); assert(clobj==cobj+1); pdfOut_printf(pdf,"%d 0 obj\n" - "%d\n" + "%ld\n" "endobj\n" ,clobj,streamlen);