为什么来自WebView的dataWithPDFInsideRect不能在Mavericks上创建高质量的PDF?

时间:2014-04-22 20:35:10

标签: html macos cocoa pdf webview

运行sample project并观察在桌面上生成的输出PDF SaveWebPage.pdf

粘贴感兴趣的代码片段

NSURL *url = [[NSBundle mainBundle] URLForResource:@"Page" withExtension:@"html"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];

[[self.webview mainFrame] loadRequest:req];
NSView *view = [[[self.webview mainFrame] frameView] documentView];
NSData *data = [view dataWithPDFInsideRect:[view bounds]];

NSArray* deskTopArrayPaths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
NSString* deskTopPath = [deskTopArrayPaths objectAtIndex:0];
NSString* pdfPath = [NSString stringWithFormat:@"%@/SaveWebPage.pdf",deskTopPath];

PDFDocument *doc = [[PDFDocument alloc] initWithData:data];
[doc writeToFile:pdfPath];

以上代码的作用是什么?

  1. WebView用于加载使用 img 标记嵌入PDF的HTML。请参阅html来源here

  2. 加载webview后,尝试使用NSView的 dataWithPDFInsideRect 方法从文档视图中获取PDF数据

  3. 内存中的PDF数据写入磁盘

  4. 结果

    • 在小牛之前的版本(即10.8和10.7)上面的代码片段生成了一个高质量且内容可读的PDF文档。当在预览应用程序中打开输出PDF时,可以看到高质量的PDF内容,并且在缩放时可以在不影响图像质量的情况下进行缩放。 See Mountain Lion output PDF here

    • On Mavericks(10.9),上面的代码片段生成一个PDF文档,其内容模糊,图像质量下降See Mavericks output PDF here

    问题

    1. dataWithPDFInsideRect:在以前版本的OSX上工作时是不是像Mavericks一样?

    2. 我是否需要在HTML中嵌入PDF(从Mavericks开始),以便Webkit在屏幕外正确呈现它们?

    3. 是否有另一种方法可以从同一个HTML获得pdf,以便在小牛队中获得更好的质量?

1 个答案:

答案 0 :(得分:-1)

PDF是一种专有的文件格式,Apple故意决定在各种主要的公司政治原因下不能很好地发挥作用。您最终得到的PDF的质量完全取决于您正在使用的库 - 从您的声音来看,您最新的Mavericks正在使用不同于理想的驱动程序库。

如果您使用Webkit渲染HTML /,则Mavericks存在一个已知问题,即Safari默认情况下不会正确处理PDF。要更新此命令,请从服务器终端运行此命令。

defaults write com.apple.Safari WebKitOmitPDFSupport -bool NO

下载最新的Adobe Reader&安装它可能会给你/重新安装/刷新正确的驱动程序,如果这不起作用。