4

这对大家来说有点问题。我在设备上本地存储了一个 html 文档,其中包含本地存储的图像(不在捆绑包中,在磁盘上)。我在 UIWebView 中显示 html 页面,用户可以选择将页面转换为 PDF 并通过电子邮件发送页面。pdf 是使用 UIMarkupTextFormatter 和自定义 UIPrintPageRenderer 生成的,而不是通过将网页制作成图像并将图像呈现为 PDF 来生成的。这是因为 PDF 需要可搜索。

无论如何,这工作得很好。然而,客户现在要求在 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 并设置了自定义缓存。我发现标记格式化程序正在调用

 -(NSCachedURLResponse *) cachedResponseForRequest:(NSURLRequest *)request

网页中不在当前页面上的每个图像的方法,因此它正在从缓存中请求不在当前网页上的资产!

我尝试使用以下代码返回从磁盘加载的图像。

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 的各个部分,但这似乎是一个不优雅的问题解决方案。

4

1 回答 1

0

建议:在创建 pdf 之前,请先jquery.get(...)调用其他页面。以正确的顺序将它们组装成一个 html 对象,然后通过 ajax 或通过 javascript 将 html 发送到您的 html-pdf 转换器form.submit()

于 2013-05-08T03:07:47.407 回答