0

我在使用 AirPrint 打印照片时遇到一个问题。我打印了 4 * 6 英寸的图像,但打印的图像尺寸太大!我该如何解决这个问题。
我可以以编程方式指定纸张尺寸和照片吗?

这是屏幕截图网址。

https://www.dropbox.com/s/1f6wa0waao56zqk/IMG_0532.jpg

` 这是我的代码

-(void)printPhotoWithImage:(UIImage *)image
{ 
    NSData *myData = UIImageJPEGRepresentation(image, 1.f);
    UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];

    if (pic && [UIPrintInteractionController canPrintData:myData]) {

        pic.delegate = self;
        UIPrintInfo *pinfo = [UIPrintInfo printInfo];
        pinfo.outputType = UIPrintInfoOutputPhoto;
        pinfo.jobName = @"My Photo";
        pinfo.duplex = UIPrintInfoDuplexLongEdge;

        pic.printInfo = pinfo;
        pic.showsPageRange = YES;
        pic.printingItem = myData;

        pic.printFormatter = format;
        [format release];

        void(^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *print, BOOL completed, NSError *error) {

            [self resignFirstResponder];

            if (!completed && error) {
                NSLog(@"--- print error! ---");
            }
        };

        [pic presentFromRect:CGRectMake((self.view.bounds.size.width - 64) + 27, (self.view.bounds.size.height - 16) + 55, 0, 0) inView:self.view animated:YES completionHandler:completionHandler];
    }
}

- (UIPrintPaper *)printInteractionController:(UIPrintInteractionController *)printInteractionController choosePaper:(NSArray *)paperList
{
    CGSize pageSize = CGSizeMake(6 * 72, 4 * 72);
    return [UIPrintPaper bestPaperForPageSize:pageSize withPapersFromArray:paperList];
}

这就是我的代码。我应该使用UIPrintPageRenderer属性来提供绘图区域吗?

`

4

1 回答 1

0

首先你应该设置

 /*
 PrintPhotoPageRenderer *pageRenderer = [[PrintPhotoPageRenderer alloc]init];
    pageRenderer.imageToPrint =image;
    pic.printPageRenderer = pageRenderer;
*/
 - (void)printImage {
// Obtain the shared UIPrintInteractionController
UIPrintInteractionController *controller = [UIPrintInteractionController     sharedPrintController];
controller.delegate = self;
if(!controller){
    NSLog(@"Couldn't get shared UIPrintInteractionController!");
    return;
}

// We need a completion handler block for printing.
UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController     *printController, BOOL completed, NSError *error) {
    if(completed && error)
        NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain,     error.code);
};

// Obtain a printInfo so that we can set our printing defaults.
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
UIImage *image = ((UIImageView *)self.view).image;
[controller setDelegate:self];


printInfo.outputType = UIPrintInfoOutputPhoto;

if(!controller.printingItem && image.size.width > image.size.height)
    printInfo.orientation = UIPrintInfoOrientationLandscape;

// Use this printInfo for this print job.
controller.printInfo = printInfo;

//  Since the code below relies on printingItem being zero if it hasn't
//  already been set, this code sets it to nil.
controller.printingItem = nil;


#if DIRECT_SUBMISSION
// Use the URL of the image asset.
if(self.imageURL && [UIPrintInteractionController canPrintURL:self.imageURL])
    controller.printingItem = self.imageURL;
#endif

// If we aren't doing direct submission of the image or for some reason we don't
// have an ALAsset or URL for our image, we'll draw it instead.
if(!controller.printingItem){
    // Create an instance of our PrintPhotoPageRenderer class for use as the
    // printPageRenderer for the print job.
    PrintPhotoPageRenderer *pageRenderer = [[PrintPhotoPageRenderer alloc]init];
    // The PrintPhotoPageRenderer subclass needs the image to draw. If we were taking
    // this path we use the original image and not the fullScreenImage we obtained from
    // the ALAssetRepresentation.
    //pageRenderer.imageToPrint = ((UIImageView *)self.view).image;
    pageRenderer.imageToPrint =image;
    controller.printPageRenderer = pageRenderer;
}

// The method we use presenting the printing UI depends on the type of
// UI idiom that is currently executing. Once we invoke one of these methods
// to present the printing UI, our application's direct involvement in printing
// is complete. Our delegate methods (if any) and page renderer methods (if any)
// are invoked by UIKit.
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    //[controller presentFromBarButtonItem:self.printButton animated:YES     completionHandler:completionHandler];  // iPad
     [controller presentFromRect:CGRectMake(0, 0, 50, 50) inView:_btnPrint animated:YES     completionHandler:completionHandler];
}else
    [controller presentAnimated:YES completionHandler:completionHandler];  // iPhone

}

然后你应该设置 PrintPhotoPageRenderer

UIPrintPageRenderer.h

    #import <UIKit/UIKit.h>


@interface PrintPhotoPageRenderer : UIPrintPageRenderer {   UIImage
*imageToPrint; }

@property (readwrite, retain) UIImage *imageToPrint;

@end

//

PrintPhotoPageRenderer.m

 #import "PrintPhotoPageRenderer.h"

@implementation PrintPhotoPageRenderer

@synthesize imageToPrint;

// This code always draws one image at print time.
-(NSInteger)numberOfPages {   return 1; }

/*  When using this UIPrintPageRenderer subclass to draw a photo at
print
    time, the app explicitly draws all the content and need only override
    the drawPageAtIndex:inRect: to accomplish that.

    The following scaling algorithm is implemented here:
    1) On borderless paper, users expect to see their content scaled so that there is             no whitespace at the edge of the paper. So this
code scales the content to  fill the paper at the expense of
clipping any content that lies off the paper.
    2) On paper which is not borderless, this code scales the content so that it fills    the paper. This reduces the size of the
photo but does not clip any content.
*/
- (void)drawPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)printableRect {

      if(self.imageToPrint){

      CGSize finialSize =  CGSizeMake(560, 431);//you should set width and height for you self

      int x  =  20;

      int y = (printableRect.size.height - finialSize.height);

      CGRect finalRect = CGRectMake(x, y, finialSize.width, finialSize.height);

    [self.imageToPrint drawInRect:finalRect];

         }else {
    NSLog(@"%s No image to draw!", __func__);   } }

@end
于 2013-07-16T04:51:14.473 回答