2010-01-06 2 views
9

Мне нужно получить размер бумаги с помощью System.Drawing.Printing.PaperKind. Существуют ли какие-либо предопределенные значения? Я не хочу жестко задавать или вычислять размеры бумаги, я просто хочу получить ее программно. Благодарю.Как получить предопределенный размер бумаги PaperKind

ответ

7

Подмножество предопределенных значений можно было итерируя над PrinterSettings.PaperSizes коллекции.

В нашем приложении пользователь выбирает принтер, предоставляя нам объект PrinterSettings. Содержит в пределах PrinterSettings список PaperSize, поддерживаемый принтером - не все (обратите внимание, что драйвер документов XPS (win7) поддерживает все размеры).

В нашем случае это подмножество поддерживаемых размеров - это все, что нам нужно. Пользователь, указанный PaperKind, передается нашему печатающему коду, и он проходит через наш объект PrinterSettings, пока он не найдет выбор пользователя или не сдастся и не использует значение по умолчанию.

В приведенном ниже примере вы можете увидеть, что объекты PaperSize правильно заполнены.

PrinterSettings settings = new PrinterSettings(); 
foreach (PaperSize size in settings.PaperSizes) 
    Debug.WriteLine(size); 

Это только подмножество, но, возможно, этого вам и достаточно. API-интерфейсы печати в .NET действительно неясны, и msdn на самом деле не очень помогает ... Надеюсь, это ставит вас на правильный путь!

2

Вы можете попробовать класс System.Drawing.Printing.PaperSize. Существует свойство RawKind, которое может быть установлено в System.Drawing.Printing.PaperKind.

Что-то вроде:

PaperSize size = new PaperSize(); 
size.RawKind = (int) PaperKind.A3; 
+0

No. В этом случае высота и ширина по-прежнему 0. – alga

+0

человек, можно подумать, что есть какой-то вспомогательный класс для этого. http://msdn.microsoft.com/en-us/library/system.drawing.printing.paperkind.aspx перечисляет каждый PaperKind вместе с высотой и шириной. Возможно, вам следует написать класс-помощник и опубликовать его? – hackerhasid

+0

Я видел этот класс перечислений. Но я хотел не писать никаких классов, потому что они могут быть уже написаны. – alga

5

LINQ путь для достижения этой цели является чем-то вроде этого:

PrinterSettings printerSettings = new PrinterSettings(); 
IQueryable<PaperSize> paperSizes = printerSettings.PaperSizes.Cast<PaperSize>().AsQueryable(); 
PaperSize a4rotated = paperSizes.Where(paperSize => paperSize.Kind == PaperKind.A4Rotated).FirstOrDefault(); 

Успехов!

+0

// https://stackoverflow.com/questions/17602366/why-can-i-not-call-toarray -on-a-generic-ienumerable-object с использованием System.Linq; – udoline

2
public static PaperSize GetPaperSize(string Name) 
    { 
     PaperSize size1 = null; 
     Name=Name.ToUpper(); 
     PrinterSettings settings = new PrinterSettings(); 
     foreach (PaperSize size in settings.PaperSizes) 
      if (size.Kind.ToString().ToUpper() == Name) 
      { 
       size1 = size; 
       break; 
      } 
     return size1;    
    } 
0
PaperSize pkSize; 
PrintDocument printDoc = new PrintDocument(); 
for (int i = 0; i < printDoc.PrinterSettings.PaperSizes.Count; i++) 
{ 
    pkSize = printDoc.PrinterSettings.PaperSizes[i]; 
    cmbPaperSize.Items.Add(pkSize); 
} 
+2

Добавьте небольшое объяснение в свой ответ, чтобы объяснить, почему он работает. – Morgoth

+0

используйте это с помощью System.Drawing.Printing; –

Смежные вопросы