iphone pdf uiwebview cgpdfdocument

iphone - ¿Hay alguna manera de desplazarse programáticamente a una página PDF dentro de UIWebView?



cgpdfdocument (5)

Así que esta publicación ha estado abierta desde hace bastante tiempo, pero dado que es la primera entrada en una búsqueda en Google de "scroll pdf uiwebview", pensé que daría mi opinión a futuros lectores.

De hecho, puede desplazarse a una página en particular en un documento PDF utilizando nada más que puro Java Script. He publicado un código de muestra en nuestro blog ( http://apptech.next-munich.com/2011/02/pdf-in-uiwebview.html ) pero aquí hay un breve resumen de lo que debe hacer:

  1. Use la propiedad window.outerHeight DOM para encontrar la altura total del documento PDF renderizado.
  2. Use la propiedad window.innerHeight DOM para encontrar la altura de la ventana del navegador en las coordenadas del navegador.
  3. Salta a la página usando la función window.scrollTo (x, y).

Sin embargo, hay un inconveniente: no puedes simplemente conectar el outerHeight por el número de páginas y saltar a lo que obtienes. En cambio, deberá multiplicar por la proporción innerHeight / webView.bounds.size.height.

Es posible usar JavaScript para establecer la compensación de píxeles y de un UIWebView , por ejemplo:

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];

Entonces, hay una manera de obtener:

  1. ¿La altura de píxel de una página individual de un PDF dentro de la vista web?
  2. El tamaño de la brecha entre las páginas?

¿Esta información está disponible desde UIWebView o se puede calcular a través de medios alternativos?

Estoy pensando que si tengo el número de páginas (a través de CGPDFDocumentGetNumberOfPages ), la brecha de altura de píxeles entre páginas, o la altura de píxel de una página individual, puedo calcular el offset para utilizar con la llamada de JavaScript. Luego UIButton un UIButton o un UISlider para pasar de una página a otra.

EDITAR I

Tengo una solución, pero usa UIWebDocumentView , una subvista privada de UIWebView .

Creo un controlador de vista llamado PDFViewerViewController , que es una subclase de WebViewerViewController , que a su vez es un controlador de vista que contiene una UIToolbar , un UIWebView , y se ajusta al protocolo UIWebViewDelegate .

Mi PDFViewerViewController calcula cierta información sobre la vista web PDFViewerViewController y los datos PDF, después de que se llama el método delegado de la vista web -webViewDidFinishLoad: .

Esta información se usa para calcular un desplazamiento aproximado por página que se alimenta a la vista web a través de JavaScript.

PDFViewerViewController.h

#import <UIKit/UIKit.h> #import "WebViewerViewController.h" @interface UIWebDocumentView : NSObject {} @end @interface PDFViewerViewController : WebViewerViewController { NSUInteger offset; NSUInteger currentPage; NSUInteger documentPages; CGFloat documentHeight; CGFloat pageHeight; } @property (assign) NSUInteger offset; @property (assign) NSUInteger currentPage; @property (assign) NSUInteger documentPages; @property (assign) CGFloat documentHeight; @property (assign) CGFloat pageHeight; @end

PDFViewerViewController.m

#import "PDFViewerViewController.h" @implementation PDFViewerViewController @synthesize offset; @synthesize currentPage; @synthesize documentPages; @synthesize documentHeight; @synthesize pageHeight; - (void) viewDidLoad { [super viewDidLoad]; UIBarButtonItem *_leftArrow = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ArrowLeft.png"] style:UIBarButtonItemStylePlain target:self action:@selector(leftArrow:)]; UIBarButtonItem *_flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; UIBarButtonItem *_rightArrow = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ArrowRight.png"] style:UIBarButtonItemStylePlain target:self action:@selector(rightArrow:)]; [[super.viewerToolbarView toolbar] setItems:[NSArray arrayWithObjects:_leftArrow, _flexibleSpace, _rightArrow, nil]]; [_leftArrow release]; [_flexibleSpace release]; [_rightArrow release]; self.currentPage = 0; } - (void) webViewDidFinishLoad:(UIWebView *)_webView { for (UIView *_subview in [[[_webView subviews] objectAtIndex:0] subviews]) { if ([_subview isKindOfClass:[UIWebDocumentView class]]) { self.documentHeight = _subview.bounds.size.height; } } CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)baseURL); self.documentPages = CGPDFDocumentGetNumberOfPages(pdfDocument); CGPDFDocumentRelease(pdfDocument); self.pageHeight = (self.documentHeight + (10 * self.documentPages)) / self.documentPages; self.currentPage = 1; self.offset = 0; } - (void) leftArrow:(id)_param { if (self.currentPage == 1) return; self.offset -= (NSUInteger)self.pageHeight; self.currentPage--; [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", (self.offset * 2)]]; } - (void) rightArrow:(id)_param { if (self.currentPage == self.documentPages) return; self.offset += (NSUInteger)self.pageHeight; self.currentPage++; [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", (self.offset * 2)]]; }

Algunas observaciones

  1. El cálculo de compensación no es perfecto para la página. Si el documento PDF no es 8.5 x 11 (por ejemplo, A4), entonces el error de compensación empeora más rápidamente.

  2. La propiedad self.currentPage no se actualiza cuando se desplaza por la vista web mediante la función de tocar y arrastrar. Se pueden arrastrar algunas páginas y, luego, tocar la flecha izquierda o derecha de la barra de herramientas hará que el desplazamiento se mueva inesperadamente a una página anterior.

  3. Esta solución usa UIWebDocumentView , que es privado y puede causar el rechazo de la aplicación.

Creo que presentaré una solicitud de mejora de funciones con Apple.

¿Alguien ha construido un UIWebView de PDF no basado en UIWebView (con código fuente)?


El uiwebview comúnmente utilizado para cargar archivos PDF tiene su propio objeto scrollview al que puede hacer llamadas. intente algo como esto:

[webview.scrollView setContentOffset:CGPointMake(0, webview.scrollView.contentOffset.y + 100) animated:YES];

Esto desplazará la vista para el pdf hacia abajo de 100 píxeles. En cuanto a obtener el número de página del pdf, solo puedo imaginar que javascript es lo que necesita echar un vistazo. O bien, si simplemente conoce la cantidad de píxeles en cada página del pdf, incremente o disminuya según sea necesario. :)


Me enfrenté a un problema similar, en el que tuve que desplazarme a una página particular en PDF (que se muestra con UIWebView) al seleccionar una celda correspondiente a esa página en tableView (vista en miniatura de la tabla).

Así que escribí un fragmento de código que le permite desplazarse a una página en particular en PDF.

No estoy usando ningún código de JavaScript. Solo estoy haciendo un seguimiento de la escala de zoom aplicada a la página PDF original cada vez y calculando el desplazamiento actualizado requerido para desplazarme a cada página. Entonces, esto funciona incluso si el PDF está en modo zoom .

Puedes encontrar el código aquí .


Creo que tendrá que cargar y mostrar el PDF usted mismo utilizando las API de PDF en lugar de UIWebView. Aquí hay una idea posible de cómo simular el desplazamiento de ajuste a los límites de la cuadrícula rectangular, lo que puede ayudarlo a hacer que la experiencia se parezca más a una UIWebView para sus usuarios.

iPhone sdk Cocoa Touch - El pase toca desde el padre UIView al niño UIScrollview


He visto tu edición en cuestión. ¿Alguien ha construido un visor de PDF no basado en UIWebView (con código fuente)?

Ver mi pregunta

Lectura de archivos PDF como cadenas a través de la aplicación de iPhone

Tiene la funcionalidad para mostrar cada página pdf en una vista de imagen. el usuario puede cambiar páginas fácilmente Pero los puntos faltantes son los siguientes.

  • el usuario no puede hacer ninguna selección, ya que no es texto sino una imagen
  • el usuario no puede encontrar ningún texto.
  • el usuario no puede hacer zoom (sí, sí; puede poner la vista de imagen en la vista de desplazamiento para ampliar la funcionalidad)