Сохранить параметры настройки принтера - PullRequest
1 голос
/ 21 октября 2009

Я пишу программу на Delphi 2006 и храню данные в файлах XML и базе данных Firebird. Я создаю отчеты, используя FastReports, Excel или QuickPDF. Я разрешаю пользователям собирать вместе несколько отчетов и перенаправлять их к месту назначения по своему выбору, будь то файл PDF, принтер, экран или электронная почта.

Я хочу, чтобы мои пользователи могли настраивать выбор принтеров для отчетов, которые они отправляют на принтеры. Для этого я буду использовать диалоговое окно принтера, чтобы выбрать принтер и установить свойства этого принтера. Я хочу иметь возможность записывать эти свойства и сохранять их, чтобы при запуске пакета отчетов они все переходили на нужный принтер с использованием выбранных конфигураций.

Я знаю, что разные принтеры имеют разные возможности конфигурации. Например, тот, который я использую, позволит мне выбрать стиль печати буклета, чтобы вы могли изготовить буклет 5 1/2 X 8 1/2 из отчета. Возможно, что пользователь может выбрать такую ​​опцию, когда он настраивает отчет в своем пакете, и ожидать, что этот отчет будет напечатан таким образом. Вероятно, есть много возможностей, о которых я не знаю, но хотел бы разрешить, если это возможно. Я просто не знаю, как захватить эту конфигурацию из диалогового окна принтера, сохранить ее в базе данных и затем использовать эту информацию для настройки принтера, когда пришло время распечатать отчет.

Как я могу перевести информацию, хранящуюся в диалоговом окне принтера, в нечто, что я могу сохранить (даже в большом двоичном объекте) в базе данных, а затем использовать эту информацию для настройки принтера?

Спасибо за вашу помощь.

Ответы [ 5 ]

2 голосов
/ 22 октября 2009

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

Проверьте следующие функции Windows API. Если вы хотите C-код для этого, спросите в комментарии. На самом деле, я скопирую фрагмент кода, который я использую, извините, он не переведен на Delphi! Это из реально работающего кода, хотя, тяжело боролся. Надеюсь, это даст вам некоторые подсказки.

bGood = OpenPrinter(pcDeviceName, &hPrinter, NULL);
int sBuffSize = DocumentProperties(hDlg, hPrinter, pcDeviceName, NULL, NULL, 0);
PDEVMODE pxDevMode = (PDEVMODE)malloc(sBuffSize);
gl_memset(pxDevMode, '\0', sBuffSize);
pxDevMode->dmSize = sBuffSize;
DocumentProperties(hDlg, hPrinter, pcDeviceName, pxDevMode, pxDevMode, DM_PROMPT | DM_COPY);
DocumentProperties(hDlg, hPrinter, pcDeviceName, pxDevMode, NULL, DM_COPY);
DocumentProperties(hDlg, hPrinter, pcDeviceName, pxDevMode, pxDevMode, DM_PROMPT | DM_COPY);
DocumentProperties(hDlg, hPrinter, pcDeviceName, pxDevMode, pxDevMode, DM_UPDATE | DM_MODIFY);
ClosePrinter(hPrinter);
2 голосов
/ 21 октября 2009

AFAIK, это невозможно. Диалоговое окно настройки принтера является стандартным, но довольно часто его заменяют (или модифицируют), чтобы включить дополнительную специфическую информацию о настройке принтера (например, упомянутую вами информацию о буклете). Поскольку никто, кроме издателя драйвера принтера, не может знать, что там, нет способа надежно получить информацию в общем виде.

Функция API GetPrinterDataEx (), о которой упоминал Jeroen, также не будет работать, поскольку она требует, чтобы вы заранее знали имя раздела реестра, который использовался для хранения информации с помощью процедуры SetPrinterDataEx (), и это может или возможно, не использовался драйвером принтера. Если бы он использовался, вам пришлось бы вручную просматривать реестр, чтобы увидеть, где издатель драйверов решил сохранить информацию; Я подозреваю, что это также зависит от производителей принтеров.

FOLLOWUP: Я только что проверил быструю проверку, и я почти уверен, что вышеприведенное верно. Если я использую диалоговое окно «Настройка принтера» из приложения Delphi для доступа к настройкам принтера (например, к настройке дуплекса перед запуском отчета), в реестр не вносятся никакие изменения. Однако, если я захожу в апплет «Панель управления принтером» и меняю там настройки, реестр обновляется. Это, кажется, подтверждает, что выбор настроек для каждого отчета, сделанный пользователем на лету, будет трудно сохранить, так как они, вероятно, не доступны нигде, кроме драйвера принтера. Настройки постоянного типа (сделанные в апплете панели управления) устанавливаются пользователем, и пользователь выбирает постоянные для всей системы , и поэтому они сохраняются в реестре. Это, по-видимому, препятствует сохранению этих типов параметров для каждого отчета, по крайней мере из диалогового окна настроек принтера.

0 голосов
/ 30 октября 2009

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

0 голосов
/ 21 октября 2009

Документация по Windows API Структура PRINTDLGEX может содержать некоторые подсказки. В частности, я думаю, что дескриптор hDevMode дает вам биты, специфичные для драйвера принтера, даже если они недокументированы. Я не знаю, как бы вы использовали эту информацию от Delphi.

0 голосов
/ 21 октября 2009

Я знаю, что это возможно с GetPrinterDataEx , но я не смог найти информацию о людях, использующих это.

- Йерун

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...