Размер бумаги для печати и вкладыш с содержимым

Я использую следующий код для печати содержимого HTML, содержащего текст и изображения.

if (![UIPrintInteractionController isPrintingAvailable]) {
    UIAlertView *alertView = [[[UIAlertView alloc] 
        initWithTitle:NSLocalizedString(@"Printer Availability Error Title", @"")
        message:NSLocalizedString(@"Printer Availability Error Message", @"")
        delegate:nil
        cancelButtonTitle:NSLocalizedString(@"OK", @"OK")
        otherButtonTitles:nil] autorelease];
    [alertView show];
    return;
}

UIPrintInteractionController *pic = 
    [UIPrintInteractionController sharedPrintController];

if(!pic) {
    NSLog(@"Couldn't get shared UIPrintInteractionController!");
    return;
}

pic.delegate = self;

UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = @"Sample";
pic.printInfo = printInfo;

NSString *htmlString = [self prepareHTMLText];
UIMarkupTextPrintFormatter *htmlFormatter = 
    [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:htmlString];
htmlFormatter.startPage = 0;
// 1-inch margins on all sides
htmlFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); 
// printed content should be 6-inches wide within those margins
htmlFormatter.maximumContentWidth = 6 * 72.0;   
pic.printFormatter = htmlFormatter;
[htmlFormatter release];

pic.showsPageRange = YES;

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

    if (!completed && error) {
        NSLog(@"Printing could not complete because of error: %@", error);
    }
};

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    [pic presentFromBarButtonItem:self.myPrintBarButton 
        animated:YES 
        completionHandler:completionHandler];

} else {
    [pic presentAnimated:YES completionHandler:completionHandler];
}

Результаты смотрите в прикрепленном файле (уменьшенная версия может быть не очень ясной, но, надеюсь, вы поняли).

Вот мои вопросы:

  1. Как AirPrint определяет размер бумаги для печати? Что делать, если я хочу специально отформатировать и распечатать данные для бумаги формата A4?

  2. Результатом использования приведенного выше кода и печати с использованием различных смоделированных принтеров (симулятор принтера) является то, что во всех случаях я получаю поле в 1 дюйм в верхней части первой страницы, но не на последующих страницах. Почему?

  3. Результатом использования приведенного выше кода и печати с использованием различных смоделированных принтеров (симулятор принтера) является то, что в некоторых случаях стиль шрифта теряется. В результате содержимое смещается вниз. Почему?

Снимок экрана


person Mustafa    schedule 28.04.2011    source источник


Ответы (1)


  1. Чтобы конкретно выбрать размер бумаги A4, я реализовал метод printInteractionController:choosePaper: протокола <UIPrintInteractionControllerDelegate> и вернул размер бумаги A4, если он поддерживается принтером (протестируйте с помощью [UIPrintPaper bestPaperForPageSize:withPapersFromArray:]. Обратите внимание, что книжная/альбомная ориентация задается не здесь, а с помощью свойства UIPrintInfo orientation .

  2. Свойство htmlFormatter.contentInsets задает только вставку для содержимого в целом до того, как средство визуализации страниц разделит его на страницы. Я смог установить поле в 1 см на страницу, добавив пустые верхние и нижние колонтитулы с помощью UIPrintPageRenderer, а затем добавив поле в 1 см слева и справа от средства форматирования печати HTML:

    UIPrintPageRenderer *renderer = [[UIPrintPageRenderer alloc] init];
    renderer.headerHeight = 30.0f;
    renderer.footerHeight = 30.0f;
    pic.printPageRenderer = renderer;
    [renderer release];
    
    UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText: htmlString];
    htmlFormatter.startPage = 0;
    htmlFormatter.contentInsets = UIEdgeInsetsMake(0.0f, 30.0f, 0.0f, 30.0f);
    [renderer addPrintFormatter: htmlFormatter startingAtPageAtIndex: 0];
    [htmlFormatter release];
    
  3. Не могу помочь с этим, извините.

person tobygriffin    schedule 13.05.2011
comment
Как вернуть бумагу формата А4? - person János; 14.10.2016