如何在C#中覆盖自定义纸张大小

12

我正在使用C#开发一个项目。我有一个标签打印机,需要打印我发送的文档。打印机可以打印,但是我无法重写此处所示的自定义纸张格式(荷兰语为“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的文档。但是我似乎无法覆盖对话框设置中的自定义300值。

我还想指出,还有另外两个程序实际上能够超过300的值并扩展可打印区域PrintableArea。谁能帮忙呢?

编辑2

在Shakir Ahamed的评论后,我更进一步了:

gyazo.com/3298e480b77c5ba837b071b2ec4f7b8d 我得到了这个结果,比我以前使用你的最后一个解决方案获得的结果要多得多。但当我打印时,页面仍然在300处截断,就像以前一样,它总是在对话框中给出的值处截断(具有300和400值的框)

我觉得基本的打印选项不会起作用,因为我认为驱动程序会覆盖页面的值,并且只是将它们截断而不关心纸张尺寸PaperSizes。我读到了一些关于DEVMODE结构的内容,那么使用它可以做什么?我能否在此处覆盖打印机驱动程序设置并用连续卷打印无限长的打印品吗?

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

对于任何感兴趣的人, 我的打印机出现了一些其他问题,开始表现得很奇怪(例如不打印打印作业)。毕竟,我想安装驱动程序时出了问题。我删除了驱动程序并按照驱动程序CD上的说明重新安装了所有内容,现在我最初发布的代码似乎一开始就能正常工作。有点遗憾,因为我浪费了很多时间编写只有一个错误的驱动程序安装程序的代码。现在我能够超过300个单位进行打印,并且如果需要,我可以使用连续卷进行25厘米以上的打印。感谢所有与我一起思考解决这个问题的人!


我已经有一段时间没有写打印机代码了,但这可能与您选择的打印机功能有关吗? - Jonny
@Jonny,如您在链接的图片中所见,范围从75到2400,而默认值设置为300。当将默认值设置为300时,我无法再提高它,只能降低它。除非我从图片中提高该值,然后我也能在我的代码中提高它。感觉像是图片中的屏幕限制了代码可以处理的值或类似的东西。 - Markinson
您可以提出不同的纸张尺寸,但打印机驱动程序需要适应该尺寸。从您提供的信息看,您并没有告诉我们足够关于打印机的信息,但这款打印机看起来是专门用于标签打印的,因为它所接受的宽度范围相当低。这种打印机对您使用的标签纸张要求非常严格。例如,您可能输入的是标签尺寸而不是纸张尺寸,或者标签实际上是在一个卷轴上而不是在纸张上。在您的代码中请求更大的标签,但实际上您已经在配置中告诉它了的大小,这种做法并不是特别明智。 - Hans Passant
@HansPassant,标签打印机确实是连续卷。奇怪的是其他程序能够覆盖此打印机区域大小,但我的代码却不能。如果我想要,在其他第三方软件中,我可以打印一米长的标签,但在我的代码中似乎被固定在输入框中给定的值。 - Markinson
3个回答

8
在设置自定义设置之前,将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;

我会在下周一告诉你是否成功,只要我再次拥有打印机! - Markinson
你可以通过编程在断点处检查数值是否发生变化来验证吗? - Shakir Ahamed
我得到了这个,比使用您上次的解决方案要多得多。但是当我打印它时,页面仍然像以前一样在300处截断,它总是在对话框中给定的值处截断(即带有300和400值的框)。 - Markinson

2

如果您想使用自定义尺寸打印PDF,则此代码片段将对您有所帮助。

添加iTextSharp的DLL文件。

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();
    }

代码中的where line是什么意思?

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

该代码用于显示页面大小以及页面内边距的高度和宽度。


对于ITextSharp,您可以使用或查看以下链接:
  1. : https://www.nuget.org/packages/iTextSharp/
  2. : https://github.com/itext/itextsharp
- Gautam Kumar Sahu

1
只是一个想法:您正在将RawKind属性设置为PaperKind.Custom,其值为0。 文档中说:

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

而RawKind = 0在此未定义。
也许打印机驱动程序无法正确处理它,您可以尝试将RawKind设置为119或类似的内容。
问候

可打印区域仍然不正确 :( - Markinson
嗯,如果没有所需的硬件进行测试,那就很难说了。也许您可以在使用打印功能之前尝试设置打印机表单,类似于这样:http://www.codeproject.com/Articles/12229/Adding-custom-paper-sizes-to-named-printers - Yosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接