2011-08-16 6 views
3

私のアプリには印刷ボタンがあります。ボタンをクリックすると、画面が印刷されます。 私の問題は、画面にスクロールビューがあり、画面サイズ以上の内容がある場合です。それは画面の内容全体を表示するはずです。プリントアウトに2〜3ページかかります。写真やスクリーンショットを撮るのではなく、画面を印刷するためのサンプルコードやプロジェクトはありますか?iPhoneアプリからプリントアウトするには?

+0

は基本的にあなたが変換しますスクロールビューを画像ファイルに貼り付け、それを印刷します。私は同じことをやって、画像を電子メールの添付ファイルとして送るだけです。 –

答えて

2

データ全体をHTML形式に変換し、WebViewを使用してデータを表示する必要があります。 iPhoneアプリからプリントアウトするには、webviewのコンテンツからPdfファイルを作成し、このpdfファイルからプリントアウトする必要があります。ここで私はサンプルコードを提供しています、私のアプリで正しく動作します。

1)QuartzCoreフレームワークを含み、ViewController.hファイルに "QuartzCore/QuartzCore.h"をインポートします。次のコードViewController.hファイルの使用で

2)コード以下のviewDidLoadメソッドの使用に

@interface ViewController : UIViewController<UIScrollViewDelegate, UIPrintInteractionControllerDelegate> 
{ 
     UIWebView *theWebView; 
     int imageName; 
     double webViewHeight; 
} 

-(void) takeSnapshot; 
- (void) drawPdf; 
-(void) printContent:(NSData *) data; 

3):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *[email protected]"<html><body><img src=\"blue.png\" alt=\"Blue Image\" /> <h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p><h1>Hi, himanshu mahajan</h1><p> I am from Vinove Software service</p></body></html>"; 

    UIBarButtonItem *generate=[[UIBarButtonItem alloc] initWithTitle:@"Print" style:UIBarButtonItemStylePlain target:self action:@selector(printBtnPressed)]; 
    [self.navigationItem setRightBarButtonItem:generate]; 

     theWebView=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 416)]; 
     [theWebView loadHTMLString:htmlString baseURL:nil]; 
     theWebView.scrollView.bounces=NO; 
     [self.view addSubview:theWebView]; 

     imageName=0; 
     webViewHeight=0.0; 
} 

4)メソッドの定義

-(void) printBtnPressed 
{ 
    [self takeSnapshot]; 

    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDir=[paths objectAtIndex:0]; 
    NSString *filePath=[documentDir stringByAppendingPathComponent:@"Demo.pdf"]; 

    NSData *data=[[NSData alloc] initWithContentsOfFile:filePath]; 

    [self printContent:data]; 
} 

-(void) takeSnapshot 
{ 

    webViewHeight=[[theWebView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] integerValue]; 

    CGRect screenRect=theWebView.frame; 
    double currentWebViewHeight = webViewHeight; 

    while (currentWebViewHeight > 0) 
    { 
    imageName ++; 

    UIGraphicsBeginImageContext(screenRect.size); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [[UIColor blackColor] set]; 
    CGContextFillRect(ctx, screenRect); 

    [theWebView.layer renderInContext:ctx]; 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *pngPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png",imageName]]; 

    if(currentWebViewHeight < 416) 
    { 
     CGRect lastImageRect = CGRectMake(0, 416 - currentWebViewHeight, theWebView.frame.size.width, currentWebViewHeight); 
      CGImageRef imageRef = CGImageCreateWithImageInRect([newImage CGImage], lastImageRect);  

      newImage = [UIImage imageWithCGImage:imageRef]; 
      CGImageRelease(imageRef); 
     } 
     [UIImagePNGRepresentation(newImage) writeToFile:pngPath atomically:YES]; 

     [theWebView stringByEvaluatingJavaScriptFromString:@"window.scrollBy(0,416);"]; 
     currentWebViewHeight -= 416; 
    } 

    [self drawPdf]; 
    } 


    - (void) drawPdf 
    { 
    CGSize pageSize = CGSizeMake(612, webViewHeight); 
    NSString *fileName = @"Demo.pdf"; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName]; 

    UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil); 

    // Mark the beginning of a new page. 
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); 

    double currentHeight = 0.0; 
    for (int index = 1; index <= imageName ; index++) 
    { 
     NSString *pngPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png", index]]; 
     UIImage *pngImage = [UIImage imageWithContentsOfFile:pngPath]; 

     [pngImage drawInRect:CGRectMake(0, currentHeight, pageSize.width, pngImage.size.height)]; 
     currentHeight += pngImage.size.height; 
    } 
    UIGraphicsEndPDFContext(); 
    } 

    -(void) printContent:(NSData *) data 
    { 
     UIPrintInteractionController *print = [UIPrintInteractionController sharedPrintController]; 

     print.delegate = self; 
     UIPrintInfo *printInfo = [UIPrintInfo printInfo]; 
     printInfo.outputType = UIPrintInfoOutputGeneral; 
     //printInfo.jobName = @"Information"; 
     printInfo.duplex = UIPrintInfoDuplexLongEdge; 
     print.printInfo = printInfo; 
     print.showsPageRange = YES; 
     print.printingItem = data; 
     UIViewPrintFormatter *viewFormatter = [self.view viewPrintFormatter]; 
     viewFormatter.startPage = 0; 
     print.printFormatter = viewFormatter; 

     UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController *printInteractionController, BOOL completed, NSError *error) {}; 

     [print presentAnimated:YES completionHandler:completionHandler]; 
} 
+1

+1、サンプルコード用 – NAZIK

0

take a screenshot programmaticallyとすることができます。その場合、スクリーンショットを印刷するだけです。

+2

申し訳ありませんが、スクリーンショットを撮ることではなく、直接印刷についてです。 – NAZIK

+1

これは私が言ったことです。スクリーンショットを印刷します。 – Mundi

1

あなたは

- (void) didPressPrintExpenseButton { 
    UIPrintInteractionController *printController = [UIPrintInteractionController sharedPrintController];  
    printController.delegate = self; 

    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = 
     ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) { 
      if (!completed && error) NSLog(@"Print error: %@", error); 
     }; 

    UIPrintInfo *printInfo = [UIPrintInfo printInfo];  
    printInfo.outputType = UIPrintInfoOutputGeneral; 
    printInfo.jobName = @"Expense"; 
    printController.printInfo = printInfo; 

    UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc] 
                initWithMarkupText:[self getHtmlInvoiceDescription]]; 
    htmlFormatter.startPage = 0; 
    htmlFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1 inch margins  
    htmlFormatter.maximumContentWidth = 6 * 72.0;  
    printController.printFormatter = htmlFormatter; 
    [htmlFormatter release]; 
    printController.showsPageRange = YES; 
    [printController presentAnimated:YES completionHandler:completionHandler]; 
} 

- (NSString *) getHtmlInvoiceDescription { 
    NSMutableString *htmlString = [[NSMutableString alloc]init]; 
    [htmlString appendString:@"<html> \n"]; 
    [htmlString appendString:@"<body> \n"]; 
    [htmlString appendString:@"<table border='0' cellpadding='5' width='100%' >\n"]; 
    [htmlString appendString:@"<tr>\n"]; 
    [htmlString appendFormat:@"<td style=\"width='50%%'\"> %@ </td>", [self.addressString stringByReplacingOccurrencesOfString:@"\n" withString:@"<br>"]]; 
    //TODO change the image url here 
    UIImage * image = [UIImage imageNamed:@"iTunesArtwork.png"]; 
    NSData *data = UIImagePNGRepresentation(image); 
    NSString * dataString = [data base64EncodedString]; // Your own base 64 converter 
    [htmlString appendFormat:@"<td style=\"width='50%%'\" align=\"right\"> <img src=\"data:image/png;base64,%@\" width='%.0f' height='%.0f' > </td>", dataString, 
    verifyHeader.frame.size.height * image.size.width/image.size.height, verifyHeader.frame.size.height]; 
    [htmlString appendString:@"\n</tr> \n </table>"]; 

    [htmlString appendFormat:@"\n<h2> %@ </h2>", NSLocalizedString(@"Expense", @"")]; 

    [htmlString appendString:@"\n<table border='1' cellpadding='5' width='100%'>"]; 

    [htmlString appendString:@"\n<tr>"]; 
    [htmlString appendFormat:@"<td style=\"width='50%%' \"> %@ </td>", NSLocalizedString(@"Date: ", @"")]; 
    [htmlString appendFormat:@"<td width='50%%'> %@ </td>", [self getFormattedDateString:self.expense.date]]; 
    [htmlString appendString:@"</tr>"]; 

    [htmlString appendString:@"\n<tr>"]; 
    [htmlString appendFormat:@"<td> %@ </td>", NSLocalizedString(@"Reference no: ", @"")]; 
    [htmlString appendFormat:@"<td> %@ </td>", self.expense.referenceNo]; 
    [htmlString appendString:@"</tr>"]; 

    [htmlString appendString:@"\n<tr>"]; 
    [htmlString appendFormat:@"<td> %@ </td>", NSLocalizedString(@"Customer name: ", @"")]; 
    [htmlString appendFormat:@"<td> %@ </td>", self.expense.customerName]; 
    [htmlString appendString:@"</tr>"]; 

    [htmlString appendString:@"\n<tr>"]; 
    [htmlString appendFormat:@"<td> %@ </td>", NSLocalizedString(@"Product description: ", @"")]; 
    [htmlString appendFormat:@"<td> %@ </td>", self.expense.productDescription]; 
    [htmlString appendString:@"</tr>"]; 

    [htmlString appendString:@"\n</table>"]; 
    [htmlString appendString:@"\n</body> \n</html>"]; 

    NSString * tempString = [NSString stringWithString:htmlString]; 
    [htmlString release]; 
    return tempString; 
} 

、HTMLの中にすべてのデータを変換し、それを印刷することができます。また、PDFでのあなたの情報を変換すると、あなたはそれを印刷することができます方法があります。 アップルの文書iPhone print API guidelinesを検索してください。

+0

ありがとう、しかし、サンプルコードやプロジェクトをpdfに変換して、上記のように印刷することができますか? – NAZIK

+0

今私は何も持っていません。編集された答えを見てください。 – karim

+0

@NAZIK、私は同じ状況です。私はスクロールビュー上にある私のコンテンツからプリントを取り出したいと思っています。サンプルコードを教えてください。 –

関連する問題