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

Здесь я печатаю pdf с размером «pageSize = CGSizeMake (640, 832);». этот размер больше, чем страница формата A4 в аспекте. поэтому я отрезаю некоторый текст (это означает, что он не будет печатать всю страницу).

при печати того же 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];
}

}

Спасибо!


person Jatin Patel - JP    schedule 01.11.2012    source источник


Ответы (2)


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

printController.showsPageRange = NO;

Кажется, это включает автоматическое масштабирование, но иногда в конце задания печатается дополнительная пустая страница. AirPrint — это, по сути, колдовство.

person Owen    schedule 24.04.2013
comment
Посмеялся в голос над твоим колдовским комментарием. - person jasonjwwilliams; 31.12.2014
comment
Невероятный. Настройка printController.showsPageRange = YES; решила мою проблему. Спасибо! - person Andreas Kraft; 14.06.2015

У вас есть только один вариант: 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;  
}

EDIT: см. printing-uiimage-using- airprint-вызывает отключение-контента

person Paresh Navadiya    schedule 01.11.2012
comment
Спасибо за ваш ответ. но проблема в том, что размер страницы должен отличаться в зависимости от формата страницы (например, A4, A5 и т. д.). поэтому мы не можем изменить размер изображения для одного типа страницы. Пожалуйста, предложите мне вариант автоматического масштабирования в соответствии с форматом страницы печати. - person Jatin Patel - JP; 02.11.2012