Проблемы с рендерингом PDF на iPad - PullRequest
0 голосов
/ 31 августа 2010

У меня есть два вопроса, связанных с обработкой рендеринга PDF на iPad / iPhone.

Первый

У меня возникают странные проблемы при рендеринге PDF-страницы с функциями CGPDFна iPad.Странно, потому что все отлично работает на iPhone, но на iPad я получаю много сообщений об ошибках, связанных с PDF, например, как ниже

invalid stream length 9785; endstream not found.
FlateDecode: decoding error: incorrect header check.
invalid function: failed to read 765 bytes.
stack underflow: popping past mark.
missing or invalid arguments for color operator.
FlateDecode: decoding error: incorrect header check.
FlateDecode: decoding error.
<Error>: FT_Open_Face failed: error 2.
<Error>: FT_Open_Face failed: error 85.
encountered unexpected object type: 7.
missing or invalid object number.
invalid image `ColorSpace' value.
unexpected symbol `obj' while reading object.
invalid descendant font for Type0 font.
font `F28' not found in document.
<Error>: FT_Outline_Decompose failed: error 20.
font `R222' not found in document.

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

Есть ли разница в реализациях Quartz в iPhoneOS 3.2 и 3.1 / 4.0?И есть ли какие-то рекомендации по формату PDF для чтения на iPhone / iPad?

Второе:

Другая проблема связана с созданием растрового контекста для страниц разного размера.Мне нужно сделать одну и ту же страницу PDF для портретной и альбомной ориентации.Но хотя он работает для портрета (оба на iPhone), он не работает для ландшафта на iPad, выдавая следующую ошибку:

CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component colorspace; kCGImageAlphaPremultipliedLast; 4095 bytes/row.

Код, используемый для создания контекста, выглядит следующим образом:

/// Calculate memory block size needed
int bytesPerRow = (int)((int)_pageSize.width * 4);
int dataSize = (int)(bytesPerRow * _pageSize.height);

/// Allocate memory; As noted in docs, on iOS 4 it can be NULL, but as mentioned
/// below: Do not pass NULL if you are running on earlier operating systems.
/// So don't pass NULL...
void *bitmapData = malloc(dataSize);

if(!bitmapData) {
    /// Hm, out of memory?
    return NULL;
}

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef context = CGBitmapContextCreate(bitmapData, 
                                             _pageSize.width, 
                                             _pageSize.height, 
                                             8,             /* bits per component*/
                                             bytesPerRow,   /* bytes per row */
                                             colorSpace, 
                                             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGColorSpaceRelease(colorSpace);

if(!context) {
    /// Something is really wrong!
    free(bitmapData);
    bitmapData = NULL;

    return NULL;
}

CGContextClipToRect(context, CGRectMake(0, 0, _pageSize.width, _pageSize.height));

    /// Ask data source to render contents
[_dataSource renderPageAtIndex: pageIndex inContext: context];

    /// Get bitmap image from context
CGImageRef image = CGBitmapContextCreateImage(context);

/// Free context AND previously allocated block of data
CGContextRelease(context);

free(bitmapData);
bitmapData = NULL;

    /// Finish operation...

Как я уже сказал, он отлично работает под iPhone и работает для портретной ориентации на iPad, но не для альбомной на iPad.Разница лишь в том, что текущий размер страницы указан.Тем не менее, размер страницы здесь не равен размеру экрана в альбомном режиме (1024x768), но его размер рассчитывается в соответствии с шириной экрана, что позволяет пользователю прокручивать вертикально, чтобы увидеть всю страницу.Обычно размер страницы на iPad составляет 1024х1403 (зависит от формата PDF).

Я не понимаю, почему приведенный выше код не работает для страниц большего размера.

Есть идеи, пожалуйста?Спасибо.

1 Ответ

3 голосов
/ 17 ноября 2010

Что касается второй проблемы, у меня просто была похожая проблема. Тот факт, что предупреждение указывает на то, что при использовании 4-х байтовых пикселей вы выделяете 4095 байтов на строку, указывает на то, что перед умножением вы, возможно, неправильно конвертировали в целые.

Для меня я смог решить ее, выполнив эквивалент

int bytesPerRow = (int)((int)_pageSize.width * 4);

до

int bytesPerRow = lrintf(_pageSize.width) * 4;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...