8
votes

CGContext PDF Page Aperçu de l'aspect

Je affiche une page PDF sur le CGContext à l'aide du code

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(ctx, layer.bounds);
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFBleedBox, layer.bounds, 0, true));
    CGContextDrawPDFPage(ctx, myPageRef);
}


0 commentaires

5 Réponses :


1
votes

La lecture cassée de votre code suggère l'utilisation de kcgpdfbleedbox doit être remplacée par un autre paramètre, peut-être kcgpdfmeiabox . Voir ici pour plus d'informations.


1 commentaires

Fbrereto, j'ai essayé KCGPDFMediaBox et toutes les autres options disponibles. Mais il n'y a pas de changement dans l'affichage.



2
votes

Le cgpdfpagegetDrawingTransform ne retournera pas simplement la transformation de l'échelle si le rectangle de page PDF est inférieur au paramètre rect .


1 commentaires

TIA, j'ai essayé la même page dans d'autres applications de lecteur PDF et s'affiche correctement à l'écran. Il y a donc une autre façon pour la dessiner pour le faire en forme d'aspect.



18
votes

développer la réponse de TIA; La méthode intégrée CGPDFPAGEGETDrawingTransform renforcera mais pas augmenter. Si vous souhaitez augmenter, vous devez déterminer votre propre transformée en comparant les résultats de CGPDFgetboxRect sur votre zone de contenu. Taper extemporanativement:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(ctx, layer.bounds);
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);

    CGRect cropBox = CGPDFGetBoxRect(myPageRef, kCGPDFCropBox);
    CGRect targetRect = layer.bounds;
    CGFloat xScale = targetRect.size.width / cropBox.size.width;
    CGFloat yScale = targetRect.size.height / cropBox.size.height;
    CGFloat scaleToApply = xScale < yScale ? xScale : yScale;
    CGContextConcatCTM(ctx, CGAffineTransformMakeScale(scaleToApply, scaleToApply)); 

    CGContextDrawPDFPage(ctx, myPageRef);
}


3 commentaires

Pouvez-vous répondre à cette question que j'essaie aussi de la même manière que je ne peux pas obtenir exactement la forme Stackoverflow.com/Questtions/3908624/...


C'est un lien vers cette question; Vous vouliez probablement dire Stackoverflow .com / questions / 4321681 / ... ? Je vais jeter un coup d'œil dès que je suis une opportunité, bien que je sois malheureusement sur le chemin du chemin ...


Mise à jour mineure, cgpdfgetboxrect semble être maintenant cgpdfpagegetboxrect mais incroyablement utile! Ce dimensionnement m'a conduit fou. Vous pouvez également trouver, y compris la ligne CGContexConCAcTCTM (CTX, CGPDFPAGEGETDrawingTransform (myPageref, kcgpdfcropbox, couche.bounds, 0, true)); Avant que le CGContextDrawpdfpage aide les fichiers PDF qui sont tournés à 90 d'immeubles



0
votes

Les autres réponses sont correctes que CGPDFPAGEGETDrawingTransform ne sera pas progressive, mais vous pouvez réduire le rectangle vers le bas pour capturer juste la case choisie. Utilisez CGPDFPAGEGETBOXRect () et calculez la balance comme Tommy suggérée dans la réponse acceptée, puis utilisez-la pour réduire le rectangle de capture transmis dans CGPDFPageGetDrawingTransform (). xxx

puis il est facilement étendu pour gérer également le paysage: xxx


0 commentaires

0
votes

Voici ma solution, qui gère également la rotation. Pourrait par utile. xxx


0 commentaires