2015-08-21 9 views
9

abrufen Ich versuche, ein PDF in UIWebView über NSURL anzuzeigen. Es funktioniert gut.PDF-Dokumenthöhe in iOS WebView

Aber Ich weiß nicht, die Höhe von PDF-Dokument. Manchmal erstellt es Leerzeichen oder muss geblättert werden. Die PDF kann auch mehrere Seiten enthalten.

Ich möchte nur die erste Seite anzeigen, wenn sie mehrere Seiten enthält.

Mein Code ist wie folgt:

NSURL *url = [NSURL URLWithString:@"http://www.eecs.harvard.edu/econcs/pubs/online.pdf"]; 
NSURLRequest * request = [NSURLRequest requestWithURL:url]; 
    [web_large loadRequest:request]; 
    [web_large setScalesPageToFit:YES]; 

Gerade jetzt, die WebView hat eine feste Höhe

+0

Wenn Sie nur die Höhe des Dokuments benötigen, dann ist diese Frage ein Duplikat. Wenn Sie die Menge an belegtem Speicherplatz auf einer bestimmten Seite benötigen, sollten Sie Ihren Ansatz überdenken, da ein PDF-Format von Natur aus ein Portable Document Format ist, das über Plattformen und Browser hinausgeht. Wenn dieser Leerraum vom Ersteller des Dokuments beabsichtigt wurde, was wahrscheinlich der Fall ist, wenn PDF-Dokumente als Seiten erstellt werden, können Sie sie möglicherweise anzeigen. – SwiftArchitect

Antwort

2

Versuchen Sie, diese

Es ist diese Methode:

size_t CGPDFDocumentGetNumberOfPages(CGPDFDocumentRef document) 

Das gibt Sie die numberofpages.

Für z.

NSURL *pdfUrl = [NSURL fileURLWithPath:yourPath];  
CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef)pdfUrl); 

Im Folgenden Code gibt height von singlepage in pdf Datei

float width = CGPDFPageGetBoxRect(pdfPageRef, kCGPDFMediaBox).size.width; 
    float height = CGPDFPageGetBoxRect(pdfPageRef, kCGPDFMediaBox).size.height; 

Hoffe, es hilft.

+0

Danke für Ihre Antwort! aber es gibt falsche Höhe! z.B. es gibt Höhe von 800, aber wenn ich 800 px Höhe für Web-Ansicht einstellen, dann scheint es viel Leerstelle! – user2526811

+0

@ user2526811 Die Dimensionen von CGPDFPageGetBoxRect sind die nativen Dimensionen des Dokuments. Sie müssen die Höhe der Webansicht auf "web_large.frame.size.width * (height/width)" festlegen, sodass die Höhe ein Verhältnis der Dokumentgröße ist – SomeGuy

0

Versuchen Sie dies .. Seine adaequat

NSURL* pdfFileUrl = targetURL; 
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfFileUrl); 

CGFloat pdfHeight = 0; 
NSUInteger totalNum = CGPDFDocumentGetNumberOfPages(pdf); 
for(int i = 0; i < totalNum; i++) { 
    CGPDFPageRef myPageRef=CGPDFDocumentGetPage(pdf, i+1); 
    CGRect cropBox = CGPDFPageGetBoxRect(myPageRef, kCGPDFCropBox); 
    pdfHeight+=cropBox.size.height; 
    int pageRotation = CGPDFPageGetRotationAngle(myPageRef); 
    CGSize pageVisibleSize = CGSizeMake(cropBox.size.width, cropBox.size.height); 
    if ((pageRotation == 90) || (pageRotation == 270) ||(pageRotation == -90)) { 
     pageVisibleSize = CGSizeMake(cropBox.size.height, cropBox.size.width); 
    } 
} 
NSLog(@"%f",pdfHeight); 
+0

Danke für deine Antwort! Warte .. Ich überprüfe – user2526811

+0

Entschuldigung! aber es funktioniert nicht! Es ist die gleiche Antwort, wenn ich bedenke, dass pdf nur 1 Seite hat. Es gibt Höhe als 800, aber es zeigt viel Leerstelle! – user2526811

0

Statt Laden pdf in webView würde ich Ihnen PDF in UIView ziehen vorschlagen mögen, wie ich in meinem eigenen Projekt getan haben und es funktioniert perfekt. Unten ist meine UIView SubClass, die PDF im UIView Kontext zeichnet.

PDFPage.h

#import <UIKit/UIKit.h> 

@protocol PDFPageDelegate; 



@interface PDFPage : UIView 

@property uint     currentPage; 
@property unsigned long   totalPages; 
@property CGRect     pageRect; 
@property NSString    *pdfPath; 
@property id<PDFPageDelegate> delegate; 


- (CGRect)setPdf:(NSString*)filePath; 
- (void)swipeLeft; 
- (void)swipeRight; 
- (void)setPageNumber:(NSUInteger)targetPageNumber; 

@end 







@protocol PDFPageDelegate <NSObject> 

- (void)pdfWillSwipeToLeft:(uint)upcommingPageNumber; 
- (void)pdfWillSwipeToRight:(uint)upcommingPageNumber; 
- (void)pdfTaped:(CGPoint)tapAt; 
- (void)pdfDoubleTapped; 

@end 

PDFPage.m

#import "PDFPage.h" 

@implementation PDFPage 

@synthesize pageRect  = _pageRect; 
@synthesize currentPage  = _currentPage; 
@synthesize totalPages  = _totalPages; 
@synthesize delegate  = _delegate; 
@synthesize pdfPath   = _pdfPath; 




- (instancetype)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) {} 

    _currentPage = 1; 

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft)]; 
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    [self addGestureRecognizer:swipeLeft]; 


    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight)]; 
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight; 
    [self addGestureRecognizer:swipeRight]; 

    return self; 
} 



- (void)setPageNumber:(NSUInteger)targetPageNumber 
{ 
    _currentPage = (uint)targetPageNumber; 

    [self setNeedsDisplay]; 
    [UIView transitionWithView:self duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        [self.layer displayIfNeeded]; 
       } completion:nil]; 
} 

- (void)swipeLeft 
{ 
    if(_currentPage == _totalPages) 
     return; 

    _currentPage++; 

    [_delegate pdfWillSwipeToLeft:_currentPage]; 

    [self setNeedsDisplay]; 
    [UIView transitionWithView:self duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        [self.layer displayIfNeeded]; 
       } completion:nil]; 
} 

- (void)swipeRight 
{ 
    if(_currentPage == 1) 
     return; 


    _currentPage--; 


    [_delegate pdfWillSwipeToRight:_currentPage]; 


    [self setNeedsDisplay]; 
    [UIView transitionWithView:self duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        [self.layer displayIfNeeded]; 
       } completion:nil]; 

} 



- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // PDF might be transparent, assume white paper 
    [[UIColor whiteColor] set]; 
    CGContextFillRect(ctx, rect); 

    // Flip coordinates 
    CGContextGetCTM(ctx); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -rect.size.height); 

    // url is a file URL 
    CFURLRef pdfURL = (__bridge CFURLRef)[NSURL fileURLWithPath:_pdfPath]; 
    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(pdfURL); 
    CGPDFPageRef page1 = CGPDFDocumentGetPage(pdf, _currentPage); 

    // get the rectangle of the cropped inside 
    CGRect mediaRect = CGPDFPageGetBoxRect(page1, kCGPDFCropBox); 

    CGContextScaleCTM(ctx, rect.size.width/mediaRect.size.width, 
        rect.size.height/mediaRect.size.height); 
    CGContextTranslateCTM(ctx, -mediaRect.origin.x, -mediaRect.origin.y); 

    // draw it 
    CGContextDrawPDFPage(ctx, page1); 
    CGPDFDocumentRelease(pdf); 
} 



- (CGRect)setPdf:(NSString*)filePath 
{ 

    _pdfPath =filePath; 
    _currentPage = 1; 
    CFURLRef pdfURL = (__bridge CFURLRef)[NSURL fileURLWithPath:_pdfPath]; 

    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(pdfURL); 
    CGPDFPageRef page = CGPDFDocumentGetPage(pdf,_currentPage); 

    _pageRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox); 
    _totalPages = (CGPDFDocumentGetNumberOfPages(pdf)); 
    [self setNeedsDisplay]; 
    [UIView transitionWithView:self duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        [self setNeedsDisplay]; 
       } completion:nil]; 

    CGRect finalRect = CGRectMake(0, 0, _pageRect.size.width, _pageRect.size.height); 

    return finalRect; 
} 

Wie zu verwenden: -

NSData *pdfData = [NSData dataWithContentsOfURL:[NSURL URLWithString:pdfPath]]; // here pdfPath is webURL 

    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * savePDFAt = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
    savePDFAt = [NSString stringWithFormat:@"%@/PDFs/",savePDFAt]; 
    [[NSFileManager defaultManager] createDirectoryAtPath:savePDFAt withIntermediateDirectories:NO attributes:nil error:nil]; 
    [savePDFAt stringByAppendingPathComponent:"test.pdf"]; 

    if([pdfData writeToFile:savePDFAt options:0 error:&error]) 
     NSLog(@"PDF download complete"); 

    PDFPage *pdfPage = [PDFPage new]; 
    pdfPage.alpha = 0.0f; 
    pdfPage.delegate = self; 
    pdfPage.frame = [pdfPage setPdf:pdfPath]; 

Dann fügen Sie diese PDFPAGE Selbst Sicht oder Auswahlrad.

+0

In der wie zu verwenden Beispiel gibt es keine Deklaration von '' pdfPath '' Variable –

1

Dieser ist einfach.

Sie haben die Scroll des webView zuzugreifen nicht die Webansicht selbst:

CGFloat totalHeight = self.webView.scrollView.contentSize.height; 
+2

^Warum wird dies nicht als die Antwort akzeptiert, dies gibt die gewünschte Höhe des Inhalts der PDF in der Webview ganz richtig –

+0

Die Person sagte ausdrücklich " Aber __Ich kenne nicht die Höhe des PDF-Dokuments__ "und der Titel der Frage ist:" PDF-Dokumentenhöhe in iOS WebView holen "ich denke, meine Antwort ist ziemlich gut für diese Umstände @SwiftArchitect ich denke, dass alle anderen, die es beantwortet haben, es aufgenommen haben eine andere Richtung –

+0

Richtig. Ich hätte schwören können, dass es nicht so angefangen hat. Dann ist dies kein Duplikat von http://stackoverflow.com/questions/20755231/calculate-pdf-content-height-in-ios oder http://stackoverflow.com/questions/3045587/how-to-get-actual -pdf-Seitengröße-in-ipad? – SwiftArchitect

3

Pradumna Patil Antwort richtig ist. Ich habe deinen Code mit seinem Code kombiniert, und es hat gut funktioniert.Fügen Sie einfach die folgenden Zeilen in Ihr Projekt und sehen Sie selbst:

UIWebView *web_large = [[UIWebView alloc]init]; 
[self.view addSubview:web_large]; 

NSURL *url = [NSURL URLWithString:@"http://www.eecs.harvard.edu/econcs/pubs/online.pdf"]; 
NSURLRequest * request = [NSURLRequest requestWithURL:url]; 
[web_large loadRequest:request]; 
[web_large setScalesPageToFit:YES]; 

CGPDFDocumentRef pdfDocumentRef = CGPDFDocumentCreateWithURL((CFURLRef)url); 
CGPDFPageRef pdfPageRef = CGPDFDocumentGetPage(pdfDocumentRef, 1); 

CGRect pdfPageRect = CGPDFPageGetBoxRect(pdfPageRef, kCGPDFMediaBox); 

float width = pdfPageRect.size.width; 
float height = pdfPageRect.size.height; 

CGRect screenRect = [[UIScreen mainScreen]bounds]; 
web_large.frame = CGRectMake(0, 0, screenRect.size.width, height*screenRect.size.width/width); 
+0

funktioniert nicht für mich. ist CGPDFDocumentCreateWithURL asynchron? – user1709076

0

in Swift können Sie tun:

let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first 
let writePath = documents?.appending("/myPdf.pdf") 
let pdf: CGPDFDocument! = CGPDFDocument(URL.init(fileURLWithPath: writePath!) as CFURL)`enter code here` 
let firstPage: CGPDFPage = pdf.page(at: 1)! 
let heightFirstPage :CGRect = firstPage.getBoxRect(.mediaBox) 
var heightPagePdf : CGFloat = heightFirstPage.height; 

die Variable ‚pdf‘ eine Eigenschaft ‚NumberOfPages‘ hat, damit Sie wissen, die gesamte Höhe des PDF-Dokuments (pdf.numberOfPages * heightPagePdf).

Beste Sicht

Verwandte Themen