Filtri XPS standard
Importante
La piattaforma di stampa moderna è il mezzo preferito di Windows per comunicare con le stampanti. Ti consigliamo di usare il driver di classe IPP di Microsoft, insieme a Print Support Apps (PSA), per personalizzare l'esperienza di stampa in Windows 10 e 11 per lo sviluppo di dispositivi per stampanti.
Per altre informazioni, vedere Piattaforma di stampa moderna e guida alla progettazione dell'app di supporto per la stampa.
Windows fornisce due filtri XPS (standard) per supportare la conversione predefinita da XPS a PCL6 e PostScript livello 3.
I filtri forniti da Windows sono disponibili sia per i driver di classe di stampa che per i driver di stampa v4 specifici del modello. Questi filtri XPS possono essere combinati con i filtri di funzionalità IHV e i filtri di post-elaborazione IHV, in base alle esigenze per garantire la compatibilità con le implementazioni del firmware esistenti.
I filtri XPS forniti da Windows non sono ridistribuibili e non sono disponibili per i driver di stampa v3.
File manifesto
Per usare i filtri XPS forniti da Windows, il file manifesto del driver v4 deve usare la direttiva RequiredFiles nella sezione DriverConfig per specificare i filtri. Questi sono i nomi dei filtri:
MSxpsPCL6.dll. Fornisce la conversione da XPS a PCL6. MSxpsPS.dll. Fornisce la conversione da XPS al livello PostScript 3. Non sono necessari aggiornamenti INF per usare uno di questi filtri e la ridistribuzione non è supportata. È consigliabile interrompere l'uso di questi filtri XPS.
Configurazione della pipeline del filtro di stampa
Per configurare la pipeline del filtro di stampa per l'uso di questi filtri, è necessario creare file di configurazione, come illustrato negli esempi seguenti.
File di configurazione di esempio che specifica la conversione in PCL6.
<?xml version="1.0" encoding="utf-8"?>
<Filters>
<Filter dll="MSxpsPCL6.dll" clsid="{3821E518-33AF-4d17-92B3-28EB410D46B6}" name="Microsoft XPS to PCL6">
<Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
<Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
</Filter>
</Filters>
File di configurazione di esempio che specifica la conversione in PostScript.
<?xml version="1.0" encoding="utf-8"?>
<Filters>
<Filter dll="MSxpsPS.dll" clsid="{8636D90A-5E03-4d62-9269-E06493C57473}" name="Microsoft XPS to PS">
<Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
<Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
</Filter>
</Filters>
Funzionalità supportate
I filtri XPS standard supportano molte funzionalità comuni. Tutte le definizioni di funzionalità usano il file GPD o PPD per il driver. Il filtro MSxpsPCL6.dll richiede l'uso di un file GPD per la configurazione e il filtro MSxpsPS.dll richiede l'uso di un file PPD per la configurazione. Se non diversamente specificato, se viene specificato un comando PDL personalizzato per una funzionalità, verrà usato.
Se esistono stringhe di inserimento in una sezione specifica (specificata con il comando *Order ), nel caso dei file GPD, il filtro eseguirà una serie di presupposti sul contenuto di tali stringhe ed eviterà l'invio di comandi predefiniti. Ciò è dovuto al fatto che l'invio di comandi predefiniti in questo caso potrebbe causare conflitti di comando. Pertanto, l'autore di un file GPD deve seguire queste linee guida:
JOB_SETUP. #
Intestazione di flusso binario PCL6 (ad esempio: ")<SP>HP-PCL XL;1;<CR><LF>") deve esistere.
Deve esistere un operatore BeginSession, inclusi tutti gli attributi obbligatori.
Deve esistere un operatore OpenDataSource, inclusi tutti gli attributi obbligatori.
PAGE_SETUP. #
- Deve esistere un operatore BeginPage, inclusi tutti gli attributi obbligatori.
PAGE_FINISH. #
- Deve esistere un operatore EndPage.
JOB_FINISH. #
Deve esistere un operatore CloseDataSource.
Deve esistere un operatore EndSession.
Deve esistere un operatore EndPJLCommands.
I filtri XPS Standard producono dati PDL appropriati per impostare l'origine di una pagina, in base ai comandi *PrintableArea, *PrintableOrigin o *ImageableArea. Per evitare un offset aggiuntivo dall'origine prevista, i file GPD non devono specificare alcun comando =SetPageOrigin nella definizione della stringa *Cmd per il formato carta.
Per altre informazioni sulle funzionalità di PrintTicket supportate dai filtri XPS standard, vedere Funzionalità di PrintTicket supportate.
Recupero di PrintTicket nei filtri di post-elaborazione
Nel modello di driver v4 rilasciato con Windows 8, quando è stato aggiunto un filtro di post-elaborazione dopo uno dei filtri MSxps, a volte è stato necessario aggiungere anche un filtro di pre-elaborazione. Per acquisire il ticket di stampa a livello di processo, è necessario aggiungere il filtro di pre-elaborazione. Tuttavia, questo approccio ha essenzialmente aggiunto un filtro basato su modello a oggetti, prima di uno dei filtri MSxps basati su flusso, con conseguente deserializzazione e quindi serializzazione dei dati di stampa per estrarre semplicemente printTicket.
In Windows 8.1, l'utente predefinito PrintTicket viene unito con PrintTicket a livello di processo nei filtri MSxps e l'oggetto PrintTicket unito viene quindi aggiunto al contenitore delle proprietà della pipeline di filtro di stampa. L'oggetto PrintTicket unito viene aggiunto al contenitore delle proprietà Print Filter Pipeline nello stesso modo dell'oggetto PrintTicket dell'utente. La proprietà è denominata come segue:
#define XPS_FP_JOB_LEVEL_PRINTTICKET "JobPrintTicket"
Durante InitializeFilter, i filtri MTI aggiungeranno un'implementazione di IPrintReadStreamFactory nel contenitore delle proprietà. Questo metodo dell'interfaccia, GetStream, bloccherà fino a quando non sarà disponibile il flusso PrintTicket. Ciò consente di sincronizzare l'accesso alla proprietà .
Importante : se GetStream viene chiamato da InitializeFilter, causerà un deadlock.
Altre funzionalità
Nel caso delle funzionalità PrintTicket non supportate dai filtri XPS standard, i filtri verificheranno tutti i membri PrintTicket per verificare se vi fanno riferimento nel GPD/PPD e quindi specificare i comandi da restituire. In tal caso, verranno generati i comandi specificati.
Le funzionalità gpd vengono mappate nell'ordine seguente:
Viene specificato un valore PrintSchemaKeywordMap corrispondente al nome della funzionalità PrintTicket.
Viene specificato l'attributo PrintSchemaPrivateNamespaceURI e il nome della funzionalità GPD corrisponde al nome della funzionalità PrintTicket. I nomi delle funzionalità corrispondenti non sono semplici e seguono una serie di regole:
Se la sezione *Order della prima opzione è PAGE_SETUP o PAGE_FINISH e la funzionalità Criteri di gruppo non inizia con "Page", "Page" viene anteporta al nome della funzionalità GPD prima di tentare la corrispondenza.
Se la sezione *Order della prima opzione è DOC_SETUP o DOC_FINISH e la funzionalità Criteri di gruppo non inizia con "Document", "Document" viene anteporta al nome della funzionalità GPD prima di tentare la corrispondenza.
Se la sezione *Order della prima opzione è JOB_SETUP o JOB_FINISH e la funzionalità Criteri di gruppo non inizia con "Processo", "Processo" viene anteporta al nome della funzionalità GPD prima di tentare la corrispondenza.
Qualsiasi carattere non [A-Z], [a-z], [0-9] o '_' viene sostituito con un carattere '_' prima di tentare la corrispondenza. Tuttavia, se *NoPunctuationCharSubstitute? l'attributo è impostato su TRUE, quindi il filtro non sostituisce '.' o '-' con un carattere '_'.
Le funzionalità PPD vengono mappate nell'ordine seguente:
Viene specificato un valore PrintSchemaKeywordMap corrispondente al nome della funzionalità PrintTicket.
Viene specificato l'attributo PrintSchemaPrivateNamespaceURI e il nome della funzionalità PPD corrisponde al nome della funzionalità PrintTicket. I nomi delle funzionalità corrispondenti non sono semplici e seguono una serie di regole:
Se la sezione OrderDependency è ExitServer, Prolog o JCLSetup e il nome della funzionalità PPD non inizia con "Processo", il nome della funzionalità "Processo" viene anteporto al nome della funzionalità PPD prima di tentare la corrispondenza.
Se la sezione OrderDependency è DocumentSetup e il nome della funzionalità PPD non inizia con "Document", "Document" viene anteporto al nome della funzionalità PPD prima di tentare la corrispondenza.
Se la sezione OrderDependency è AnySetup, il filtro esegue due controlli di corrispondenza:
Se il nome della funzionalità PPD non inizia con "Document", "Document" viene anteporto al nome della funzionalità PPD prima di tentare la corrispondenza.
Se non viene trovata alcuna corrispondenza o se il nome della funzionalità PPD non inizia con "Processo", "Processo" viene anteporto al nome della funzionalità PPD prima di tentare la corrispondenza.
Se la sezione OrderDependency è PageSetup e il nome della funzionalità PPD non inizia con "Page", "Page" viene anteporto al nome della funzionalità PPD prima di tentare la corrispondenza.
Qualsiasi carattere non [A-Z], [a-z], [0-9] o '_' viene sostituito con un carattere '_' prima di tentare la corrispondenza. Tuttavia, se *MSNoPunctuationCharSubstitute? La stringa è impostata su TRUE, il filtro non sostituisce '.' o '-' con un carattere '_'.
Le opzioni GPD e PPD vengono mappate nell'ordine seguente:
Viene specificato un valore PrintSchemaKeywordMap corrispondente al nome dell'opzione PrintTicket.
Viene specificato l'attributo PrintSchemaPrivateNamespaceURI e il nome dell'opzione GPD/PPD corrisponde al nome dell'opzione PrintTicket. I nomi delle opzioni corrispondenti non sono semplici e seguono una serie di regole:
Se il nome dell'opzione GPD/PPD inizia con [0-9] o '_', un carattere '_' viene anteporto al nome dell'opzione GPD/PPD prima di tentare la corrispondenza. Tuttavia, si applicano le regole aggiuntive seguenti:
Se si tratta di un'opzione GPD e di *NoPunctuationCharSubstitute? l'attributo è impostato su TRUE, quindi il filtro non antepone '_' con un carattere '_'.
Se si tratta di un'opzione PPD e di *MSNoPunctuationCharSubstitute? la stringa è impostata su TRUE, quindi il filtro non antepone '_' con un carattere '_'.
Qualsiasi carattere non [A-Z], [a-z], [0-9] o '_' viene sostituito con un carattere '_' prima di tentare la corrispondenza. Tuttavia, si applicano le regole aggiuntive seguenti:
Se si tratta di un'opzione GPD e di *NoPunctuationCharSubstitute? l'attributo è impostato su TRUE, quindi il filtro non sostituisce '.' o '-' con un carattere '_'.
Se si tratta di un'opzione PPD e di *MSNoPunctuationCharSubstitute? la stringa è impostata su TRUE, quindi il filtro non sostituisce '.' o '-' con un carattere '_'.
Mapping da maschera a barra
I filtri XPS to PCL6 e XPS to PS supportano la tabella di mapping da maschera a barra. Se più vassoi supportano le dimensioni dei supporti selezionate (ad esempio, lettera), i filtri interrompono la lega come indicato di seguito:
Se la barra predefinita (come specificato nel file GPD o PPD) è configurata per l'uso delle dimensioni dei supporti specificate, viene usata la barra predefinita.
In caso contrario, il filtro sceglie la prima barra (dall'alto verso il basso come sono state specificate nel file GPD/PPD) configurata con le dimensioni del supporto specificate.
Eliminazione di pagine backside aggiuntive
Per impostazione predefinita, i filtri XPS to PCL6 e XPS to PS gestiscono la stampa duplex di documenti che contengono dimensioni multimediali miste, tipi di supporti, input o contenitori di output, inserendo una pagina vuota. Quando i filtri inseriscono questa pagina vuota, forza il dispositivo a stampare la pagina successiva sulla parte anteriore di un nuovo supporto. Per i dispositivi che non richiedono l'output di una pagina backside, questo comportamento può essere eliminato aggiungendo le parole chiave seguenti al file GPD o PPD del driver.
Tipo di file | Parola chiave di eliminazione della pagina backside |
---|---|
GPD | *SuppressExtraBacksidePages?: TRUE |
PPD | *MSSuppressExtraBacksidePages: True |
Ottimizzazione dei comandi SetPageDevice
Il comportamento predefinito di un dispositivo PostScript che usa un driver con MSxpsPS.dll è che viene eseguito un comando SetPageDevice per ogni pagina e questo comando indica il set completo di opzioni specificate per la pagina. Si noti che alcuni dispositivi potrebbero non funzionare correttamente con questa tecnica.
Tuttavia, se il dispositivo usa MSxpsPS.dll e il file PPD associato specifica *MSOptimizeSetPageDevice: True, il comportamento del dispositivo PostScript è il seguente: - Per ogni pagina in cui è stata apportata una modifica in qualsiasi parte del comando SetPageDevice dalla pagina precedente, viene eseguito un nuovo comando SetPageDevice per indicare il set di opzioni specificate per la pagina. Tuttavia, se non è stata apportata alcuna modifica in nessuna parte del comando SetPageDevice dalla pagina precedente, non viene eseguito un comando SetPageDevice per la pagina.