Странная проблема печати с Hardmargin только для первой печати (WinForms) - PullRequest
2 голосов
/ 19 февраля 2010

У нас странная проблема с печатью изображений и текста. Когда мы печатаем ВПЕРВЫЕ на аппарате, ТОЛЬКО фон смещается вверх и влево и печатается не в том месте. Текст напечатан правильно. Когда мы печатаем то же самое снова, все в порядке .... и BG и текст ..? Удаление и переустановка приложения или перезапуск аппарата не дают никаких изменений, все печатается нормально.

Итак, поскольку только изображение bg печатается неправильно, мы подозреваем, что проблема связана со свойством HardMargin. (Только этот метод использует HardMargin)

Почему проблема возникает только при первом исполнении - для нас загадка ... ?? У кого-нибудь есть какие-либо подсказки?

    private void DrawBackground(PrintPageEventArgs ev, string bgFilePath, float offsetX, float offsetY)
    {
        try
        {
            System.Drawing.Image img = System.Drawing.Image.FromFile(bgFilePath);
            float w = (float)Width;
            float h = (float)Height;
            float x = ev.PageSettings.HardMarginX + (offsetX);
            float y = ev.PageSettings.HardMarginY + (offsetY);
            ev.Graphics.DrawImage(img, x, y, w, h);
        }
        catch (Exception ex)
        {
            //Errors.CatchError
        }
    }



//Method for printing text ( on top of background )

RectangleF printRect = new RectangleF();
printRect.X = offsetX + (rtfPrintscale * (float)v.X);
printRect.Y = offsetY + (rtfPrintscale * (float)v.Y);
printRect.Width = rtfPrintscale * (float)v.Width;
printRect.Height = rtfPrintscale * (float)v.Height;

............................................... ............. В ответ на ответ 1:

Привет, JDMX,

то, что вы говорите, имеет смысл. Я думал по тому же пути.

Я объясню, что именно произошло:

Я установил приложение на свой ноутбук для тестирования. На этом ноутбуке я недавно установил драйвер принтера для печати на беспроводном принтере.

При создании предварительного просмотра я заметил, что фоновое изображение было размещено неправильно. У него были отрицательные значения x & y. Я думал, что это ошибка в коде, поэтому вернулся к машине разработки и проверил ... все работало нормально. Так что я проверил это на нескольких машинах ... все еще все работало нормально

Итак, я вернулся к ноутбуку и сделал распечатку. Печать была такой же, как предварительный просмотр. Озадаченный, я снова сгенерировал предварительный просмотр, и теперь все было помещено правильно ???

Так что я подумал, что это проблема с настройками приложений, поэтому я удалил переустановленный ... все еще все печаталось правильно. Поэтому я перезагрузился, но безрезультатно.

Наша проблема в том, что мы даже не можем воспроизвести или отладить ошибку ...

Может, есть драйвер принтера только для тестирования или что-то, с чем мы можем работать?

Кстати: я устанавливаю поля несколькими способами:

ThePrintDocument.OriginAtMargins = true;
ThePrintDocument.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);

...

ThePrintDocument.DefaultPageSettings.Margins.Left = 0;
ThePrintDocument.DefaultPageSettings.Margins.Top = 0;
ThePrintDocument.DefaultPageSettings.Margins.Bottom = 0;
ThePrintDocument.DefaultPageSettings.Margins.Right = 0;

... РЕДАКТИРОВАТЬ: Решение: .................................... ........

Ну, вот что мы думаем:

1) По умолчанию для настроек принтера установлено поле 100

.

2) Вы задаете единицу измерения в миллиметре

3) для параметра OriginArMargins установлено значение true

4) Установите поля на 0

На самом деле произошло то, что для «Origin» установлено значение по умолчанию, равное 100, что интерпретируется как 100 мм. Таким образом, ваш контент теперь печатается с полем в 100 мм.

Что вам нужно сделать, это сначала установить поля на 0, а затем установить originatmargins на true.

НТН.

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Когда вы используете OriginAtMargins = true

Затем PrintController получает HardMargins и использует apropiate TranslateTransform вместо Ev.Graphics.

Обратите внимание, что Graphics.Unit = Display (на данный момент)

При изменении Graphics.Unit Graphics.Transform не преобразуется. Вы можете сделать некоторые преобразования координат:

  Protected Sub AdjustPageUnit(ByVal g As Graphics, PageUnit As GraphicsUnit)
        If g.PageUnit <> PageUnit AndAlso g.PageUnit = GraphicsUnit.Display Then
           g.PageUnit = PageUnit
           If OriginAtMargins Then
              If PageUnit = GraphicsUnit.Pixel Then
                 g.TranslateTransform(g.Transform.OffsetX * ((g.DpiX / 100.0F) - 1.0F), _
                                      g.Transform.OffsetY * ((g.DpiY / 100.0F) - 1.0F))
              Else
                 Dim fx = FactorInchToUnit(PageUnit) / 100.0F - 1.0F
                 g.TranslateTransform(g.Transform.OffsetX * fx, g.Transform.OffsetY * fx)
              End If
           End If
        End If
  End Sub

  Public Function FactorInchToUnit(ByVal U As GraphicsUnit) As Single
       Select Case U
           'Case GraphicsUnit.World  'No sé que hacer...
           Case GraphicsUnit.Millimeter : Return 25.4F
           Case GraphicsUnit.Display : Return 100.0F
           Case GraphicsUnit.Document : Return 300.0F
           Case GraphicsUnit.Point : Return 72.0F
           Case GraphicsUnit.Inch : Return 1.0F
           Case Else : Throw New NotImplementedException("FactorInchToUnit Factor")
       End Select
  End Function

Обратите внимание, что во всех структурах печати используется единица измерения 1/100 дюйма (поля, границы страницы, границы поля)

1 голос
/ 02 марта 2010

Первый раз на машине или первый раз с вновь установленным драйвером печати (не переустановленный ... настройки все еще могут быть там)эта точка сети начинается с 0 в качестве настройки для HardMarginX и HardMarginY.После первой печати принтер отправляет обратно в dotNet параметры, которые он хочет использовать для этих двух значений.В этот момент все печатается правильно.

Единственное, чего нет в источнике, это какие-либо манипуляции со значением PageSettings.Margins.Вы устанавливаете их или используете значения по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...