Намалете размера на pdf - Цел c

Имам проект за генериране на pdf, той се състои от някои текстове и изображение, което вече е съхранено в db, искам да прегледам и изпратя по пощата генерирания pdf, всичко е наред, когато има само текстови данни.

Проблем възниква, ако в нашите данни има изображение. Пощата получава pdf с размер 10 MB или по-голям, дори ако има изображение с размер 1 MB или по-малко. Той работи добре в симулатора. Моят код за рисуване на изображение е показан по-долу:

        UIImage *plotImage=[[UIImage alloc]initWithContentsOfFile:[localPictureArray objectAtIndex:i]];                  
                CGSize imageSize=plotImage.size;
                CGFloat scaleFactor = 1.0;        

        if (imageSize.height>(maxHeight-currentPageY) || imageSize.width>maxWidth ) 
        {
           UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, kDefaultPageWidth, kDefaultPageHeight), nil);
           currentPageY = kMargin;

           if (!((scaleFactor = (maxWidth / imageSize.width)) > ((maxHeight-currentPageY) / imageSize.height)))
            { 
            scaleFactor = (maxHeight-currentPageY) /imageSize.height; 
            // scale to fit heigth. 
            }

           CGRect rect = CGRectMake(kMargin,currentPageY,
           imageSize.width * scaleFactor, imageSize.height * scaleFactor);
           //Draw the image into the rect
           [plotImage drawInRect:rect];
         }

  else
      {
        plotImage drawInRect:normal size)];//Normal size we need
        NSLog(@"%@",NSStringFromCGSize(plotImage.size));
      }

Тъй като съм начинаещ, мъча се да го реша.


person Mumthezir VP    schedule 05.03.2013    source източник
comment
все още не е решен.. може ли някой да ми помогне!   -  person Mumthezir VP    schedule 06.03.2013
comment
Вашият друг няма } пред него, това само печатна грешка ли е?   -  person Manuel    schedule 06.03.2013
comment
Не, else все още няма } пред себе си, за да затвори if преди него: if (imageSize.height>(maxHeight-currentPageY) || imageSize.width>maxWidth ) {. Не трябва ли else { да е така: } else {?   -  person Manuel    schedule 06.03.2013
comment
има ли друг начин освен drawInRect???   -  person Mumthezir VP    schedule 06.03.2013


Отговори (2)


Борих се много.. най-накрая, когато записах изображение в jpeg формат на pdf страница, използвайки кода по-долу, размерът беше намален десет пъти!! Не знам, че това е правилният метод...

UIImage *lowResImage = [UIImage imageWithData:UIImageJPEGRepresentation(plotImage, 0.02)];
person Mumthezir VP    schedule 06.03.2013

Вместо да преоразмерявате правоъгълника в контекста, трябва да промените CTM (матрица за текуща трансформация).

CGContextSaveGState(theContext);


CGContextScaleCTM(theContext, scaleFactor, scaleFactor);

... Команди за рисуване тук ...

CGContextRestoreGState(theContext);

(http://macdevcenter.com/pub/a/mac/2004/11/02/quartz.html)

person kineticfocus    schedule 05.03.2013
comment
Кварцът рисува обекти по начин на машина за състояния. Чрез премащабиране на правоъгълника вие го принуждавате да интерполира повторно изображението преди чертане и следователно добавя допълнителни данни. - person kineticfocus; 05.03.2013
comment
Apple има добра документация или Сайтът на Рей Вендерлих - person kineticfocus; 05.03.2013