首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C#中覆盖自定义纸张大小

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

Stack Overflow用户
提问于 2016-08-29 14:49:43
回答 3查看 19K关注 0票数 12

我正在C#做一个项目。我有一个标签打印机,它需要打印我发送的文档。但是,打印机打印的Custom纸张格式(荷兰语为Papierformaat)无法覆盖以下值:https://gyazo.com/e350ed1e355b45b8cae24196d2b5869b。如果我使new PaperSize();的高度变小或等于300,它就能工作,但是如果我试图使它变大,比如说500,它会把它降低到300。为什么会发生这种事?似乎我无法覆盖链接图片中的值( 300)。

代码语言:javascript
运行
复制
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);
    }
}

控制台中的输出如下:

代码语言:javascript
运行
复制
My paper size: [PaperSize Test Kind=Custom Height=500 Width=315]
Printable Area for printer xxx = {X=0,Y=0,Width=400,Height=300}

编辑

对于那些想知道的人来说,我正在处理的是一台印钞机,有一个连续的卷轴。所以,从技术上讲,我可以打印一个无限高,设置宽度为80毫米的文件。但我似乎无法覆盖对话框设置中的Custom 300值。

我还想指出的是,还有另外两个程序实际上能够遍历300个值并扩展PrintableArea。谁能帮上忙?

编辑2

在沙奇尔·阿哈德发表评论之后,我得到了进一步的评论:

gyazo.com/3298e480b77c5ba837b071b2ec4f7b8d,这比我使用最后一个解决方案得到的要多得多。但是,当我打印它时,页面又会像以前一样在300处被切断,它总是在对话框中给定的值( 300和400值的框)下被切断。

我觉得它不适用于基本的打印选项,因为我认为驱动程序会重写页面值,只是在不关心PaperSizes的情况下切断它们。我读过一些关于DEVMODE结构的文章,那有什么可能呢?是否可以在这里重写打印机驱动程序设置,并使用连续滚动打印无限长的打印?

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

对任何感兴趣的人来说,我的打印机出现了其他一些问题,并且开始表现得很奇怪(比如没有打印打印作业)。毕竟,我想安装司机时出了点问题。我删除了驱动程序,并根据驱动程序CD重新停止了所有操作,现在我最初发布的代码似乎一开始就正常工作。因为我浪费了那么多时间编写仅仅是一个糟糕的驱动程序安装,这有点让人扫兴。现在我可以打印超过300个单位,我可以打印一个连续超过25厘米,如果我想的话。感谢所有和我一起思考解决这个问题的人!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-02 12:13:07

在设置自定义设置之前,尝试这样做,而不是您的设置,将PrinterSettings实例分配给PrintDocument实例

代码语言:javascript
运行
复制
PrinterSettings ps = new PrinterSettings();
PrintDocument printDoc = new PrintDocument();
printDoc.PrinterSettings = ps; 

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

或者这样做,我希望这能奏效。

代码语言:javascript
运行
复制
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;
票数 8
EN

Stack Overflow用户

发布于 2016-09-07 05:17:41

如果您喜欢在PDF上打印自定义大小,那么这段代码将帮助您。

添加DLL文件

iTextSharp。

代码语言:javascript
运行
复制
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();
    }

何地线

Document pdfDoc =新文档(新RectangleReadOnly(1500,1500),5,5,5,5);

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

票数 2
EN

Stack Overflow用户

发布于 2016-09-01 11:15:01

只是一个想法:将RawKind-属性设置为PaperKind.Custom,为= 0。文档说:

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

这里没有定义RawKind =0。

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

问候

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39209126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档