这里有一个问题要问大家。我在设备上本地存储了一个 html 文档,其中包含本地存储的图像(不在 bundle 中,在磁盘上)。我在 UIWebView 中显示 html 页面,用户可以选择将页面转换为 PDF 并通过电子邮件发送页面。 pdf 是使用 UIMarkupTextFormatter 和自定义 UIPrintPageRenderer 生成的,而不是通过将网页制作成图像并将图像呈现为 PDF。这是因为 PDF 需要可搜索。
无论如何,这工作得很好。但是,客户现在要求我们将大页面分成分页 block ,而不是在 uiwebview 中只有一个页面。导出功能仍然需要整个网页不被分解成要导出的页面。
现在出现问题,导出的 PDF 仅包含当前显示页面的图像。因此,例如,如果我将整个 html 页面分成 4 个较小的页面,并且用户在按导出时正在查看第 3 页,那么 pdf 将正确包含所有网页信息,但仅包含第 3 页上的图像。 pdf 不包含空白图像或格式错误的图像,它们只是不存在。如果我然后更改到其他页面之一并再次导出,我将获得该阶段的图像。 HTML 是在开始时生成的,所以唯一的区别是是否显示图像。
现在,我的猜测是 UIMarkupTextPrintFormatter 只显示缓存中的图像。这是有道理的,因为用户通常希望打印他们看到的页面,因此渲染器不必在缓存之外寻找资源。 html 文档中的图像的路径指向文件在磁盘上的位置,例如 'file:///var/mobile/Applications/C409BDBD-1254-4ADA-BAD8-F9BE5C171C93/Documents/Export/SoMeJobN/Images/915F0470-785D-40BF-A3E7-9945646843A7.jpg' 并且我已验证该位置存在所有图像。
我还覆盖了 NSURLCache 并设置了自定义缓存。我发现 markupformatter 正在调用
-(NSCachedURLResponse *) cachedResponseForRequest:(NSURLRequest *)request
网页中不在当前页面上的每个图像的方法,因此它从缓存中请求不在当前网页上的 Assets !
我尝试使用以下代码返回从磁盘加载的图像。
NSString *pathString = [[request URL] absoluteString];
// Load the data
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:pathString]];
// Create the cacheable response
UIImage *img = [UIImage imageWithData:data];
NSLog(@"%@",img);
NSURLResponse *response =
[[[NSURLResponse alloc]
initWithURL:[request URL]
MIMEType:@"image/jpeg"
expectedContentLength:-1
textEncodingName:nil]
autorelease];
NSCachedURLResponse *cachedResponse =
[[[NSCachedURLResponse alloc] initWithResponse:response data:data] autorelease];
return cachedResponse;
并且我已验证 UIImage 已正确加载,因此数据是正确的。但它没有显示在 PDF 中。那么,有没有人知道为什么会发生这种情况,以前遇到过这个问题,或者能想到其他任何让我尝试的事情。我可以重构代码以依次加载所有页面并导出每个页面的 PDF 部分,但这似乎是解决问题的不雅方法。
最佳答案
建议:在创建 pdf 之前,对其他页面执行 jquery.get(...)
调用。按正确的顺序将它们组合成单个 html 对象,然后通过 ajax 或通过 javascript form.submit()
关于html - 使用自定义渲染器的本地 HTML 到 PDF 仅添加最近查看的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13850440/