Как печатать на бумаге нестандартного размера в winforms - PullRequest
21 голосов
/ 18 августа 2011

Я пытаюсь распечатать документ в своем приложении.Но на разных принтерах я получаю разные результаты.Это мой код:

PaperSize paperSize = new PaperSize("My Envelope", 440, 630);
paperSize.RawKind = (int)PaperKind.Custom;

PrintDocument pd = new PrintDocument();
pd.PrintPage += (sender, args) => Console.Out.WriteLine("Printable Area for printer {0} = {1}", args.PageSettings.PrinterSettings.PrinterName, args.PageSettings.PrintableArea);

pd.DefaultPageSettings.PaperSize = paperSize;
pd.DefaultPageSettings.Landscape = true;
pd.DefaultPageSettings.Margins   = new Margins(60, 40, 20, 20);

Console.Out.WriteLine("My paper size: " + pd.DefaultPageSettings.PaperSize);

PrintDialog printDialog = new PrintDialog(); // to choose printer
printDialog.Document = pd;

if (printDialog.ShowDialog(this) == DialogResult.OK)
{
    // pd.DefaultPageSettings.PaperSize = paperSize; // uncomment to override size from dialog

    Console.Out.WriteLine("Paper size for printer {0} = {1}", printDialog.PrinterSettings.PrinterName, pd.DefaultPageSettings.PaperSize);
    _sptTxtControl.Print(pd);
}

Когда отображается диалоговое окно, у меня есть два принтера - Samsung и HP.Это вывод консоли для этих двух:

My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440]
Paper size for printer HP LaserJet 1022n = [PaperSize A4 Kind=A4 Height=1169 Width=827]
Printable Area for printer HP LaserJet 1022n = {X=21,83333,Y=15,66667,Width=789,3333,Height=1137,333}

My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440]
Paper size for printer Samsung SCX-4x28 Series PCL6 = [PaperSize A4 Kind=A4 Height=1169 Width=827]
Printable Area for printer Samsung SCX-4x28 Series PCL6 = {X=17,33333,Y=17,16667,Width=792,3333,Height=1135,167}

Вы видите, что диалоговое окно меняет размер на А4.Так что, если вы уберете строку после showdialog, я использую формат бумаги.Вывод при печати выглядит следующим образом:

My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440]
Paper size for printer HP LaserJet 1022n = [PaperSize My Envelope Kind=Custom Height=630 Width=440]
Printable Area for printer HP LaserJet 1022n = {X=21,83333,Y=15,66667,Width=789,3333,Height=1137,333}

My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440]
Paper size for printer Samsung SCX-4x28 Series PCL6 = [PaperSize My Envelope Kind=Custom Height=630 Width=440]
Printable Area for printer Samsung SCX-4x28 Series PCL6 = {X=16,66667,Y=20,Width=400,1667,Height=589,8333}

Вы можете видеть, что принтер Samsung имеет хорошую область печати, а HP - нет.У HP всегда есть размер A4, независимо от того, что я буду изменять в коде (установите значения для оригинального поля и т.*

и не меняйте размер бумаги после отображения диалогового окна, тогда HP печатает все в порядке.Вывод выглядит так:

My paper size: [PaperSize My Envelope Kind=Custom Height=630 Width=440]
Paper size for printer HP LaserJet 1022n = [PaperSize My Envelop Format Kind=Custom Height=630 Width=440]
Printable Area for printer HP LaserJet 1022n = {X=18,66667,Y=16,Width=405,3333,Height=597,3333}

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

И самое худшее, что Word 2010 нормально печатает один и тот же документ RTF с этим размером на обоих принтерахЯ не могу винить водителя HP.

Есть идеи?

Ответы [ 2 ]

15 голосов
/ 11 сентября 2011

После закрытия PrintDialog не просто установите

pd.DefaultPageSettings.PaperSize = paperSize;

Попробуйте также установить

pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;

Я думаю, что об этом позаботятся.

4 голосов
/ 18 января 2016

настройка

pd.DefaultPageSettings.PaperSize = paperSize;

и

pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;

могут иногда не работать.

Наиболее подходящим вариантом является выбор установленного нестандартного формата бумаги.в драйвере принтера или компьютере, а затем задайте свойства следующего

pd.DefaultPageSettings.PaperSize = ExistingPaperSize;
pd.PrinterSettings.PaperSize = ExistingPaperSize;

Как этот код

    PrintDocument pd = new PrintDocument();
    pd.PrinterSettings = printdg.PrinterSettings;
    PaperSize RequiredPaperSize = CalculatePaperSize(WIDTH,HEIGHT);
    bool FoundMatchingPaperSize = false;
    for (int index = 0; index < pd.PrinterSettings.PaperSizes.Count; index++)
    {
         if (pd.PrinterSettings.PaperSizes[index].Height == RequiredPaperSize.Height && pd.PrinterSettings.PaperSizes[index].Width == RequiredPaperSize.Width)
          {
              pd.PrinterSettings.DefaultPageSettings.PaperSize = pd.PrinterSettings.PaperSizes[index];
              pd.DefaultPageSettings.PaperSize = pd.PrinterSettings.PaperSizes[index];
              FoundMatchingPaperSize = true;
              break;
           }
    }


    //Method to calculate PaperSize from Centimeter to 1/100 of an inch
 /// Caclulates the paper size
    /// </summary>
    /// <param name="WidthInCentimeters"></param>
    /// <param name="HeightInCentimetres"></param>
    /// <returns></returns>
    public static System.Drawing.Printing.PaperSize CalculatePaperSize(double WidthInCentimeters, 
        double HeightInCentimetres)
    {
        int Width = int.Parse( ( Math.Round ((WidthInCentimeters*0.393701) * 100, 0, MidpointRounding.AwayFromZero) ).ToString() );
        int Height = int.Parse( ( Math.Round ((HeightInCentimetres*0.393701) * 100, 0, MidpointRounding.AwayFromZero) ).ToString() );

        PaperSize NewSize = new PaperSize();
        NewSize.RawKind = (int)PaperKind.Custom;
        NewSize.Width = Width;
        NewSize.Height = Height;
        NewSize.PaperName = "Letter";

        return NewSize;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...