14

TLDR:如果您打印的内容UIWebView包含HTML由文本对齐的元素组成的内容right/ center,则生成的文档的页面将具有意外大的底部边距。

我遇到了这个问题,当我无法用谷歌搜索任何有类似问题的人时,我感到非常惊讶。我已经向苹果 (#20760071) 提交了一份雷达文件,并且还在GitHub 存储库上创建了一个问题ResearchKit,因为这会影响他们的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);

}];

您还可以克隆演示此问题的项目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>

但是,以上都不适用于对齐可变长度文本,这是我关心的主要用例。

4

3 回答 3

4

瓦诺,

经过一些测试后我想出的解决方案是添加以下带有文本对齐的 css 规则。

display: -webkit-box;
display: -webkit-flex;
display: flex;
justify-content: flex-end;
-webkit-justify-content: flex-end;
text-align:right;
于 2015-10-13T14:22:58.100 回答
0

我对 text-align:right 的解决方案

<header>
    <style type="text/css">
        .default-text-align-right {
            text-align: right;
        }
        .alternative-text-align-right {
            position: absolute;
            right: 10px;
        }
    </style> 
</header>
<body>
    <div>
        <div class="default-text-align-right">
            Default Text Align Left
        </div>
        <div>
            <div class="alternative-text-align-right">Alternative Text Align Right</div>
            <div>&nbsp;</div>
        </div>
        <div class="default-text-align-right">
            Default Text Align Left
        </div>  
    </div>      
</body>
于 2016-07-06T13:10:48.087 回答
-1

我想这不适用于对齐可变长度文本,因为文本的长度显然是不断变化的,而您的解决方法的div属性具有静态width属性。

这是一个字符串替换的工作,用width纸张的大小替换分隔符(以允许边距填充文本)。要获得此宽度,请调用:

pc.printPaper.printRect.size.width;

但是,为了替换它,您需要有一个代表在工作开始之前修复 HTML 代码。

让您的委托成为NSObjectXcode 文件创建器中作为子类的类型的新类对象,然后让您的函数触发打印机并在您的视图中呈现与此类似的内容:

NSMutableString* html = [NSMutableString string];
[html appendString:@"<html><body>"];

for (int i=0; i<200; i++) {
    [html appendString:@"temporary content... "];
}

[html appendString:@"</body></html>"];

UIWebView* web = [UIWebView new];
[web loadHTMLString:html baseURL:nil];


UIPrintInteractionController* pc = [UIPrintInteractionController sharedPrintController];
pc.printFormatter = web.viewPrintFormatter;

UIPrintInfo* printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGrayscale;

printerDelegate* pd = [printerDelegate new];

pc.printInfo = printInfo;
pc.showsPaperSelectionForLoadedPapers = YES;
pc.delegate = pd;

[pc presentAnimated:YES completionHandler:^(UIPrintInteractionController *printInteractionController, BOOL completed, NSError *error) {
    NSLog(@"%d -- %@",completed, error);
}];

(注意:我在 HTML 文件中制作了临时内容是有原因的。我还没有完成!)

我之前要求您制作的委托课程中,将其制作.h文件

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>

    @interface printerDelegate : NSObject <UIPrintInteractionControllerDelegate>

    @end

然后,在它的.m文件中,我有这个......

#import "printerDelegate.h"
#import <UIKit/UIKit.h>

@implementation printerDelegate

-(void)printInteractionControllerWillDismissPrinterOptions:(UIPrintInteractionController *)printInteractionController {

    @try {
        NSMutableString* html = [NSMutableString string];
    [html appendString:@"<html><body>"];
    for (int i=0; i<200; i++) {
        [html appendString:[NSString stringWithFormat:@"<div><div style=""width:%fpx; margin-left:auto; margin-right:0px;"">content</div></div>", printInteractionController.printPaper.printRect.size.width]];
    }
    [html appendString:@"</body></html>"];
    UIWebView* web = [UIWebView new];
    [web loadHTMLString:html baseURL:nil];
    printInteractionController.printFormatter = web.viewPrintFormatter;
    }
    @catch (NSException *exception) {
        NSLog(@"%@", exception.debugDescription);
    }
    @finally {

    }
}

@end

它返回一个错误的访问异常,但你明白了要点:在用户选择他们的纸张类型后,将分隔线设置width为打印区域的宽度。唯一的其他选择是具有指定的宽度(就像您在编辑中建议的那样)或使用用户可以打印的一种特定类型的纸张。

发生这种情况的原因是打印 a 的 HTML 时出现错误UIWebView,而不是因为编码。希望 Apple 在以后的更新中解决这个问题。

于 2015-05-10T05:39:16.607 回答