2

Я печатаю PDF с iPhone на принтер, совместимый с Airprint, используя пример документа Apple для печати. Но я не получаю полный отпечаток страницы с iPhone, см. Изображение того, что я получаю, мне нужен pdf-файл для печати на полной бумажной длине, ширине.UIPrintInteractionController не печатает на полную страницу в iPhone

enter image description here

код я использую для функции печати дается ниже, его один и тот же код, как и в Apple App печати образца,

UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; 
    if(!controller){ 
     NSLog(@"Couldn't get shared UIPrintInteractionController!"); 
     return; 
    } 

    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); 
     } 
    }; 

    controller.delegate = self; 

    // Obtain a printInfo so that we can set our printing defaults. 
    UIPrintInfo *printInfo = [UIPrintInfo printInfo]; 
    // This application produces General content that contains color. 
    printInfo.outputType = UIPrintInfoOutputGeneral; 
    // We'll use the URL as the job name. 
    printInfo.jobName = [_filePath lastPathComponent]; 
    // Set duplex so that it is available if the printer supports it. We are 
    // performing portrait printing so we want to duplex along the long edge. 
    printInfo.duplex = UIPrintInfoDuplexLongEdge; 
    // Use this printInfo for this print job. 
    controller.printInfo = printInfo; 
    controller.printingItem = myData; 
    // Be sure the page range controls are present for documents of > 1 page. 
    controller.showsPageRange = YES; 

    // This code uses a custom UIPrintPageRenderer so that it can draw a header and footer. 
    APLPrintPageRenderer *myRenderer = [[APLPrintPageRenderer alloc] init]; 
// UIPrintPageRenderer *myRenderer = [[UIPrintPageRenderer alloc] init]; 
    // The APLPrintPageRenderer class provides a jobtitle that it will label each page with. 
// myRenderer.jobTitle = printInfo.jobName; 
    // To draw the content of each page, a UIViewPrintFormatter is used. 
    UIViewPrintFormatter *viewFormatter = [docWebView viewPrintFormatter]; 

#if SIMPLE_LAYOUT 

    UIFont *font = [UIFont fontWithName:@"Helvetica" size:HEADER_FOOTER_TEXT_HEIGHT]; 
    CGSize titleSize = [myRenderer.jobTitle sizeWithFont:font]; 
    myRenderer.headerHeight = myRenderer.footerHeight = titleSize.height + HEADER_FOOTER_MARGIN_PADDING; 
#endif 
    [myRenderer addPrintFormatter:viewFormatter startingAtPageAtIndex:0]; 
    // Set our custom renderer as the printPageRenderer for the print job. 
    controller.printPageRenderer = myRenderer; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     [controller presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler]; // iPad 
    } 
    else 
    { 
     docWebView.hidden = YES; 
     [controller presentAnimated:YES completionHandler:completionHandler]; // iPhone 
    } 
+0

Не могли бы вы разместить ссылку на файл PDF? –

+0

Pdf-файл сохраняется локально в моем телефоне в каталоге документов. –

+0

Не могли бы вы его взять и загрузить? Может быть проблема в способе создания документа? –

ответ

4

сгенерировать PDF-файлы для печати полной страницы, привлекая к PDFcontext. Я поставил его с вызовом, как это:

NSMutableData *pdfData = [NSMutableData data]; 
UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 

обратите внимание, что, потому что я прошел в CGRectZero для размера контекста приходит в его размер по умолчанию

/* 
    default pdf.. 
    8.5 X 11 inch 
    612 x 792 
    */ 

** это только 72dpi, но его значение по умолчанию. У меня есть трюк, где я просигналить перед рисунок, чтобы улучшить разрешение:

for (int page = 0 : page < numberPages : page ++){ 
UIGraphicsBeginPDFPage(); 
CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 
CGFloat scaleFactor = 3.0; 
CGContextSaveGState(pdfContext); 
CGContextScaleCTM(pdfContext, 1.0/scaleFactor, 1.0/scaleFactor); 


///draw stuff 
/// context size is now (612.0 * 3.0 , 792.0 * 3.0) , i.e. resolution 72.0 * 3.0 dpi.. 
// 


CGContextRestoreGState(pdfContext); 

}//page drawing loop 


NSString *filePath = [[NSFileManager defaultManager] //etcetc make a path]; 
BOOL success = [pdfData writeToFile:filePath atomically:YES]; 

нормально, так что теперь у меня есть мой PDF я печатать непосредственно на UIPrintInteractionController

NSData *pdfData = [NSData dataWithContentsOfFile:[[self pdfView]filePath]]; 
    if ([UIPrintInteractionController canPrintData:pdfData]) { 

    UIPrintInteractionController *pr = [UIPrintInteractionController sharedPrintController]; 

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

    pr.printingItem = pdfData; 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     [pr presentFromRect:tool.frame inView:self.view animated:YES completionHandler:completionHandler]; 
    } else { 
     [pr presentAnimated:YES completionHandler:completionHandler]; 
    } 
    } 

Заметьте, что я не возиться с UIPrintPageRenderer. У меня нет опыта работы с этим классом, мне никогда не нужно было его изучать. Но мне кажется, что если у него есть место для заголовка и нижнего колонтитула, тогда они обязательно будут масштабировать ваш документ, чтобы освободить место. Попробуйте включить свой верхний и нижний колонтитулы в сам документ. Успехов

1
bestPaperForPageSize:withPapersFromArray: 

Возвращает объект печати бумаги, UIKit определяет быть лучшим для задания печати на основе заданного размера страницы и размер бумаги, гарантируемого сочетаниях области, специфичный для данного принтера.

+ (UIPrintPaper *)bestPaperForPageSize:(CGSize)pageSize withPapersFromArray:(NSArray *)paperList 

Делегат от UIPrintInteractionController может вызвать этот метод в его реализации printInteractionController:choosePaper: метода, объявленного в протоколе UIPrintInteractionControllerDelegate.

0

вместо UIViewPrintFormatter * viewFormatter = [docWebView viewPrintFormatter]; use viewPrintFormatter * viewFormatter = [[UIPrintFormatter alloc] init];

не нужен конкретный форматтер для pdf и изображений

Смежные вопросы