14

TLDR:テキストが/で揃えられた要素で構成されるコンテンツUIWebViewを含むものを印刷すると、結果のドキュメントには予想外に大きな下マージンを持つページが含まれます。HTMLrightcenter

私はこの問題に遭遇し、同様の問題を抱えている人をグーグルで見つけることができなかったことに非常に驚きました. 私はアップルにレーダーを提出し (#20760071)、またの GitHub リポジトリに問題を作成しました。ResearchKitORKHTMLPDFWriter

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 に答える
-1

div回避策の属性が静的属性を持っている場合、テキストの長さは明らかに常に変化しているため、可変長テキストの配置では機能しないと思いwidthます。

widthこれは、仕切りを紙のサイズに置き換える (余白がテキストで埋められるようにするため) 、文字列を置き換える作業です。この幅を取得するには、次のように呼び出します。

pc.printPaper.printRect.size.width;

ただし、それを置き換えるには、ジョブが開始される直前にHTML コードを修正するデリゲートが必要です。

デリゲートNSObjectを Xcode の File Creator のサブクラスとして type の新しいクラス オブジェクトにし、ビューでプリンターを起動してコンテンツをレンダリングする関数を次のようにします。

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を印刷領域の幅に設定します。他の唯一のオプションは、指定された幅(編集で提案したように)を使用するか、ユーザーが印刷できる特定のタイプの用紙を1つ使用することです。

UIWebViewこれが発生する理由は、コーディングによるものではなく、 の HTML を印刷する際のバグによるものです。うまくいけば、Apple は今後のアップデートでこれを修正します。

于 2015-05-10T05:39:16.607 に答える