4

ここで皆さんにちょっとした問題があります。デバイスにローカルに保存されたhtmlドキュメントと、ローカルに保存された画像(バンドルではなく、ディスク上)があります。ユーザーがページをPDFに変換してページを電子メールで送信するオプションを使用して、UIWebViewにhtmlページを表示します。PDF は、Web ページを画像にして PDF にレンダリングすることによってではなく、UIMarkupTextFormatter とカスタム UIPrintPageRenderer を使用して生成されます。これは、PDF を検索可能にする必要があるためです。

とにかく、これはうまくいきました。ただし、クライアントは現在、uiwebview の 1 ページだけではなく、大きなページをページ分割された部分に分割するように要求しています。ただし、エクスポート機能では、エクスポートするページに分割されていない Web ページ全体が必要です。

エクスポートされた PDF には、現在表示されているページの画像しかないという問題が発生します。たとえば、html ページ全体を 4 つの小さなページに分割し、ユーザーがエクスポートを押したときにページ 3 を表示している場合、pdf にはすべての Web ページ情報が正しく含まれますが、ページ 3 にあった画像のみが含まれます。 pdf には空白の画像や不正な画像は含まれていません。単に存在しないだけです。その後、他のページのいずれかに変更して再度エクスポートすると、代わりにそのステージの画像が取得されます。HTML は最初に生成されるため、画像が表示されるかどうかだけが異なります。

今、私の推測では、UIMarkupTextPrintFormatter はキャッシュ内の画像のみを表示しています。これは、ユーザーが一般的に表示するページを印刷することを望んでいるため、レンダラーがキャッシュを超えてリソースを探す必要がないため、理にかなっています。HTML ドキュメント内の画像には、ディスク上のファイルの場所を指すパスがあります。 915F0470-785D-40BF-A3E7-9945646843A7.jpg」で、すべての画像がその場所に存在することを確認しました

また、NSURLCache を上書きし、カスタム キャッシュを設定しました。マークアップフォーマッターが呼び出していることがわかりました

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

現在のページにない Web ページの各画像のメソッドなので、現在の Web ページにないキャッシュからアセットを要求しています!

次のコードを使用して、ディスクからロードされたイメージを返そうとしました。

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