Можно ли рассчитать ширину / высоту презентации PowerPoint на iPad? - PullRequest
1 голос
/ 29 августа 2011

У меня есть приложение ipad, которое отображает презентацию powerpoint из NSData в UIWebView, и мне нужно знать ширину / высоту одного слайда, чтобы знать, как далеко прокручиваться при переходе к следующему слайду.

В PDF я могу рассчитать его, используя CGPDFDocumentRef, как показано ниже, но я не могу найти соответствующий API для powerpoint, и, поскольку это формат Microsoft, я сомневаюсь, что он даже существует.

Я могу использовать javascript для определения ширины / высоты ВСЕЙ презентации, но это не помогает мне понять, как далеко продвинуться, чтобы пройти один слайд,

Код, чтобы сделать то, что мне нужно для PDF:

CFDataRef myPDFData = (CFDataRef)presentationContent;
CGDataProviderRef provider = CGDataProviderCreateWithCFData(myPDFData);
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(provider);
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1);
CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
int pageHeight=(int)pageRect.size.height;
int pageWidth=(int)pageRect.size.width;
//now I can advance to the proper page by doing a scrollto pageHeight*currentPage

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Разобрался.

В этом случае UIWebView работает так, как будто это iFrame на HTML-странице, которая имеет источник некоторого файла powerpoint.Итак, есть определенные вещи, которые вы можете с этим сделать, и определенные свойства, которые предоставляются.

Я обнаружил, что document.all (массив) имеет элементы - МНОЖЕСТВО элементов.Мой тестовый файл PowerPoint на 20 страниц содержал более 300 элементов.Рассматривать их ширину / высоту было не слишком полезно - некоторые были размерами самого iframe, некоторые были размерами от верхнего левого пикселя слайда 1 до нижнего правого пикселя слайда N, некоторые были 0x0, а некоторые (похороненыв середине) были размеры слайда.Шаблон, который я обнаружил, заключался в том, что вам нужно пропустить первый элемент в document.all и выполнять итерацию до тех пор, пока вы не найдете элемент с ненулевой шириной / высотой, который имеет идентичные значения для clientHeight, offsetHeight, scrollHeight, а также идентичные значения дляclientWidth, offsetWidth и scrollWidth.Первый из них даст вам высоту / ширину одного слайда, и вы можете перейти оттуда.И, конечно же, поскольку вы используете UIWebView и имеете только stringByEvaluatingJavaScriptFromString для работы, вам нужно сделать все это в одной строке JavaScript, которая возвращает значение.

Итак, чтобы извлечь width / heightпрезентации PowerPoint, вы можете написать:

NSString *w=[webview stringByEvaluatingJavaScriptFromString:@"function x(){var rtn='';for (var i=1;i<document.all.length;i++){var a=document.all[i];if (((a.clientWidth>0)&&(a.clientHeight>0))&&(a.scrollHeight.toString()==a.offsetHeight.toString())&&(a.offsetHeight.toString()==a.clientHeight.toString())){return ''+a.offsetWidth; }}return rtn;};x();"];
NSString *h=[webview stringByEvaluatingJavaScriptFromString:@"function x(){var rtn='';for (var i=1;i<document.all.length;i++){var a=document.all[i];if (((a.clientWidth>0)&&(a.clientHeight>0))&&(a.scrollHeight.toString()==a.offsetHeight.toString())&&(a.offsetHeight.toString()==a.clientHeight.toString())){return ''+a.offsetHeight; }}return rtn;};x();"];

и делать все, что вам нужно с шириной / высотой с этой точки.

Да, и document.all не заполняется сразукак только ваш документ загружен - UIWebView, похоже, потребуется несколько миллисекунд, чтобы собрать его и сделать его доступным.Я запускаю эту 1 секунду после завершения загрузки моего веб-просмотра, и он прекрасно работает как с файлами ppt, так и с pptx.это не работает на PDF, хотя.

0 голосов
/ 30 августа 2011

среди прочих, эти объекты содержат свойства ширины и высоты:

Sub Test()
Dim A As Application

    Set A = Application
    Debug.Print A.Width, A.Height
    Debug.Print A.Windows(1).Width, A.Windows(1).Height
    Debug.Print A.SlideShowWindows(1).Width, A.SlideShowWindows(1).Height

End Sub

Наиболее подходящим для вас кажется последний.

Результаты для экрана 1680 x 1050

PPT в полноэкранном режиме

 1266          793,5 
 1245,75       699,75 
 1260          787,5 

PPT в ок. 1/2 экрана

 711,75        551,25 
 691,5         457,5 
 1260          787,5  <-- same as above as slideshows always go full-screan at the selected aspect ratio
...