Конвертировать PDF в UIImageView - PullRequest
       1

Конвертировать PDF в UIImageView

2 голосов
/ 13 декабря 2011

Я нашел код, который дает мне UIImage из PDF-файла.Это работает, но у меня есть два вопроса:

  • Есть ли возможность добиться лучшего качества UIImage?(См. Скриншот)
  • Я вижу только первую страницу в моем UIImageView.Нужно ли встраивать файл в UIScrollView, чтобы завершить?
  • Или лучше отрендерить только одну страницу и использовать кнопки для навигации по страницам?

PSЯ знаю, что UIWebView может отображать PDF-страницы с некоторыми функциями, но мне нужно это как UIImage или, по крайней мере, UIView.

Bad quality Image:

Bad quality Image

Code:

-(UIImage *)image {
UIGraphicsBeginImageContext(CGSizeMake(280, 320)); 

CGContextRef context = UIGraphicsGetCurrentContext();

CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("ls.pdf"), NULL, NULL);

CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);

CGContextTranslateCTM(context, 0.0, 320);

CGContextScaleCTM(context, 1.0, -1.0);

CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 4);

CGContextSaveGState(context);

CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, CGRectMake(0, 0, 280, 320), 0, true);

CGContextConcatCTM(context, pdfTransform);

CGContextDrawPDFPage(context, page);

CGContextRestoreGState(context);

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext();
return resultingImage;
}

Ответы [ 2 ]

2 голосов
/ 27 августа 2012

Я знаю, что я немного опоздал, но я надеюсь, что смогу помочь кому-то еще в поисках ответа.Что касается задаваемых вопросов:

  • Боюсь, единственный способ добиться лучшего качества изображения - это сделать изображение большего размера и позволить UIImageView изменить его размер для вас.Я не думаю, что вы можете установить разрешение, но использование большего изображения может быть хорошим выбором.Рендеринг страницы не займет слишком много времени, и изображение будет более качественным.PDF-файлы обрабатываются по требованию в зависимости от уровня масштабирования, поэтому они кажутся «более качественными».

  • Что касается рендеринга всех страниц, вы можете получить количество страниц вдокумент, вызывающий CGPDFDocumentGetNumberOfPages( pdf ) и использующий простой цикл for, позволяет объединить все изображения, созданные в одно изображение.Для его отображения используйте UIScrollVIew.

  • На мой взгляд, этот подход лучше, чем выше, но вы должны попытаться оптимизировать его, например, рендеринг всегда текущего,предыдущая и следующая страница.Для хороших эффектов перехода с прокруткой, почему бы не использовать горизонтальный UIScrollView.

Для более общего кода рендеринга я всегда выполняю вращение следующим образом:

int rotation = CGPDFPageGetRotationAngle(page);

CGContextTranslateCTM(context, 0, imageSize.height);//moves up Height
CGContextScaleCTM(context, 1.0, -1.0);//flips horizontally down
CGContextRotateCTM(context, -rotation*M_PI/180);//rotates the pdf
CGRect placement = CGContextGetClipBoundingBox(context);//get the flip's placement
CGContextTranslateCTM(context, placement.origin.x, placement.origin.y);//moves the the correct place

//do all your drawings
CGContextDrawPDFPage(context, page);

//undo the rotations/scaling/translations
CGContextTranslateCTM(context, -placement.origin.x, -placement.origin.y);
CGContextRotateCTM(context, rotation*M_PI/180);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageSize.height);

Steipete уже упоминал, устанавливая белый фон:

CGContextSetRGBFillColor(context, 1, 1, 1, 1);
CGContextFillRect(context, CGRectMake(0, 0, imageSize.width, imageSize.height)); 

Так что последнее, что нужно иметь в виду, при экспорте изображения, установите качество на максимум.Например:

UIImageJPEGRepresentation(image, 1);
1 голос
/ 27 декабря 2011

Что вы делаете с CGContextTranslateCTM(context, 0.0, 320); звонком?

Вы должны извлечь правильные метрики из PDF-файла с кодом, подобным следующему:

 cropBox = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
 rotate = CGPDFPageGetRotationAngle(page);

Кроме того, как вы видите, PDF может содержать информацию о повороте, поэтому вам нужно использовать CGContextTranslateCTM/CGContextRotateCTM/CGContextScaleCTM в зависимости от угла.

Вы также можете захотеть обрезать любой контент, находящийся за пределами области CropBox, так как pdf имеет различные viewPorts, которые вы обычно не хотите отображать (например, для принтеров, чтобы была возможна бесшовная печать) -> use CGContextClip.

Далее, вы забываете, что ссылка на PDF определяет белый цвет фона. Существует множество документов, которые вообще не определяют цвет фона - вы получите странные результаты, если не нарисуете белый фон самостоятельно -> CGContextSetRGBFillColor & CGContextFillRect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...