Inhalte für Entwickler
© 2000-2012, Two Pilots

Auf Englisch: Virtueller Drucker (Virtual Printer)
Andere Projekte: PDF-Bibliothek (PDF Library)
SAVE
EMF Drucker Treiber Pipeline Download Preise FAQ Wie macht man... Tutorials Sprachen Impressum

Erstellung eines virtuellen Druckers mit: C++ | C# | Delphi | VB.NET | VB 

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 "HKEY_LOCAL_MACHINE\SOFTWARE\Your Virtual Printer Example". Unter diesem Registryschlüssel gibt es mehrere Werte, die in der "Readme.html" - Datei beschrieben werden; sie wird mit der Demodrucker-Distribution geliefert. Der Wert, der von dem virtuellen Drucker als Pfad zur Client-Anwendung genutzt wird, ist "Client-Anwendung". Bringen Sie einfach den vollständigen Pfad zur Ihren Anwendung in diesen Wert, und sie wird von virtuellem Drucker gestartet. Der vollständige Pfad zur INI-Datei wird zur Befehlszeile umgeleitet.

 

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
}

Erstellung eines virtuellen Druckers mit: C++ | C# | Delphi | VB.NET | VB 

EMF Drucker Treiber Pipeline Download Preise FAQ Wie macht man... Tutorials Sprachen Impressum

 

Kontakt | Support | Blog | Forum

© 2000-2012, Two Pilots