CGContextDrawPDFPage отображает белый или искаженный текст - PullRequest
2 голосов
/ 02 июня 2010

В процессе обновления приложения для 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);

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

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

Rob

Ответы [ 2 ]

2 голосов
/ 01 июля 2010

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

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

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

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

0 голосов
/ 01 июля 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();
  }
...