2016-04-06 6 views
1

У меня есть логика для экспорта avery label pdf. Логика экспортирует pdf с метками должным образом, но когда я печатаю этот pdf, измерения размера страницы (свойства страницы), которые я передаю, не соответствуют печатной странице.Печать этикеток с использованием iTextSharp

Свойства страницы

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

Logic

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

Вы пишете: * измерения размера страницы (свойства страницы), которые я передаю, соответствуют печатной странице. * Это замечательно. Но если измерения размера страницы соответствуют измерениям на печатной странице, то в чем проблема? Возможно ли, что вы хотели написать: * измерения размера страницы (свойства страницы), которые я передаю, не соответствуют печатной странице. * –

+0

Извините, я обновил. – DonMax

+0

;-) Я предположил, что это опечатка, и я пошел дальше, давая ответ. –

ответ

1

PDF-документ может иметь очень точные измерения, но затем эти измерения ввернуты, потому что страница масштабируются при печати обработать. Это обычная проблема: разные принтеры будут использовать разные коэффициенты масштабирования с разными результатами при печати документа с использованием разных принтеров.

Как этого избежать?

В диалоге печати из Adobe Reader, вы можете выбрать, как принтер должен вести:

enter image description here

По умолчанию принтер попытается «Установить» содержимое на странице, но не каждый принтер может физически использовать полный размер страницы (из-за ограничений оборудования), есть вероятность, что принтер будет масштабировать страницу вниз, если вы используете «Fit».

Лучше выбрать вариант «Фактический размер». Недостатком использования этой опции является то, что некоторый контент может потеряться, поскольку он слишком близко к границе страницы в области, физически недоступной принтеру, но преимущество в том, что измерения будут сохранены.

Вы можете установить эту опцию программно в документе, рассказав документ не должен масштабироваться:

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

См How to set initial view properties? для получения дополнительной информации о предпочтениях телезрителей.

+0

Я попытался добавить 'writer.AddViewerPreference (PdfName.PRINTSCALING, PdfName.NONE);' в моем коде. По умолчанию теперь выбирается опция «Фактический размер» в формате pdf. Но левое, верхнее, нижнее и правое поля по-прежнему отображаются неправильно в соответствии с заданными значениями. хотя ячейки Label отображаются точно так же, как и данные. Любой ключ? – DonMax

+0

Как я объяснил: из-за физических ограничений аппаратного обеспечения, принтеры часто не могут писать контент, который добавляется в поля страницы. Это проблема, которую вы описали в своем комментарии? Если это так, то вам следует перейти на более профессиональный промышленный принтер для печати ваших ярлыков. Если нет, вы должны уточнить свой вопрос.Я понятия не имею, что вы имеете в виду, когда говорите, что «поля не отображаются правильно», поскольку я не знаю, чего вы ожидали. –

+0

Я не имел в виду контент, а размер поля. Когда я экспортирую pdf с границами меток, левая, правая, верхняя и нижняя поля (PageMarginTop = "21" PageMarginBottom = "21" PageMarginLeft = "8" PageMarginRight = "8") не печатаются в соответствии с указанным выше размером в печатная страница. Но все ярлыки Высота и Ширина (Ширина = "48,5" Высота = "25,4") выходят очень хорошо на печатной странице. – DonMax