Praktische Anleitungen für das SDK des virtuellen Druckers
How to ...
◊ Wie man Druckerinformationen in Ihre Client-Anwendung bekommt
◊ Wie man das aktuelle Papierformular verändert
◊ Wie man ein neues Papierformular der benutzerdefinierten Seite hinzufügt
◊ Wie man die Papierausrichtung und -qualität (Auflösung) verändert
Wie man Druckerinformationen in Ihre Client-Anwendung bekommt
Nachdem Sie Ihr Dokument zum Drucker gesendet haben, bereitet er mehrere EMF-Dateien und eine spezielle INI-Datei vor:
Virtueller Drucker -> EMF-Dateien + INI-Datei -> Client-Anwendung
Alle Informationen über den Druckerauftrag werden innerhalb der INI-Datei gespeichert.
Hier sind Beispielsinhalte der INI-Datei:
[Device] DeviceName=Your Virtual Printer Example [Document] Name=Lorem Ipsum - All the facts - Lipsum generator JobID=2 MachineName=\\T23 UserName=Stas SessionID=0 HorizontalResolution=300 VerticalResolution=300 Orientation=1 PaperSize=9 PaperSizeName=A4 PaperWidth=2100 PaperLength=2970 Pages=2 Copies=1 Collate=0 Bin=15 BinName=Automatically Select [EMF] Count=2 File0=C:\DOCUME~1\Stas\LOCALS~1\Temp\00020001.emf File1=C:\DOCUME~1\Stas\LOCALS~1\Temp\00020002.emf
(Wir werden, z.B., diese INI-Datei für unser Beispiel nutzen).
Wie greift Ihre Anwendung auf die INI-Datei zu? Mittels der Nutzung der Befehlszeile. (Es gibt auch andere Methoden, jedoch nutzen wir die Befehlszeile, da diese Methode am einfachsten und deswegen zu bevorzugen ist).
Sie haben, z.B., diese Hauptfunktion n Ihrer C# - Anwendung:
static void Main(string[] args)
Der Pfad zur INI-Datei wird in args[0] sein.
Wie erkennt der virtuelle Drucker, wo Ihre Client-Anwendung platziert ist? Aus der Registry. Wenn wir, z.B., einen Drucker mit dem Namen "Your Virtual Printer Example", nutzen, ist der Registry-Schlüssel
Wie man das aktuelle Papierformular verändert
int _iPaperCount = 0; WORD* _pPapers = NULL; char* _pPaperNames = NULL; POINT* _pPaperSizes = NULL; // Function that enumerates all available paper forms:
void FillPapers() { HANDLE hPrinter = NULL; if (_pPapers) { delete [] _pPapers; _pPapers = NULL; } if (_pPaperNames) { delete [] _pPaperNames; _pPaperNames = NULL; } if (_pPaperSizes) { delete [] _pPaperSizes; _pPaperSizes = NULL; } if (OpenPrinter(PRINTER_NAME, &hPrinter, NULL)) { DWORD dwNeeded = 0; // get printer forms _iPaperCount = DeviceCapabilities(PRINTER_NAME, NULL, DC_PAPERS, NULL, NULL); if (_iPaperCount) { _pPapers = new WORD[_iPaperCount]; ZeroMemory(_pPapers, sizeof(WORD)*_iPaperCount); DeviceCapabilities(PRINTER_NAME, NULL, DC_PAPERS, (LPSTR) _pPapers, NULL); _pPaperNames = new char[_iPaperCount*64]; ZeroMemory(_pPaperNames, sizeof(char)*64*_iPaperCount); DeviceCapabilities(PRINTER_NAME, NULL, DC_PAPERNAMES, _pPaperNames, NULL); _pPaperSizes = new POINT[_iPaperCount]; ZeroMemory(_pPaperSizes, sizeof(POINT)*_iPaperCount); DeviceCapabilities(PRINTER_NAME, NULL, DC_PAPERSIZE, (LPSTR) _pPaperSizes, NULL); } ClosePrinter(hPrinter); } else { // report error } } // Function that sets current paper form: BOOL SetPrinterPaper(short dmPaperSize, const char* pszFormName) { BOOL bResult = FALSE; HANDLE hPrinter = NULL; if (OpenPrinter(PRINTER_NAME, &hPrinter, NULL)) { DWORD dwNeeded = 0; GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded); if (dwNeeded > 0) { BYTE* pPrinterInfo = new BYTE[dwNeeded]; if (GetPrinter(hPrinter, 2, pPrinterInfo, dwNeeded, &dwNeeded)) { DEVMODE* pDevMode = ((PRINTER_INFO_2*) pPrinterInfo)->pDevMode; pDevMode->dmPaperSize = dmPaperSize; lstrcpy((char*) &pDevMode->dmFormName, pszFormName); SetPrinter(hPrinter, 2, pPrinterInfo, 0); bResult = TRUE; } else { // report error } delete [] pPrinterInfo; } ClosePrinter(hPrinter); } else { // report error } return bResult; }
Wie man ein neues Papierformular der benutzerdefinierten Seite hinzufügt
if (OpenPrinter(PRINTER_NAME, &hPrinter, NULL))
{
FORM_INFO_1 FormInfo = {0};
FormInfo.pName = (char*) &_szNewFormName;
FormInfo.Size.cx = FormInfo.ImageableArea.right = _iNewFormWidth*1000;
FormInfo.Size.cy = FormInfo.ImageableArea.bottom = _iNewFormLength*1000;
if (AddForm(hPrinter, 1, (BYTE*) &FormInfo))
{
FillPapers();
// set new paper to the printer
for (int i=0; i<_iPaperCount; i++)
{
if (lstrcmp(_szNewFormName, &_pPaperNames[i*64]) == 0)
{
SetPrinterPaper(_pPapers[i], _szNewFormName);
FillPapers();
break;
}
}
}
else
{
// report error
}
ClosePrinter(hPrinter);
}
Wie man die Papierausrichtung und -qualität (Auflösung) verändert
HANDLE hPrinter = NULL;
PRINTER_DEFAULTS prnDef = { NULL, NULL, PRINTER_ALL_ACCESS };
if (OpenPrinter(PRINTER_NAME, &hPrinter, &prnDef))
{
DWORD dwNeeded = 0;
GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded);
if (dwNeeded > 0)
{
BYTE* pPrinterInfo = new BYTE[dwNeeded];
// get current printer settings
if (GetPrinter(hPrinter, 2, pPrinterInfo, dwNeeded, &dwNeeded))
{
DEVMODE* pDevMode = ((PRINTER_INFO_2*) pPrinterInfo)->pDevMode;
pDevMode->dmFields = pDevMode->dmFields|DM_ORIENTATION|DM_PRINTQUALITY|DM_YRESOLUTION;
// change parameters
pDevMode->dmOrientation = 1; // Orientation: 1 - portrait; 2 - landscape.
pDevMode->dmPrintQuality = 300; // Horizontal resolution value
pDevMode->dmYResoultion = 300; // Vertical resoultion value
// save changed settings
if (!SetPrinter(hPrinter, 2, pPrinterInfo, 0))
{
// report error
}
}
else
{
// report error
}
delete [] pPrinterInfo;
}
ClosePrinter(hPrinter);
}
else
{
// report error
}