Уменьшить размер PDF - Цель c

У меня есть проект генерации PDF, он состоит из нескольких текстов и изображения, которое уже хранится в БД, я хочу просмотреть и отправить сгенерированный PDF, все в порядке, когда есть только текстовые данные.

Проблема возникает, если в наших данных есть изображение. Почта получает PDF-файл размером 10 МБ или выше, даже если у него есть изображение размером 1 МБ или меньше. Он отлично работает в симуляторе. Мой код для рисования изображения показан ниже:

        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
Перед вашим else нет }, это просто опечатка?   -  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 (Current Transform Matrix).

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
Quartz рисует объекты в режиме конечного автомата. Изменяя масштаб прямоугольника, вы заставляете его повторно интерполировать изображение перед рисованием и, следовательно, добавляете дополнительные данные. - person kineticfocus; 05.03.2013
comment
У Apple есть хорошая документация или Сайт Рэя Вендерлиха - person kineticfocus; 05.03.2013