Печать PDF с использованием AirPrint приводит к обрезке содержимого

Здесь я печатаю PDF с размером 'pageSize = CGSizeMake(640, 832);'. этот размер больше, чем размер страницы А4. поэтому я обрежу некоторый текст (означает, что он не напечатает всю страницу).

при печати того же PDF-файла с использованием MAC-адреса будет распечатана вся страница с помощью опции (масштабирование по размеру). так что любой может помочь мне выйти из этой проблемы... есть ли вариант в IOS SDK для масштабирования, чтобы соответствовать.

вот мой код..

-(void)printItem
{

NSArray *aArrPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ;
NSString *aStr = [[aArrPaths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"PropertyReport_%d.pdf",self.propertyId]];

  // NSString *aStr = [[NSBundle mainBundle] pathForResource:@"TRADUZIONE HELP SECTIONS REV2" ofType:@"pdf"];
NSURL *url=[[NSURL alloc] initFileURLWithPath:aStr];
NSData *data=[[NSData alloc] initWithContentsOfURL:url];
printController = [UIPrintInteractionController sharedPrintController];
if(printController && [UIPrintInteractionController canPrintData:data])
{
    printController.delegate = self;
    UIPrintInfo *printInfo = [UIPrintInfo printInfo];
    printInfo.outputType = UIPrintInfoOutputGeneral;
    //printInfo.jobName = [NSString stringWithFormat:@"New Image"];
    printInfo.duplex = UIPrintInfoDuplexLongEdge;

    printController.printInfo = printInfo;
    printController.showsPageRange = YES;

    printController.printingItem = data;




    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error)
    {
        if (!completed && error)
        {
            //NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
        }
    };

  //  aWebViewPDF.hidden=FALSE;
    [printController presentAnimated:YES completionHandler:completionHandler];
}

}

Спасибо!

2 ответа

Как бы странно это ни звучало, попробуйте:

printController.showsPageRange = NO;

Похоже, это включает автоматическое масштабирование, но иногда печатает дополнительную пустую страницу в конце работы. AirPrint в основном колдовство.

У вас есть только один вариант, чтобы scale down к ratio из printed format со всех страниц PDF, а затем распечатайте его. Я сделал, это получил все страницы pdf into images и уменьшил это до требования:

NSString *strFilePath = [[NSBundle mainBundle] pathForResource:@"pdftouch" ofType:@"pdf"];
pic.printingItems = [[self allPagesImageFromPDF:strFilePath] copy];

Добавьте все три метода:

Convert all PDF pages into UIImages

-(NSMutableArray *)allPagesImageFromPDF:(NSString *)strPath
{
  NSMutableArray *arrImages = [NSMutableArray array];
  CGPDFDocumentRef pdf  = CGPDFDocumentCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:strPath]);
  NSInteger numberOfPages = CGPDFDocumentGetNumberOfPages(pdf);
  for (NSInteger pageIndex = 1; pageIndex <= numberOfPages;
     pageIndex++)
  {
    UIImage *img = [self getThumbForPage:pdf pageIndex:pageIndex];
    [arrImages addObject:[self resizedImage:img]];
  }
  return arrImages;
}

Resize images

-(UIImage *)resizedImage:(UIImage *)image
{
  UIGraphicsBeginImageContext(CGSizeMake(612, 792)); //A4 size
  [image drawInRect:CGRectMake(0,0,612, 792)]; //A4 size
  UIImage *resizedImg = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return resizedImg;
}

Get UIImage from CGPDFPageRef

-(UIImage *)getThumbForPage:(CGPDFDocumentRef)pdfRef pageIndex:(int)page_number{

  // Get the page
  CGPDFPageRef myPageRef = CGPDFDocumentGetPage(pdfRef, page_number);
  // Changed this line for the line above which is a generic line

  CGRect pageRect = CGPDFPageGetBoxRect(myPageRef, kCGPDFMediaBox);
  //CGFloat pdfScale = width/pageRect.size.width;
  //pageRect.size = CGSizeMake(pageRect.size.width*pdfScale, pageRect.size.height*pdfScale);
  pageRect.origin = CGPointZero;

  UIGraphicsBeginImageContext(pageRect.size);

  CGContextRef context = UIGraphicsGetCurrentContext();

  // White BG
  CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
  CGContextFillRect(context,pageRect);

  CGContextSaveGState(context);

  // Next 3 lines makes the rotations so that the page look in the right direction

  CGContextTranslateCTM(context, 0.0, pageRect.size.height);
  CGContextScaleCTM(context, 1.0, -1.0);
  CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFMediaBox, pageRect, 0, true));

  CGContextDrawPDFPage(context, myPageRef);
  CGContextRestoreGState(context);

  UIImage *thm = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();
  return thm;  
}

РЕДАКТИРОВАТЬ: См. Печать-uiimage-using-airprint-причины-cut-off-content

Другие вопросы по тегам