Сохранение параметров принтера для автоматической печати
ID Принтера является уникальным внутренним представлением, указывающим определенную очередь печати. Для пользователя возможно создать многократные очереди печати, использующие того же пользователя видимое имя, однако у каждой очереди будет уникальный Принтер ID. Для надежной ссылки на определенную очередь печати, и поэтому определенный принтер необходимо всегда использовать Принтер ID. PMPrinter тип данных аккуратно оборачивает оба понятия в единственном пакете. Этот Technote описывает, как можно сохранить и восстановить a PMPrinter для сохранения принтера, который пользователь выбрал.
Обычно Вы не должны знать, что Принтер ID распечатывает. Однако, в некоторых ограниченных ситуациях это целесообразно сохранять выбранный принтер и автоматически использовать его при необходимости (например, для печати получений для приложения торговой точки). ID Принтера обеспечивает необходимую персистентную ссылку, так как Вы не можете сохранить a PMPrinter на ваше усмотрение. Так с помощью Принтера 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 | Новый документ, описывающий, как можно сохранить пользовательский выбранный принтер, Настройки Печати и Формат страниц к диску. |