iphone - Merge PDF files on iOS -
is there way in ios merge pdf files, is, append pages of 1 @ end of , save disk?
i came out solution:
// documents dir nsarray *paths = nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes); nsstring *documentsdirectory = [paths objectatindex:0]; // file paths nsstring *pdfpath1 = [documentsdirectory stringbyappendingpathcomponent:@"1.pdf"]; nsstring *pdfpath2 = [documentsdirectory stringbyappendingpathcomponent:@"2.pdf"]; nsstring *pdfpathoutput = [documentsdirectory stringbyappendingpathcomponent:@"out.pdf"]; // file urls cfurlref pdfurl1 = (cfurlref)[[nsurl alloc] initfileurlwithpath:pdfpath1]; cfurlref pdfurl2 = (cfurlref)[[nsurl alloc] initfileurlwithpath:pdfpath2]; cfurlref pdfurloutput = (cfurlref)[[nsurl alloc] initfileurlwithpath:pdfpathoutput]; // file references cgpdfdocumentref pdfref1 = cgpdfdocumentcreatewithurl((cfurlref) pdfurl1); cgpdfdocumentref pdfref2 = cgpdfdocumentcreatewithurl((cfurlref) pdfurl2); // number of pages nsinteger numberofpages1 = cgpdfdocumentgetnumberofpages(pdfref1); nsinteger numberofpages2 = cgpdfdocumentgetnumberofpages(pdfref2); // create output context cgcontextref writecontext = cgpdfcontextcreatewithurl(pdfurloutput, null, null); // loop variables cgpdfpageref page; cgrect mediabox; // read first pdf , generate output pages nslog(@"generating pages pdf 1 (%i)...", numberofpages1); (int i=1; i<=numberofpages1; i++) { page = cgpdfdocumentgetpage(pdfref1, i); mediabox = cgpdfpagegetboxrect(page, kcgpdfmediabox); cgcontextbeginpage(writecontext, &mediabox); cgcontextdrawpdfpage(writecontext, page); cgcontextendpage(writecontext); } // read second pdf , generate output pages nslog(@"generating pages pdf 2 (%i)...", numberofpages2); (int i=1; i<=numberofpages2; i++) { page = cgpdfdocumentgetpage(pdfref2, i); mediabox = cgpdfpagegetboxrect(page, kcgpdfmediabox); cgcontextbeginpage(writecontext, &mediabox); cgcontextdrawpdfpage(writecontext, page); cgcontextendpage(writecontext); } nslog(@"done!"); // finalize output file cgpdfcontextclose(writecontext); // release memory cfrelease(pdfurl1); cfrelease(pdfurl2); cfrelease(pdfurloutput); cgpdfdocumentrelease(pdfref1); cgpdfdocumentrelease(pdfref2); cgcontextrelease(writecontext);
the biggest issue here memory allocation. can see, in approach have read both pdf files want merge and, @ same time, generate output. releases occur @ end. tried combining pdf file 500 pages (~15mb) containing 100 pages (~3mb) , produced new 1 600 pages (of course!) having ~5mb size (magic?). execution took around 30 seconds (not bad, considering ipad 1) , allocated 17mb (ouch!). app luckily didn't crash, think ios love kill app consuming 17mb one. ;p
Comments
Post a Comment