2

私のiOSアプリでは、スクロールビューでいくつかのデータをリストしています。ボタンをクリックすると、ページ内のデータが pdf ファイル形式で生成されます。以下はコードのビットです。

- (void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename{
    // Creates a mutable data object for updating with binary data, like a byte array
    NSMutableData *pdfData = [NSMutableData data];

    // Points the pdf converter to the mutable data object and to the UIView to be converted
    UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil);
    UIGraphicsBeginPDFPage();
    CGContextRef pdfContext = UIGraphicsGetCurrentContext();

    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData
    [aView.layer renderInContext:pdfContext];

    // remove PDF rendering context
    UIGraphicsEndPDFContext();

    // Retrieves the document directories from the iOS device
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

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

    // instructs the mutable data object to write its context to a file on disk
    [pdfData writeToFile:documentDirectoryFilename atomically:YES];
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
}

上記のコードから、pdf ファイルを生成できますが、次の問題に直面しています。50 個を超えるデータがある場合、アプリでは最初の 10 個のデータしか表示できず、スクロールする必要がある他のデータを表示できます。この場合、pdf ファイルが生成されると、最初の 10 個のデータのみが取得され、他のデータは取得されません。他のデータも取得する方法

4

4 に答える 4

2

renderInContext:現在表示されているもののみをレンダリングします-UIScrollViewはスマートであり、現在必要な階層内のビューのみを持ちます。手動でスクロールして再描画するには、forループが必要です。これを正しく行うのは難しいかもしれません。スクロール後に[aViewlayoutSubviews]を手動で呼び出して、scrollViewにサブビューを即座に再配置させることもできます。

于 2013-01-12T10:35:27.420 に答える
0

steipeteが言ったように、ループを使用してrenderIncontextを実行できます-ループの数を計算する必要があります numOfLoop = webview.ScrollView.ContentSize.Height/weview.frame.size.height

  • ループを使用して renderInContext for(int i = 0; i < numOfLopp; i ++)

    1.UIGraphicsBeginPDFPage()

    1. 現在のコンテキストを取得する
    2. renderIncontext

この方法は私のアプリで正しく実行されますが、numOfLoop が大きくなると大きな問題が発生します - renderInContext が遅くなります - メモリが増加します -> アプリを閉じますループ?

別の方法として、 https://github.com/iclems/iOS-htmltopdf/blob/master/NDHTMLtoPDF.hを使用 して PDF を生成できます。

于 2014-07-25T07:18:38.123 に答える
0

@steipete、@allこんにちは、複数ページのPDFを生成する以下のコードを試しましたが、表示されている表示領域がすべてのページで繰り返されます。結果を改善するために、さらにアイデアを追加してください。

-(void)createPDFfromUIView:(UIWebView*)aView saveToDocumentsWithFileName:(NSString*)aFilename

{

NSString *oldFilePath= [[NSBundle mainBundle] pathForResource:@"ABC" ofType:@"pdf"];

NSMutableData *pdfData = [NSMutableData data];

UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); 

CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)oldFilePath, kCFURLPOSIXPathStyle, 0); 

CGPDFDocumentRef templateDocument = CGPDFDocumentCreateWithURL(url); 

CFRelease(url); size_t count = CGPDFDocumentGetNumberOfPages(templateDocument); 

for (size_t pageNumber = 1; pageNumber <= count; pageNumber++) 

{ 

UIGraphicsBeginPDFPage(); 

CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 

[aView.layer renderInContext:pdfContext]; 

}

 CGPDFDocumentRelease(templateDocument); 

// remove PDF rendering context UIGraphicsEndPDFContext(); 

// Retrieves the document directories from the iOS device 
NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString* documentDirectory = [documentDirectories objectAtIndex:0];

NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];

 [pdfData writeToFile:documentDirectoryFilename atomically:YES];

NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);

}
于 2014-09-19T04:23:12.690 に答える
0

ScrollViewToPDF の例を確認する

同じものを使用しますscrollview's layer renderInContextが、ここでは、1 ページの PDF または複数ページの PDF などの要件に応じて PDF が作成されます。

注:scrollViewのすべての表示部分と非表示部分をキャプチャします

于 2014-10-27T15:11:07.037 に答える