CGContextDrawPDFPage отображает белый или искаженный текст

В процессе обновления моего приложения для iPad я пытался нарисовать страницу из существующего PDF-документа в контексте Core Graphics, а затем сохранить ее как новый PDF-файл, но у меня возникли трудности с правильным отображением текста. Изображения в только что созданном PDF-файле выглядят великолепно, но текст редко отображается правильно: чаще всего он выглядит белым/невидимым или искаженным. Когда текст невидим, я все еще могу выбрать, где он должен быть, и правильно скопировать/вставить в текстовый редактор. Это проблема, связанная с ограниченным количеством шрифтов, доступных на iPad?

Мой код выглядит следующим образом:

CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider);
CGPDFPageRef page = CGPDFDocumentGetPage(document, pageNumberToRetrieve);
CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);

UIGraphicsBeginPDFContextToFile(pathToFile, pageRect, nil);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextBeginPage(context, NULL);

// I don't think this line is necessary, but I have tried both with and without it.
CGContextSetTextDrawingMode (context, kCGTextFill);

CGContextDrawPDFPage(context, page);

CGContextEndPage(context);
UIGraphicsEndPDFContext();
CGDataProviderRelease(dataProvider);
CGPDFDocumentRelease(document);

Если у кого-то есть какие-либо предложения, я был бы очень признателен, если бы они были услышаны.

Спасибо за ваше время.

Роб


person Rob    schedule 02.06.2010    source источник


Ответы (2)


Рисование в контексте изображения не представляет проблемы (текст отображается правильно).

Я пытаюсь создать новый PDF-файл, содержащий всего несколько страниц из исходного PDF-файла. Кажется, что текст по какой-то причине неправильно отображается в новом файле.

Информация есть (я могу выбрать текст, «угадав», где он должен быть в предварительном просмотре), но она не отображается. Я предполагаю, что CGContextDrawPDFPage записывает строку в файл PDF, но не рисует ее, потому что не знает, как «выглядят» символы этого шрифта?

Я думал, что смысл встроенных шрифтов в PDF-файлы заключается в том, что программы смогут выполнять подобные манипуляции, даже если этот шрифт не установлен в системе (в данном случае на iPad). Это ограничение формата или фреймворка Quartz?

person Rob    schedule 01.07.2010

Вы хотите отображать на экране? Я не вижу необходимости в UIGraphicsBeginPDFContextToFile? Однако для рендеринга на экране вы можете использовать что-то вроде этого:

pageReference = CGPDFDocumentGetPage(pdfReference, page);

  CGContextRef context = UIGraphicsGetCurrentContext();
  @try {
    CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
    CGContextScaleCTM(context, scale, -scale);

    CGContextSaveGState(context);
    @try {
      CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pageReference, kCGPDFCropBox, self.bounds, 0, true);
      CGContextConcatCTM(context, pdfTransform);
      CGContextDrawPDFPage(context, pageReference);
    }
    @finally {
      CGContextRestoreGState(context);
    }
  }
  @finally {
    UIGraphicsEndImageContext();
  }
person Fuggly    schedule 01.07.2010
comment
В процессе обновления своего приложения для iPad я пытался нарисовать страницу из существующего PDF-документа в контексте Core Graphics, а затем сохранить ее как новый PDF-файл,[...] ‹-- Это самая первая строка его вопрос. Не знаю, как это можно пропустить... :] - person Kalle; 30.08.2010
comment
На самом деле, в 8:15 утра для меня это довольно просто ‹g›. Серьезно, вы смотрели руководство по программированию Quartz 2d: создание PDF-документа, просмотр и преобразование документа? Если нет, есть пример кода о том, как создать документ, отобразить данные в его контексте и затем сохранить этот файл. - person Fuggly; 01.09.2010