2010-08-31 6 views
0

J'ai deux questions liées à la gestion du rendu PDF sur iPad/iPhone.Problèmes de rendu PDF sur iPad

Première

Je reçois quelques problèmes étranges lors du rendu page PDF avec des fonctions de CGPDF sur iPad. Etrange, parce que tout fonctionne très bien sur iPhone, iPad mais j'obtiens beaucoup de messages d'erreur liés au format PDF, à savoir comme ci-dessous

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. 

... et bien d'autres. Je comprends que c'est peut-être un problème de mauvaise structure PDF, mais je ne comprends pas pourquoi je peux voir toutes ces erreurs seulement sur iPad alors que sur iPhone il y en a juste un petit nombre comparé à iPad et dans la plupart des cas des erreurs signalées, ce qui, encore une fois, n'est pas vrai sur iPad.

Y at-il une différence dans les implémentations Quartz dans iPhoneOS 3.2 et 3.1/4.0? Et y a-t-il des directives sur le format PDF lisible sur iPhone/iPad?

Deuxième:

Une autre question est à la création du contexte bitmap pour différentes tailles de page. J'ai besoin de rendre la même page PDF pour les orientations portrait et paysage. Mais alors qu'il travaille pour le portrait (à la fois sur iPhone), il n'a pas pour le paysage sur iPad, lancer erreur suivant:

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

Le code utilisé pour créer le contexte est comme suit:

/// 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... 

Comme J'ai dit, ça marche bien sous iPhone et fonctionne pour l'orientation portrait sur iPad, ce n'est pas pour le paysage sur iPad. La seule différence est vraiment la taille de la page actuelle fournie. Cependant, la taille de la page n'est pas égale à la taille de l'écran en mode paysage (1024x768), mais sa taille est calculée en fonction de la largeur de l'écran, permettant à l'utilisateur de faire défiler verticalement pour voir la page complète. En règle générale, la taille de la page sur l'iPad est 1024x1403 (dépend du format PDF).

Je ne comprends pas pourquoi le code ci-dessus ne fonctionne pas pour les tailles de page plus grandes.

Une idée, s'il vous plaît? Merci.

+0

pouvez-vous s'il vous plaît répondre à cette question http://stackoverflow.com/questions/4321681/how -pour-adapter-pdf-page-en-vue-entière – ajay

Répondre

3

En ce qui concerne le deuxième problème, j'avais juste un problème similaire. Le fait que l'avertissement indique que vous allouez 4095 octets par ligne lorsque vous utilisez des pixels de 4 octets indique que vous ne convertissez peut-être pas correctement en ints avant de multiplier.

Pour moi, j'ai pu le résoudre en faisant l'équivalent de

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

à

int bytesPerRow = lrintf(_pageSize.width) * 4; 
+0

pouvez-vous s'il vous plaît répondre à cela http://stackoverflow.com/questions/4321681/how-to-fit-pdf-page-in-entire-view – ajay

+0

aweosme! Merci – drunknbass