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

tek*_*tom 5 html pdf macos cocoa webview

运行示例项目并观察名为SaveWebPage.pdf的桌面上生成的输出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];
Run Code Online (Sandbox Code Playgroud)

上面的代码做了什么?

  1. WebView用于加载使用img标记嵌入PDF的HTML .在这里查看html源代码

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

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

结果

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

  • 在Mavericks(10.9)上,上面的代码片段生成一个PDF文档,其内容模糊,图像质量下降请参阅Mavericks输出PDF

问题

  1. dataWithPDFInsideRect:不能像以前版本的OSX那样在Mavericks上工作吗?

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

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

小智 -1

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

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

defaults write com.apple.Safari WebKitOmitPDFSupport -bool NO
Run Code Online (Sandbox Code Playgroud)

下载最新的 Adob​​e Reader 副本并安装它可能会为您提供/重新安装/刷新正确的驱动程序(如果这不起作用)。