Техническое примечание TN2155

Сохранение параметров принтера для автоматической печати

ID Принтера является уникальным внутренним представлением, указывающим определенную очередь печати. Для пользователя возможно создать многократные очереди печати, использующие того же пользователя видимое имя, однако у каждой очереди будет уникальный Принтер ID. Для надежной ссылки на определенную очередь печати, и поэтому определенный принтер необходимо всегда использовать Принтер ID. PMPrinter тип данных аккуратно оборачивает оба понятия в единственном пакете. Этот Technote описывает, как можно сохранить и восстановить a PMPrinter для сохранения принтера, который пользователь выбрал.

Обычно Вы не должны знать, что Принтер ID распечатывает. Однако, в некоторых ограниченных ситуациях это целесообразно сохранять выбранный принтер и автоматически использовать его при необходимости (например, для печати получений для приложения торговой точки). ID Принтера обеспечивает необходимую персистентную ссылку, так как Вы не можете сохранить a PMPrinter на ваше усмотрение. Так с помощью Принтера ID можно сохранить ссылку на очередь печати, которая допустима для жизни той очереди печати.

Сбор информации печати
Проверка принтера ID
История версии документа

Сбор информации печати

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

Один метод должен получить список доступных принтеров и попросить, чтобы пользователь выбрал тот. Это приемлемо, если опции печати значат мало для потребителя Вашего приложения; просто печать является целью. Выбор From Available Printers демонстрирует этот метод.

Второй метод должен попросить, чтобы пользователь выбрал принтер и настройки печати с помощью стандартных диалоговых окон Print & Page Setup. Это позволяет пользователю устанавливать другие опции, такие как размер страницы и расположение, а также выбирать сам принтер. В этом случае можно также хотеть сохранить все настройки печати в дополнение к выбору принтера. Настройки Obtaining Print через Диалоговые окна Установки Печати и Страницы демонстрируют этот метод.

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

Выбор из доступных принтеров

Можно получить список доступных принтеров путем вызова PMServerCreatePrinterList. Этот вызов возвратит a CFArray из PMPrinters, содержащего все принтеры, которые это смогло обнаружить. Перечисление 1 демонстрирует, как повернуться CFArray из PMPrinters в a CFArray из принтера называет для отображения пользователю.

Перечисление 1  Получая список доступных принтеров

OSStatus CreatePMPrintersAndPrinterNames( CFArrayRef *outPrinters, CFArrayRef *outPrinterNames )
{
    *outPrinters = NULL;
    *outPrinterNames = NULL;
    // Obtain the list of PMPrinters
    OSStatus err = PMServerCreatePrinterList( kPMServerLocal, outPrinters );
    if( err == noErr )
    {
        CFIndex i, count = CFArrayGetCount( printers );
        // Create another array to hold the printer names. You may use this to create a menu or list for
        // the user to select a printer.
        CFMutableArrayRef printerNames = CFArrayCreateMutable( NULL, count, kCFTypeArrayCallBacks );
        if( printerNames )
        {
            for(i = 0; i < count; ++i)
            {
                PMPrinter printer = (PMPrinter)CFArrayGetValueAtIndex( printers, i );
                CFStringRef name = PMPrinterGetName( printer );
                CFArrayAppendValue( printerNames, name );
            }
        }
        *outPrinterNames = printerNames;
    }
    return err;
}

Настройки Obtaining Print через Диалоговые окна Установки Печати и Страницы

Если Вы позволяете пользователю выбирать принтер и настройки печати с помощью стандартного Диалогового окна Печати, больше гибкости доступно, однако. Путем выполнения, таким образом, Вы позволяете пользователю настраивать все настройки печати для задания печати и сохранять эти настройки как шаблон для будущих заданий печати. После того, как пользователь распечатывает впервые, можно просто сохранить настройки печати и использовать их снова позже. Перечисление 2 показывает Вам, как вывести на экран Диалоговое окно Печати и получить принтер и настройки печати для многократного использования их снова позже.

Перечисление 2  , Сохраняющее Информацию о принтере от Диалогового окна Печати

OSStatus CreatePageFormat( PMPageFormat * outFormat )
{
    PMPrintSession printSession;
    OSStatus err;
    Boolean accepted;

    // In order to create the Page Format we're going to
    // ask the user to setup that page format using Page Setup.
    *outFormat = NULL;

    err = PMCreateSession( &printSession );
    if( !err )
    {
        // We could create a session, so create and default the page format.
        err = PMCreatePageFormat( outFormat );
        if( !err )
            err = PMSessionDefaultPageFormat( printSession, *outFormat );

        // Present the Page Setup dialog, if the user cancels or there
        // is an error, we'll dispose of the created page format,
        // return a NULL format, and whatever error may have been returned
        // from PMSessionPageSetupDialog.
        err = PMSessionPageSetupDialog( printSession, *outFormat, &accepted );
        if( err || !accepted )
        {
            PMRelease( *outFormat );
            *outFormat = NULL;
        } 

        PMRelease( printSession );
    }
    return err;
}

OSStatus CreatePrintSettings( PMPageFormat ioFormat, PMPrinter * outPrinter, PMPrintSettings * outSettings)
{
    PMPrintSession printSession;
    OSStatus err;
    Boolean accepted = false;

    *outPrinter = NULL;
    *outSettings = NULL;

    // In order to create the Print Settings & select a printer we'll
    // ask the user to create their settings using the Print dialog.
    err = PMCreateSession( &printSession );
    if( !err )
    {
        // Validate the Page Format against the current Printer, which may update
        // that format.
        err = PMSessionValidatePageFormat( printSession, ioFormat, kPMDontWantBoolean );

        // Create and default the print settings
        if( !err )
            err = PMCreatePrintSettings( outSettings );
        if( !err )
            err = PMSessionDefaultPrintSettings( printSession, *outSettings );

        // Present the Print dialog.
        if( !err )
            err = PMSessionPrintDialog( printSession, *outSettings, ioFormat, &accepted );
        if( !err && accepted )
        {
            // If the user accepted, then we'll retain the printer selected
            // so that it survives the scope of this session.
            // If there is an error getting the printer, then it will
            // remain NULL
            err = PMSessionGetCurrentPrinter( printSession, outPrinter );
            if( !err )
                PMRetain( *outPrinter );
        }
        else
        {
            // We got an error, or the user canceled the operation
            // so we'll release our settings and NULL them out.
            // The PMPrinter hasn't been set yet, so it will remain NULL.
            PMRelease( *outSettings );
            *outSettings = NULL;
        }

        PMRelease( printSession );
    }
    return err;
}

Сохранение и загрузка настроек печати

Самый простой способ сохранить ссылку на принтер, который Ваш пользователь выбрал ранее, через CFPreferences. Принтер ID возвращается через a CFString и все сглаженные данные принтера возвращаются через CFDataRef, оба из которых легко сохранены через CFPreferences. Перечисление 3 показывает, как сохранить эти настройки на ваше усмотрение, и Перечисление 4 показывает Вам, как восстановить принтер и настройки печати от Ваших предпочтений.

Перечисление 3  , Сохраняющее Настройки Печати на ваше усмотрение

OSStatus SavePrintSettings( PMPrintSession inSession, PMPrintSettings inSettings, PMPageFormat inFormat )
{
    CFStringRef printerID;
    PMPrinter printer;
    CFDataRef flatSettings, flatFormat;
    OSStatus err, tempErr;

    // We need the current printer from the print session before we can do anything else
    // If we get an error retrieving it, then we will simply return that error and do nothing else
    err = PMSessionGetCurrentPrinter( inSession, &printer );
    if( err == noErr )
    {
        // If PMSessionGetCurrentPrinter returns successfully, then the printer is valid
        // for as long as the session is valid, therefore we will assume that the printer name is valid.
        printerID = PMPrinterGetID( printer );
        CFPreferencesSetAppValue( kPrinterID, printerID, kCFPreferencesCurrentApplication );
        CFRelease( printerID );

        tempErr = PMFlattenPrintSettingsToCFData( inSettings, &flatSettings );
        if( tempErr == noErr )
        {
            // If we can flatten the print settings, then save them to preferences
            CFPreferencesSetAppValue( kPrintSettings, flatSettings, kCFPreferencesCurrentApplication );
            CFRelease( flatSettings );
        }
        else
        {
            // If we cannot flatten print settings, then remove them from preferences
            CFPreferencesSetAppValue( kPrintSettings, NULL, kCFPreferencesCurrentApplication );
        }

        tempErr = PMFlattenPageFormatToCFData( inFormat, &flatFormat );
        if( tempErr == noErr )
        {
            // If we can flatten the the page format, then save them to preferences
            // if we could not, then we can reuse them with another printer
            CFPreferencesSetAppValue( kPageFormat, flatFormat, kCFPreferencesCurrentApplication );
            CFRelease( flatFormat );
        }
    }

    return err;
}

Перечисление 4  , Восстанавливающее Настройки Печати с Ваших Предпочтений

void CopyPrintSettings( CFStringRef * outPrinterID, PMPrintSettings * outSettings, PMPageFormat * outFormat )
{
    CFDataRef flatSettings, flatFormat;

    *outPrinterID = CFPreferencesCopyAppValue( kPrinterID, kCFPreferencesCurrentApplication );
    *outSettings = NULL;
    *outFormat = NULL;

    // load the printer ID via CFPreferences
    if( *outPrinterID != NULL )
    {
        flatSettings = CFPreferencesCopyAppValue( kPrintSettings, kCFPreferencesCurrentApplication );
        flatFormat = CFPreferencesCopyAppValue( kPageFormat, kCFPreferencesCurrentApplication );

        // Ignoring errors unflattening, as if there is an error the corresponding setting
        // will be NULL, indicating that it wasn't available.
        if( flatSettings != NULL )
        {
            PMUnflattenPrintSettings( flatSettings, outSettings );
            CFRelease( flatSettings );
        }

        if( flatFormat != NULL )
        {
            PMUnflattenPageFormatWithCFData( flatFormat, outFormat );
            CFRelease( flatFormat );
        }
    }
}

Проверка принтера ID

Так как пользователь в состоянии реконфигурировать их установку печати в любое время, даже в то время как Ваше приложение работает для обеспечения бесшовного опыта, необходимо будет проверить принтер, с которым Вы планируете распечатать до каждой работы печати. Чтобы сделать это, необходимо попытаться воссоздать PMPrinter от Принтера ID. Это не необходимо при нормальных обстоятельствах, поскольку стандартное диалоговое окно Print и настройки по умолчанию автоматически выберут корректный принтер.

Перечисление 5  , Проверяющее Принтер ID, допустимо

// This function demonstrates one way to validate a printer.
// A more sensible method of doing this would be to attempt
// to create the printer, use it on success, and ask the
// user to update their settings on failure.
Boolean IsValidPrinter( CFStringRef inPrinterID )
{
    PMPrinter printer = PMPrinterCreateFromPrinterID( inPrinterID );
    Boolean valid = printer != NULL;
    // It is safe to pass NULL to PMRelease, as we'd just get an error
    // since we just want to make sure that a non-NULL printer gets
    // released, we can safely ignore that error.
    PMRelease( printer );
    return valid;
}


История версии документа


ДатаПримечания
29.03.2007

Новый документ, описывающий, как можно сохранить пользовательский выбранный принтер, Настройки Печати и Формат страниц к диску.