10

長いHTMLページがあり、それを複数ページのPDFファイルに変換したいと思いました。

私はアップルとここで提供されている指示に従いまし た-与えられた文字列コンテンツに対してマルチページPDFを作成する方法。

ただし、NSStringのフォーマット(データのようなものを使用)は、htmlページを作成するよりも困難です。このhtmlを作成し、UIWebViewに表示しました。

ここで、このHTMLからマルチページPDFファイルにPDFを作成したいと思います。

私が使用しているコードは、単一のPDFを作成できます。

-(void)createPDFfromUIView:(UIWebView *)aView saveToDocumentsWithFileName:(NSString *)aFilename
{{
    //バイト配列などのバイナリデータで更新するための可変データオブジェクトを作成します
    NSMutableData * pdfData=[NSMutableDataデータ];

    //pdfコンバーターを可変データオブジェクトと変換するUIViewにポイントします
    UIGraphicsBeginPDFContextToData(pdfData、aView.bounds、nil);
    UIGraphicsBeginPDFPage();
    CGContextRef pdfContext = UIGraphicsGetCurrentContext();


    //ビューにrectを描画するため、これはUIGraphicsBeginPDFContextToDataによってキャプチャされます

    [aView.layer renderInContext:pdfContext];

    //PDFレンダリングコンテキストを削除します
    UIGraphicsEndPDFContext();

    //iOSデバイスからドキュメントディレクトリを取得します
    NSArray * documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory、NSUserDomainMask、YES);

    NSString * documentDirectory = [documentDirectories objectAtIndex:0];
    NSString * documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];

    //可変データオブジェクトにそのコンテキストをディスク上のファイルに書き込むように指示します
    [pdfData writeToFile:documentDirectoryFilenameatomically:YES];
    NSLog(@ "documentDirectoryFileName:%@"、documentDirectoryFilename);
}

誰か助けてもらえますか?

4

1 に答える 1

16

私は周りで見つけたすべての良いアドバイスに基づいてクラスを作成しました。私は多くのことを掘り下げてきましたが、私のクラスが、HTMLソースから直接複数ページのPDFを作成しようとしている人にとって良いスタートを切ることを願っています。

ここにいくつかの基本的なサンプルコードを含むコード全体があります:https ://github.com/iclems/iOS-htmltopdf

私はあなたとまったく同じ問題を抱えていました。私の要件は次のとおりです。-フルPDF(実際のテキスト、ビットマップなし)-スマートマルチページ(XピクセルごとにフルハイトのWebビューをカットする場合と比較して...)

したがって、私が使用するソリューションは、iOSが印刷用にページを分割するために使用するのと同じツールに頼っているので、非常に優れています。

説明させてください、私はWebビュー印刷フォーマッターに基づいてUIPrintPageRendererをセットアップします(最初のヒント):

UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];

[render addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0];

CGRect printableRect = CGRectMake(self.pageMargins.left,
                              self.pageMargins.top,
                              self.pageSize.width - self.pageMargins.left - self.pageMargins.right,
                              self.pageSize.height - self.pageMargins.top - self.pageMargins.bottom);

CGRect paperRect = CGRectMake(0, 0, self.pageSize.width, self.pageSize.height);

[render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
[render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];

NSData *pdfData = [render printToPDF];

[pdfData writeToFile: self.PDFpath  atomically: YES];

それまでの間、UIPrintPageRendererに以下をサポートするカテゴリを作成しました。

-(NSData*) printToPDF
{
    [self doNotRasterizeSubviews:self.view];

    NSMutableData *pdfData = [NSMutableData data];

    UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );

    [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)];

    CGRect bounds = UIGraphicsGetPDFContextBounds();

    for ( int i = 0 ; i < self.numberOfPages ; i++ )
    {
        UIGraphicsBeginPDFPage();

        [self drawPageAtIndex: i inRect: bounds];
    }

    UIGraphicsEndPDFContext();

    return pdfData;
}
于 2012-11-12T13:32:32.967 に答える