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

时间:2016-08-29 14:49:44

标签: 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);
    }
}

控制台中的输出如下:

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

修改

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

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

编辑2

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

  

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

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

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

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

3 个答案:

答案 0 :(得分:4)

在设置自定义设置之前,尝试使用此设置代替您的设置,将PrinterSettings的实例分配给PrintDocument的实例

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

printDoc.DefaultPageSettings.PaperSize = new PaperSize("Custom", 315, 300);

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

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;

答案 1 :(得分:2)

如果您想在自定义尺寸的PDF上打印,那么这段代码将对您有所帮助。

添加

的DLL文件
  

iTextSharp的。

protected void btn_SaveAs_Click(object sender, EventArgs e)
    {
string FileName = "Image_" + System.DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss") + ".pdf"; // Download File Name here.
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;filename=" + FileName);
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        StringWriter sw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(sw);
        pnlPrint.RenderControl(hw); // In which panal name that want to  convert in PDF
        StringReader sr = new StringReader(sw.ToString());
        Document pdfDoc = new Document(new RectangleReadOnly(1500, 1500), 5, 5, 5, 5); // Pge size Chgnge Using RectangleReadOnly(1500, 1500) You can put on size value.
        HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
        PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
        pdfDoc.Open();
        htmlparser.Parse(sr);
        pdfDoc.Close();
        Response.Write(pdfDoc);
        Response.End();
    }

  

文件pdfDoc = new Document(new RectangleReadOnly(1500,1500),5,   5,5,5);

在页面上显示页面大小和填充的高度和宽度。

答案 2 :(得分:1)

只是一个想法:你将RawKind-Property设置为PaperKind.Custom = 0。 documentation说:

  

等于48或49或大于118的值表示自定义纸张尺寸

那里没有定义

和RawKind = 0.

也许打印机驱动程序无法正确处理它,您可能想尝试设置RawKind = 119或s.th.像这样。

此致