如何在C#中覆盖自定义Papersize

Mar*_*son 11 c# printing

我正在用C#开发一个项目.我有一个labelprinter,需要打印我发送的文件.但是,打印机打印时,我无法覆盖以下Custom所见的纸张格式(荷兰语Papierformaat)的以下值:https://gyazo.com/e350ed1e355b45b8cae24196d2b5869b .如果我将new PaperSize();它的高度设置为小于或等于300就可以了,但是如果我试着把它做得更大,比如500,那就把它降低到300.为什么这会让它开心呢?好像我无法覆盖链接图片中的值(即300).

public void Printing()
{
    try
    {
        streamToPrint = new StreamReader(filePath);
        try
        {
            PrinterSettings settings = new PrinterSettings();

            printFont = new Font("Arial", 10);
            PrintDocument pd = new PrintDocument();

            PaperSize paperSize = new PaperSize("Test", 315, 300);
            paperSize.RawKind = (int)PaperKind.Custom;


            pd.DefaultPageSettings.PaperSize = paperSize;
            pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);

            pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;
            pd.PrinterSettings.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);

            pd.PrintPage += (sender, args) => Console.Out.WriteLine("Printable Area for printer {0} = {1}", args.PageSettings.PrinterSettings.PrinterName, args.PageSettings.PrintableArea);
            Console.Out.WriteLine("My paper size: " + pd.DefaultPageSettings.PaperSize); 


            pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
            // Print the document.
            pd.Print();
        }
        finally
        {
            streamToPrint.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台中的输出如下:

My paper size: [PaperSize Test Kind=Custom Height=500 Width=315]
Printable Area for printer xxx = {X=0,Y=0,Width=400,Height=300}
Run Code Online (Sandbox Code Playgroud)

编辑

对于那些想知道的人,我正在处理带有连续卷的标签打印机.所以从技术上讲,我可以打印一个高度无限,设置宽度为80mm的文档.但我似乎无法覆盖Custom 300对话框设置中的值.

我还想指出,还有2个其他程序实际上可以超过300值并扩展PrintableArea.谁可以帮忙?

编辑2

在Shakir Ahamed的评论之后我进一步说:

gyazo.com/3298e480b77c5ba837b071b2ec4f7b8d我得到了这个,这比我以前使用你的上一个解决方案要多得多.但是当我打印它时,页面再次像往常一样切断300,它总是切断对话框中给出的值(具有300和400值的框)

我觉得它不适用于基本的打印选项,因为我认为驱动程序会覆盖页面值,只是将它们切断而不关心PaperSizes.我读了一些关于DEVMODE结构的东西,有什么可能的呢?我可以在这里覆盖打印机驱动程序设置并使用连续卷打印无限长的打印件吗?

编辑3(已解决,2016年10月20日)

对于任何感兴趣的人,我的打印机出现了一些其他问题,并开始表现得很奇怪(比如不打印打印作业).毕竟我猜安装驱动程序出了问题.我删除了驱动程序并根据驱动程序CD重新安装了所有内容,现在我最初发布的代码似乎在第一时间正常工作.有点糟糕,因为我浪费了很多时间来编写一个糟糕的驱动程序安装.现在我可以在300个单位上打印,如果我愿意的话,我可以用连续卷筒打印超过25厘米.感谢所有与我一起思考解决这个问题的人!

Sha*_*med 5

尝试以这种方式代替设置,在设置自定义设置之前,将PrinterSettings的实例分配给PrintDocument的实例

PrinterSettings ps = new PrinterSettings();
PrintDocument printDoc = new PrintDocument();
printDoc.PrinterSettings = ps; 

printDoc.DefaultPageSettings.PaperSize = new PaperSize("Custom", 315, 300);
Run Code Online (Sandbox Code Playgroud)

或尝试这种方式,我希望这会起作用

PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings.PaperSize = new PaperSize("Custom", 315, 300);
pd.DefaultPageSettings.PaperSize.RawKind = 119;
pd.PrinterSettings.DefaultPageSettings.PaperSize.RawKind = 119;
pd.DefaultPageSettings.Landscape = false;
Run Code Online (Sandbox Code Playgroud)