2011-08-29 75 views
1

我有一个ipad应用程序,它在UIWebView中显示来自NSData的演示文稿演示文稿,我需要知道单个幻灯片的宽度/高度,所以我知道前进到下一张幻灯片时滚动多远。可以在iPad上计算Powerpoint演示文稿的宽度/高度

在PDF中,我可以使用CGPDFDocumentRef来计算它,如下所示,但是我找不到相应的powerpoint API,并且因为它是微软格式,所以我怀疑它甚至存在。

我可以使用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 
+0

由于滑动的高度和宽度是在PPT演示级属性(换言之,所有幻灯片具有相同的尺寸),如果可以导出用于演示文稿中的高度,必须在呈现每个幻灯片的高度。但是,您是否真的在使用PPT和幻灯片,或者是否使用了其他应用程序对演示文稿内容的表示? –

+0

@Steve,我正在使用UIWebView对幻灯片/演示文稿内容的表示。您可以在其上运行JavaScript来确定内容的高度/宽度,但高度= ENTIRE演示的高度,从幻灯片1中的第一个像素到幻灯片N中的最后一个像素。如果我能确定幻灯片的数量,则可以取这个数字并划分,但我不知道幻灯片的数量,并且无法知道。 – MrFurious

+0

那么实际上整个演示文稿就变成了一个大的可滚动网页或类似的东西?我从背景中想到,情况可能是这样,但并不确定。每张幻灯片是否都被转换为图像(如果是这样,你能从DOM获得它的高度吗?) –

回答

3

想通了。

在这种情况下,UIWebView的行为就好像它是一个HTML页面上的iFrame,它具有一些Powerpoint文件的来源。所以,你可以对它做某些事情,以及某些暴露的属性。

我发现document.all(一个数组)有元素 - 很多元素。我的20页Powerpoint测试文件有超过300个元素。查看它们的宽度/高度并不太有帮助 - 其中一些是iframe本身的尺寸,一些是从幻灯片1的左上像素到幻灯片N的右下像素的尺寸,一些是0x0,另一些是在中间)是幻灯片的尺寸。我发现的模式是,您必须跳过document.all中的第一个元素,然后遍历,直到找到非宽度/高度为零的值,它们具有相同的clientHeight,offsetHeight,scrollHeight值以及相同的值clientWidth,offsetWidth和scrollWidth。其中第一个会给你一个幻灯片的高度/宽度,你可以从那里去。当然,因为您使用的是UIWebView,并且只有stringByEvaluatingJavaScriptFromString可以使用,所以您需要在一行javascript中返回值。

因此,提取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似乎需要几毫秒来收集并使其可用。我在webview完成加载后运行这个1秒,并且它对ppt和pptx文件都很好。但它不适用于pdf。

+0

谢谢..真的节省时间:D –

0

除其他外,这些对象包含width和height属性:

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 

最适合你似乎是最后一个。

在全屏

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

PPT在约结果1680 X 1050屏幕

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 
+0

感谢,但(除非我读你错了),你似乎是假设我在PowerPoint中运行这个,或ppviewer - 我不是,它在iPad应用程序中显示在UIWebView中,甚至不作为ppt应用程序运行,但更多的是作为Web浏览器显示它。任何VBA DOM访问 - 尽管对我来说再次检查并不是一个坏主意。我会给它一个旋转(以及尝试其他javascriptie的可能性),并会发布,如果你的东西有帮助,但除非你听到回来的积极,你的解决方案将无法正常工作。 – MrFurious

+0

对不起......我似乎错过了这一点...我明天将删除我的答案 – MikeD

+0

不妨回复这个问题 - 它不会回答问题,但不会将错误信息发送给我,它可能会帮助我或其他人尝试找到适当的解决方案。谢谢! – MrFurious

相关问题