moriquendi Alias Plume | Bonjour Deliriumtremens Merci pour ton coup de main. En effet j'avais déjà exploré la piste du PaperSize et de PrintDocument. Le problème est que pour l'impression PrintDocument ne prend qu'un chemin de fichier ou un flux (Stream) en entrée. Or je lance l'impression depuis Revit et une feuille du projet qui n'est n'y un objet n'y un flux. J'utilise donc des fonctions propre à Revit pour le lancement de l'impression. Ces dernières prenant des éléments Revit en entrée, mais ces fonctions d'impression ne permette que la sélection d'un format de papier pas d'en créer un à la volé. D'où mon désir de créer un format de papier "en avance" pour que je puisse le sélectionner par la suite. J'ai finalement trouvé la solution à mon problème ce midi grâce à ces liens (en autre) ici et ici Encore merci pour votre aide. Voici le code si jamais une âme perdu est bloquée par le même problème :
Code :
- using System;
- using System.Runtime.InteropServices;
- using System.Security;
- using System.Text;
- namespace Gestion_Imprimante_Windows
- {
- class CreationFormPapier
- {
- #region winspool.Drv
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
- internal struct structPrinterDefaults
- {
- [MarshalAs(UnmanagedType.LPTStr)]
- public String pDatatype;
- public IntPtr pDevMode;
- [MarshalAs(UnmanagedType.I4)]
- public int DesiredAccess;
- };
- [DllImport("winspool.Drv", EntryPoint = "OpenPrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
- internal static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPTStr)] string printerName, out IntPtr phPrinter, ref structPrinterDefaults pd);
- [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
- internal static extern bool ClosePrinter(IntPtr phPrinter);
- [DllImport("winspool.Drv", EntryPoint = "DeleteForm", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
- internal static extern bool DeleteForm( IntPtr phPrinter, [MarshalAs(UnmanagedType.LPTStr)] string pName);
- [DllImport("winspool.Drv", EntryPoint = "AddFormW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
- internal static extern bool AddForm( IntPtr phPrinter, [MarshalAs(UnmanagedType.I4)] int level, ref FormInfo1 form);
- [DllImport("kernel32.dll", EntryPoint = "GetLastError", SetLastError = false, ExactSpelling = true, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
- internal static extern Int32 GetLastError();
- [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
- internal struct FormInfo1
- {
- [FieldOffset(0), MarshalAs(UnmanagedType.I4)]
- public uint Flags;
- [FieldOffset(4), MarshalAs(UnmanagedType.LPWStr)]
- public String pName;
- [FieldOffset(8)]
- public structSize Size;
- [FieldOffset(16)]
- public structRect ImageableArea;
- };
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
- internal struct structSize
- {
- public Int32 width;
- public Int32 height;
- }
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
- internal struct structRect
- {
- public Int32 left;
- public Int32 top;
- public Int32 right;
- public Int32 bottom;
- }
- #endregion
- public static void AddCustomPaperSize(string printerName, string paperName, float widthMm, float heightMm)
- {
- if (PlatformID.Win32NT == Environment.OSVersion.Platform)
- {
- // The code to add a custom paper size is different for Windows NT then it is
- // for previous versions of windows
- const int PRINTER_ACCESS_USE = 0x00000008;
- const int PRINTER_ACCESS_ADMINISTER = 0x00000004;
- structPrinterDefaults defaults = new structPrinterDefaults();
- defaults.pDatatype = null;
- defaults.pDevMode = IntPtr.Zero;
- defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE;
- IntPtr hPrinter = IntPtr.Zero;
- // Open the printer.
- if (OpenPrinter(printerName, out hPrinter, ref defaults))
- {
- try
- {
- // delete the form incase it already exists
- DeleteForm(hPrinter, paperName);
- // create and initialize the FORM_INFO_1 structure
- FormInfo1 formInfo = new FormInfo1();
- formInfo.Flags = 0;
- formInfo.pName = paperName;
- // all sizes in 1000ths of millimeters
- formInfo.Size.width = (int)(widthMm * 1000.0);
- formInfo.Size.height = (int)(heightMm * 1000.0);
- // gestion de marges zones d'impression
- formInfo.ImageableArea.left = 0;
- formInfo.ImageableArea.right = formInfo.Size.width;
- formInfo.ImageableArea.top = 0;
- formInfo.ImageableArea.bottom = formInfo.Size.height;
- if (!AddForm(hPrinter, 1, ref formInfo))
- {
- StringBuilder strBuilder = new StringBuilder();
- strBuilder.AppendFormat("Failed to add the custom paper size {0} to the printer {1}, System error number: {2}",
- paperName, printerName, GetLastError());
- throw new ApplicationException(strBuilder.ToString());
- }
- }
- finally
- {
- ClosePrinter(hPrinter);
- }
- }
- else
- {
- StringBuilder strBuilder = new StringBuilder();
- strBuilder.AppendFormat("Failed to open the {0} printer, System error number: {1}", printerName, GetLastError());
- throw new ApplicationException(strBuilder.ToString());
- }
- }
- else
- {
- StringBuilder strBuilder = new StringBuilder();
- strBuilder.AppendFormat(" windows version prior to windows 2000 error" );
- throw new ApplicationException(strBuilder.ToString());
- }
- }
- }
- }
|
Message édité par moriquendi le 11-02-2016 à 15:28:10 ---------------
≡ Diablo III ≡ Steam ≡ DotaBuff ≡ Figurines ≡ Ach & Vds
|