【发布时间】:2015-07-09 23:11:15
【问题描述】:
TLDR:如果您打印包含 HTML 内容的 UIWebView 内容包含的元素与文本对齐 right / center,则生成的文档的页面将具有意外大的底部边距。
我遇到了这个问题,当我无法用谷歌搜索任何有类似问题的人时,我感到非常惊讶。我已经向苹果 (#20760071) 提交了一个雷达文件,并且还在 ResearchKit 的 GitHub 存储库上创建了一个 issue,因为这会影响他们的 ORKHTMLPDFWriter。
AFAIK 这也会影响所有使用UIWebView 将HTML 转换为PDF 的库,我已经测试过:
我想知道是否有人可以提出一些解决方法。
如何重现:
NSMutableString* html = [NSMutableString string];
[html appendString:@"<html><body>"];
for (int i=0; i<200; i++) {
[html appendString:@"<div align=\"right\">line</div>"];
}
[html appendString:@"</body></html>"];
UIPrintInteractionController* pc = [UIPrintInteractionController sharedPrintController];
UIPrintInfo* printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGrayscale;
pc.printInfo = printInfo;
pc.showsPaperSelectionForLoadedPapers = YES;
UIWebView* web = [UIWebView new];
[web loadHTMLString:html baseURL:nil];
pc.printFormatter = web.viewPrintFormatter;
[pc presentAnimated:YES completionHandler:^(UIPrintInteractionController *printInteractionController, BOOL completed, NSError *error) {
NSLog(@"%d -- %@",completed, error);
}];
您还可以克隆project 在ResearchKit 中演示此问题。
编辑 - 一些有用的解决方法:
知道内容的特定宽度(例如图像),可以在不指定文本对齐的情况下对齐它,例如:
使用自动边距:
<div>
<div style="width:200px; margin-left:auto; margin-right:0px;">
content
</div>
</div>
浮动列:
<div>
<div style="width:200px; float:right;">
content
</div>
</div>
但是,以上方法都不适用于对齐可变长度文本,这是我关心的主要用例。
【问题讨论】:
-
我已于 2014 年 4 月 24 日提交了 rdar://16713582 关于同一问题。正如您所提到的,在文档的 CSS 中使用 text-align 时似乎会出现问题。我能想出的唯一解决方案是通过使用其他方式来避免文本对齐。例如,您可以使用
margin-left:auto; margin-right:0;在另一个 div 中右对齐。 -
@Dalzhim 您提到的解决方法仅在您指定对齐的
div的宽度时才有效,这通常不适用于文本对齐。还是我错过了什么? -
我不记得每种解决方法的具体细节,但是有多种方法可以重现 text-align,但由于它们的缺点,它们并不适合所有情况。例如,浮动:对;技术会导致不同的布局,这并不总是合适的。正如我所说,我没有完整的解决方案,只有这种有限的解决方法来避免打印问题。当然,您也可以将打印变通方案仅用于媒体打印,以尽可能限制副作用。
标签: html ios uiwebview pdf-generation uiprintformatter