iOS: создание PDF из UIView - PullRequest
       16

iOS: создание PDF из UIView

3 голосов
/ 22 сентября 2011

Я пытаюсь создать PDF из UIView, который может содержать изображения, метки и т. Д. Я проверил ссылку ( GeneratingPDF ) и мне также известен метод renderInContext:,который можно использовать для рисования содержимого UIView в контексте PDF.

Я использовал renderInContext: для создания PDF.Однако изображения и текст утратили верность.Т.е. изображения не могли быть выбраны по отдельности, а текст не мог быть выбран / скопирован и т. д. в полученном PDF.Это было так же хорошо / плохо, как PDF, созданный из снимка UIView.

. Мой вопрос: нужно ли мне рисовать тексты и изображения по отдельности, чтобы достичь того, чего я хочу (используя CGContextShowTextAtPoint &CGContextDrawImage)?

Если да, то как мне отсканировать UIView для текстов и изображений?Предположим, что я получил UIView извне и не знаю о его содержимом.

Ответы [ 3 ]

2 голосов
/ 06 января 2012

У меня была небольшая удача: я прошелся по иерархии представлений и вызвал -drawRect: себя. Есть немного настроек, которые вы должны выполнить перед каждым, например, перевод ctm и очистка текстовой матрицы, но когда вы сделали это для каждого представления, вы можете сделать это:

UIGraphicsPushContext(ctx);
[self drawRect:self.frame];
UIGraphicsPopContext();

PDF-файл, который он генерирует, основан на векторах, а не на плоском растровом изображении, поэтому он хорошо масштабируется, и вы можете выбрать текст в средстве просмотра / браузере. Это работает только на обычном ванильном рисовании и очень простых вещах, таких как UILabels. Я сомневаюсь, что это будет работать с более сложными объектами UIKit (я имею в виду представления таблицы и представления прокрутки). Кроме того, вам понадобится дополнительная работа для UIImageViews (я предполагаю установить свойство содержимого слоя с помощью CGImageRef), а если у вас есть другие атрибуты и преобразования на основе слоя - еще больше работы.

Надеюсь, Apple даст нам лучшее решение, чем поддержка кода параллельного рисования!

1 голос
/ 22 сентября 2011

Вы действительно должны рисовать тексты / изображения по отдельности в CGContextRef (смотрите CGPDFContextCreateWithURL), используя такие функции, как CGContextShowTextAtPoint.Хотя теоретически вы можете сканировать свой UIView на наличие изображений / меток, было бы лучше, если бы вы просто рисовали макет с нуля.У вас должен быть какой-то способ узнать, какие элементы должны быть в UIView.Хотя код будет сильно отличаться, логически вы должны подходить к нему так же, как если бы вы собирались рисовать UIView программно, а не загружать его из пера.

Если вы действительно хотите сканировать UIView,Вы могли бы сделать что-то вроде этого:

for(UIView *subview in parentView.subviews) {
 if([subview isKindOfClass:[UIImageView class]]) {
  ...
 } else if([subview isKindOfClass:[UITextView class]]) {
  ...
 } else if([subview isKindOfClass:[UILabel class]]) {
  ...
 }
}
0 голосов
/ 27 августа 2012

попробовать

{
   //read the pdf file

     CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),     CFSTR("iPhoneAppProgrammingGuide.pdf"), NULL, NULL);
        PDFfile = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
        CFRelease(pdfURL)

    CGPDFPageRef page = CGPDFDocumentGetPage(PDFfile,currentpage);

    context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(context,self.bounds);   
    CGContextTranslateCTM(context, -1.0, [self bounds].size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page,  kCGPDFArtBox, [self bounds], 0, true));
    CGContextDrawPDFPage(context, page);    
    CGContextRestoreGState(context);
    //CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox),
                                                CGContextGetClipBoundingBox(context));

      // CGContextConcatCTM(context, transform);
         UIGraphicsBeginImageContext(CGSizeMake(self.bounds.size.width, self.bounds.size.height));


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