アプリケーションでドキュメントを印刷しようとしています。しかし、異なるプリンターでは異なる結果が得られます。これは私のコードです:
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の2つのプリンターがあります。これはこれら二つのコンソール出力です:
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}
ダイアログがサイズをA4に変更していることがわかります。そのため、showdialogの後に行を開くことができない場合は、papersizeを適用します。印刷時の出力は次のようになります。
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}
HPにはないが、Samsungプリンターには適切な印刷可能領域があることがわかります。 HPは、コードを変更しても、常にA4サイズです(originatmarginsを設定するなど)。
印刷のプロパティで紙の設定を変更した場合(ポーランド語ダイアログでは申し訳ありません):
ダイアログを表示した後で用紙サイズを変更しない場合、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}
しかし、ユーザーに自分のプリンター用にカスタムサイズを保存するように強制したくありません。私はこれを京セラプリンタでも試しましたが、動作しますが、他の2つのHPプリンタでは動作しません。
そして最悪の部分は、Word 2010が両方のプリンターで同じサイズの同じRTFドキュメントを印刷できることです。私はHPドライバーのせいにできません。
何か案は?
PrintDialogが閉じた後、設定しないでください
pd.DefaultPageSettings.PaperSize = paperSize;
設定もお試しください
pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;
それで大丈夫だと思います。
設定
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;
}