【问题标题】:Label Printing using iTextSharp使用 iTextSharp 进行标签打印
【发布时间】:2016-07-26 05:30:09
【问题描述】:

我有一个导出 avery 标签 pdf 的逻辑。逻辑正确导出带有标签的 pdf,但是当我打印该 pdf 时,我传递的页面大小测量值(页面属性)与打印的页面不匹配。

页面属性

Width="48.5" Height="25.4" HorizontalGapWidth="0" VerticalGapHeight="0" PageMarginTop="21" PageMarginBottom="21" PageMarginLeft="8" PageMarginRight="8" PageSize="A4" LabelsPerRow="4" LabelRowsPerPage="10"

上面的属性值在应用之前首先转换为point值。

转换为点

    private float mmToPoint(double mm)
    {
        return (float)((mm / 25.4) * 72);
    }

逻辑

    public Stream SecLabelType(LabelProp _label)
    {
        List<LabelModelClass> Model = new List<LabelModelClass>();
        Model = RetModel(_label);
        bool IncludeLabelBorders = false;
        FontFactory.RegisterDirectories();
        Rectangle pageSize;
        switch (_label.PageSize)
        {
            case "A4":
                pageSize = iTextSharp.text.PageSize.A4;
                break;
            default:
                pageSize = iTextSharp.text.PageSize.A4;
                break;
        }

        var doc = new Document(pageSize,
                               _label.PageMarginLeft,
                               _label.PageMarginRight,
                               _label.PageMarginTop,
                               _label.PageMarginBottom);

        var output = new MemoryStream();

        var writer = PdfWriter.GetInstance(doc, output);

        writer.CloseStream = false;
        doc.Open();
        var numOfCols = _label.LabelsPerRow + (_label.LabelsPerRow - 1);
        var tbl = new PdfPTable(numOfCols);
        var colWidths = new List<float>();
        for (int i = 1; i <= numOfCols; i++)
        {
            if (i % 2 > 0)
            {
                colWidths.Add(_label.Width);
            }
            else
            {
                colWidths.Add(_label.HorizontalGapWidth);
            }
        }

        var w = iTextSharp.text.PageSize.A4.Width - (doc.LeftMargin + doc.RightMargin);
        var h = iTextSharp.text.PageSize.A4.Height - (doc.TopMargin + doc.BottomMargin);
        var size = new iTextSharp.text.Rectangle(w, h);
        tbl.SetWidthPercentage(colWidths.ToArray(), size);
        //var val = System.IO.File.ReadLines("C:\\Users\\lenovo\\Desktop\\test stock\\testing3.txt").ToArray();
        //var ItemNoArr = Model.Select(ds => ds.ItemNo).ToArray();
        //string Header = Model.Select(ds => ds.Header).FirstOrDefault();
        int cnt = 0;
        bool b = false;
        int iAddRows = 1;
        for (int iRow = 0; iRow < ((Model.Count() / _label.LabelsPerRow) + iAddRows); iRow++)
        {
            var rowCells = new List<PdfPCell>();
            for (int iCol = 1; iCol <= numOfCols; iCol++)
            {
                if (Model.Count() > cnt)
                {
                    if (iCol % 2 > 0)
                    {
                        var cellContent = new Phrase();
                        if (((iRow + 1) >= _label.StartRow && (iCol) >= (_label.StartColumn + (_label.StartColumn - 1))) || b)
                        {
                            b = true;

                            try
                            {
                                var StrArr = _label.SpineLblFormat.Split('|');

                                foreach (var x in StrArr)
                                {
                                    string Value = "";
                                    if (x.Contains(","))
                                    {
                                        var StrCommaArr = x.Split(',');
                                        foreach (var y in StrCommaArr)
                                        {
                                            if (y != "")
                                            {

                                                Value = ChunckText(cnt, Model, y, Value);

                                            }
                                        }
                                        if (Value != null && Value.Replace(" ", "") != "")
                                        {
                                            cellContent.Add(new Paragraph(Value));
                                            cellContent.Add(new Paragraph("\n"));
                                        }
                                    }
                                    else
                                    {
                                        Value = ChunckText(cnt, Model, x, Value);
                                        if (Value != null && Value.Replace(" ", "") != "")
                                        {
                                            cellContent.Add(new Paragraph(Value));
                                            cellContent.Add(new Paragraph("\n"));
                                        }
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                var fontHeader1 = FontFactory.GetFont("Verdana", BaseFont.CP1250, true, 6, 0);
                                cellContent.Add(new Chunk("NA", fontHeader1));
                            }
                            cnt += 1;
                        }
                        else
                            iAddRows += 1;
                        var cell = new PdfPCell(cellContent);
                        cell.FixedHeight = _label.Height;
                        cell.HorizontalAlignment = Element.ALIGN_LEFT;
                        cell.Border = IncludeLabelBorders ? Rectangle.BOX : Rectangle.NO_BORDER;
                        rowCells.Add(cell);
                    }
                    else
                    {
                        var gapCell = new PdfPCell();
                        gapCell.FixedHeight = _label.Height;
                        gapCell.Border = Rectangle.NO_BORDER;
                        rowCells.Add(gapCell);
                    }
                }
                else
                {
                    var gapCell = new PdfPCell();
                    gapCell.FixedHeight = _label.Height;
                    gapCell.Border = Rectangle.NO_BORDER;
                    rowCells.Add(gapCell);
                }
            }
            tbl.Rows.Add(new PdfPRow(rowCells.ToArray()));
            _label.LabelRowsPerPage = _label.LabelRowsPerPage == null ? 0 : _label.LabelRowsPerPage;
            if ((iRow + 1) < _label.LabelRowsPerPage && _label.VerticalGapHeight > 0)
            {
                tbl.Rows.Add(CreateGapRow(numOfCols, _label));
            }

        }
        doc.Add(tbl);
        doc.Close();
        output.Position = 0;
        return output;

    }

private PdfPRow CreateGapRow(int numOfCols, LabelProp _label)
    {
        var cells = new List<PdfPCell>();

        for (int i = 0; i < numOfCols; i++)
        {
            var cell = new PdfPCell();
            cell.FixedHeight = _label.VerticalGapHeight;
            cell.Border = Rectangle.NO_BORDER;
            cells.Add(cell);
        }
        return new PdfPRow(cells.ToArray());
    }

【问题讨论】:

  • 您写道:我通过的页面尺寸测量值(页面属性)与打印的页面相匹配。 那太好了。但是,如果页面尺寸测量值与打印页面上的测量值匹配,那么问题出在哪里?您是否可能打算写:我传递的页面大小测量值(页面属性)与打印页面不匹配。
  • ;-) 我认为这是一个错字,我继续提供答案。

标签: pdf c#-4.0 itextsharp


【解决方案1】:

PDF 文档可能具有非常准确的测量值,但随后这些测量值会因为页面在打印过程中被缩放而搞砸了。这是一个常见的问题:当您使用不同的打印机打印文档时,不同的打印机会使用不同的缩放因子,从而产生不同的结果。

如何避免这种情况?

在 Adob​​e Reader 的打印对话框中,您可以选择打印机的行为方式:

默认情况下,打印机会尝试“适合”页面上的内容,但由于并非每台打印机都可以实际使用整个页面大小(由于硬件限制),因此打印机很有可能会缩小页面如果你使用“适合”。

最好选择“实际尺寸”选项。使用此选项的缺点是某些内容可能会丢失,因为它在打印机物理上无法到达的区域中太靠近页面边框,但优点是可以保留测量值。

您可以通过告诉文档不应缩放来以编程方式在文档中设置此选项:

writer.AddViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);

有关观看者偏好的更多信息,请参阅How to set initial view properties?

【讨论】:

  • 我尝试在我的代码中添加writer.AddViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);。默认情况下,现在选择 pdf 中的 Actual Size 选项。但是按照给定的值,左边距、上边距、下边距和右边距仍然不能正确显示。尽管标签单元格呈现的大小与给定的大小完全相同。有什么线索吗??
  • 正如我所解释的:由于硬件的物理限制,打印机通常无法写入添加到页面边缘的内容。这是您在评论中描述的问题吗?如果是这样,那么您应该升级到更专业的工业打印机来打印您的标签。如果没有,你应该澄清你的问题。当您说“边距未正确显示”时,我不知道您的意思是什么,因为我不知道您在期待什么。
  • 我指的不是内容,而是页边距大小。当我导出带有标签边框的 pdf 时,左侧、右侧、顶部和底部边距 (PageMarginTop="21" PageMarginBottom="21" PageMarginLeft="8" PageMarginRight="8") 未根据上述尺寸在打印的页面。但是所有标签的高度和宽度 (Width="48.5" Height="25.4") 在打印页面中都显示得非常好。
  • @DonMax 您看到的内容在很大程度上取决于打印机。您无法在每种类型的打印机上复制它。您无法通过将某些内容更改为 PDF 来做任何事情。这个问题没有答案。
  • 对于 OP,了解当您在 iText 中设置“边距”时,您只是指示 iText 在绘图时保持在这些范围内(相对于页面大小),这可能会有所帮助。但是,这些“边距”实际上并未写入 PDF,因为 PDF 不支持它们。然后,当您打印时,您可以设置不同的边距,告诉打印机头(或其他)距离纸张边缘有多近绘制。正如 Bruno 所说,此说明对于您的特定打印机及其功能来说是独一无二的。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 2016-01-18
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多