Печать на бланке

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

vit.b
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 10.06.2006 (Сб) 16:29

Печать на бланке

Сообщение vit.b » 01.07.2006 (Сб) 21:53

Всем привет! Помогите написать прогу :oops: ...
Есть бланк в этот бланк необходимо вставить словечки (при помощи принтера). Как это зделать? Если есть у кого примерчик- поделитесь(буду задавать меньше вопросов)
Заранее спасибо!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.07.2006 (Вс) 3:31

Берётся ворд.
Делается копия бланка. Без текста, но с разметкой. Например, невидимыми таблицами. В местах подстановки текста организуются, например, поля (Вставка - Поле) или, например, закладки (Вставка - Закладка). Документ сохраняется.
(На случай непоняток: ручками делается, да.)

Потом документ открывается и заполняется. Путём перебора коллекции, например, полей или, например, закладок (соответственно). (Программно, да).


Примечание.
Всё вышеизложенное относится к ситуации "Делать мне нечего, поэтому пойду страдать фигнёй". Для всех иных ситуаций рекомендуется заценить пункт меню Сервис - Слияние.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vit.b
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 10.06.2006 (Сб) 16:29

Сообщение vit.b » 12.07.2006 (Ср) 20:11

GSerg
Можно попросить тебя расказать подробней?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.07.2006 (Ср) 22:21

Закрываешь VB .NET.
Удаляешь его.
Запускаешь Word.
Сервис - Слияние. F1 по вкусу.
Достаточно подробно? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 27.04.2007 (Пт) 13:43

А как сделать всё тоже, но в том случае, если на компе не установлен пакет Office?

Дело осложнятеся тем, что печать должна быть "качественная" (штрих-коды печатаются на бланке). А вывод формы через Me.CreateGraphics() даёт попиксельное изображение не очень хорошего качества - сканет подобные штрих-коды не берёт.

ЗЫ. Мне хотя идею как делать вывод на печать без Office.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.04.2007 (Пт) 14:02

И какой код дает изображение не высокого качества?
Весь мир матрица, а мы в нем потоки байтов!

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 27.04.2007 (Пт) 15:30

!Viper!
GSerg
злые вы

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 27.04.2007 (Пт) 15:57

!Viper! писал(а):И какой код дает изображение не высокого качества?

Код: Выделить всё
    Private m_memoryImage As Bitmap
.........
    Private Sub CaptureScreen()
        Dim mygraphics As Graphics = Me.CreateGraphics()
        Dim s As Size = Me.Size
        m_memoryImage = New Bitmap(s.Width, s.Height, mygraphics)
        Dim memoryGraphics As Graphics = Graphics.FromImage(m_memoryImage)
        memoryGraphics.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, s)
    End Sub
.........
    Private Sub PrintDocumentfrmMain_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles _
       PrintDocumentfrmMain.PrintPage
        e.Graphics.DrawImage(m_memoryImage, 0, 0)
    End Sub


Откуда-то я это стырил :oops:

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 27.04.2007 (Пт) 23:49

Если все бланки одинаковые (постоянное значение полей отступа), то можно так:

Код: Выделить всё
    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim G As Graphics = e.Graphics
        G.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
        G.PageUnit = GraphicsUnit.Millimeter

        'печать строки из текстового поля со смещением:
        ' слева  - 100 мм
        ' сверху - 150 мм
        G.DrawString(TextBox1.Text, Me.Font, Brushes.Black, 100, 150)
        e.HasMorePages = False

    End Sub

только придется с линейкой по листу побегать :)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 03.05.2007 (Чт) 15:44

Всё равно какая-то фигня получается :( Перчатается на принтере явно с разрешением 96 точек на дюйм. В итоге тот штрих-кода, который на листе пропечатывается, сканер считать не может.

Такой вопрос: вот у меня есть форма. На ней текстовые боксы с штрих-кодами. Как мне её вывести на печать с хорошим качеством (не экранным)? Может под неё дублирующую завести, размеров в три раза большим - специально для вывода на печать?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.05.2007 (Чт) 16:50

откуда ты берешь это штрих-коды? Готовые картинки? Сам рисуешь (как рисуешь)? и.т.д
Вытягивать из тебя по одному слову совсем неохота.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 03.05.2007 (Чт) 17:46

Nord777 писал(а):откуда ты берешь это штрих-коды? Готовые картинки? Сам рисуешь (как рисуешь)? и.т.д
Вытягивать из тебя по одному слову совсем неохота.
Шрифт barcode.ttf использую в текстовой ячейке.

Да и не суть - проблема-то в том, что форма печатается на принтере с 96dpi, а надо с 300 как минимум.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.05.2007 (Чт) 20:16

почувствуй разницу
Код: Выделить всё
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        MsgBox(e.Graphics.DpiX)
    End Sub

Код: Выделить всё
    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        MsgBox(e.Graphics.DpiX)
    End Sub
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 03.05.2007 (Чт) 20:35

Давайте я ещё раз попытаюсь задачу сформулировать. Коды приводить довольно бессмысленно в мойм случае - их нет ещё :)

Итак: есть у меня программа на VBA (в Excel). "АРМ Продавца" называется. Занимается программа тем, что принимает различные алфавитно-цифровые данные с клавиатуры и от штрих-сканера (он в разрыв клавиатуры включен). Обрабатывает их и выдаёт на экран данные о товарах и покупателях. В определенный момент (собственно завершение процесса отбора товаров и пробитие чека) программа выбрасывает на обычный лазерный принтер, разрешающая способность которого составляет 600dpi, накладную. Накладная уходит операционисту бухгалтерии, который на своём рабочем месте при помощи клавиатуры и точно такого же сканера, считывает данные с накладной и разносит покупку в бухгалтерской программе. Соответственно, как можно понять, на накладной распечатаны штрих-коды товаров (ячейки некоторые отформатированы под шрифт barcode.ttf). Мелко всё получается, но т.к. печать качественная, то всё прекрасно читается сканером.

Далее... Настал момент, когда всю эту байду решено перевести под .NET. Пишется всё на VB. И более не использовать для работы пакет Office (лавры Поносова стремают слегка). Так вот проблема на данном этапе: если ранее бланки накладных представляли из себя листочек в Excel, поля в котором забивались программно и потом сформированная накладная выбрасывалась на печать, то теперь мне пока совершенно не понятно как организовать это дело под .NET. Пытаюсь в качестве бланка использовать стандартную windows.forms.form, но сталкиваюсь с тем, что при выводе её на печать получается очень не качественная и штрих-коды не читаются сканером. Разрешение, похоже, составляет всего 96dpi.

Вот что в такой ситуации можно предпринять? Может сделать форму огромных размеров (600dpi/96dpi = 6.25 раз) и при выводе её на печать сжимать всё по условию "разместить всё на одной странице"? Или что? Или как?

Мне бы только намёк какой или носом ткнуть. Коды писать за меня конечно не надо. Типа пошлите меня куда-нибудь :)

Вот тут уже всё прочел. Но .NET для меня штука новая и разобраться не смог пока.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.05.2007 (Чт) 20:41

asharky, вот я не печатал из vb.net. и тем не менее я могу нажать F2 и очень быстро увидеть, что у объекта PrintDocument есть свойство PrinterSettings, а в них - PrinterResolution. Которую, очевидно, надо настроить перед печатью.
Почему так не делаешь ты?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 03.05.2007 (Чт) 21:06

GSerg писал(а):asharky, вот я не печатал из vb.net. и тем не менее я могу нажать F2 и очень быстро увидеть, что у объекта PrintDocument есть свойство PrinterSettings, а в них - PrinterResolution. Которую, очевидно, надо настроить перед печатью.
Почему так не делаешь ты?
Так PrinterResolution у меня это ReadOnly Property. Настроить рад бы, но как?
Вложения
PrinterResolutions.jpg
PrinterResolutions.jpg (39.01 Кб) Просмотров: 8097

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.05.2007 (Чт) 21:23

asharky, ну а прочитать подробные описания каждого свойства и подумать?
Сам же скриншот привёл с описанием?
Береёшь одно из значений этой коллекции и используешь в printddocument.defaultpagetsettings.printerresolution...

Простые английские слова... Из которых видна суть методов.

И пример для кого-то писали, неясно для кого.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.05.2007 (Чт) 21:44

Если честно то я уже устал, поэтому задаю вопрос последний раз.
Каким образом ты печатаешь форму на принтере? Приведи кусок или строку кода для того, чтобы тебя смогли тыкнуть носом в твою ошибку.
Хотя ответ тебе уже был дан.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 03.05.2007 (Чт) 22:13

Ответ, вероятно, дан, но в очень не явном виде. Для меня :)

Ладно. Я беру тайм-аут - постараюсь разобраться во всём том, что выше написано. Отчитаюсь позже.

Спасибо всем.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.05.2007 (Чт) 23:36

если ты по прежнему используешь эту строку:
Код: Выделить всё
e.Graphics.DrawImage(m_memoryImage, 0, 0)

то это неправильно. Твой битмэп имеет разрешение 96dpi.
Не надо сохранять снимок формы в битмэпе, печатай свой штрих-код в обработчике PrintPage обычным путем:
Код: Выделить всё
        Dim ШтрихКод As String = TextBox1.Text
        Dim Fnt As New Font("barcode font", 50)

        'печать злого штрих-кода
        e.Graphics.DrawString(ШтрихКод, Fnt, Brushes.Black, 100, 150)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 03.05.2007 (Чт) 23:58

Nord777 писал(а):если ты по прежнему используешь эту строку:
Код: Выделить всё
e.Graphics.DrawImage(m_memoryImage, 0, 0)

то это неправильно. Твой битмэп имеет разрешение 96dpi.
Не надо сохранять снимок формы в битмэпе, печатай свой штрих-код в обработчике PrintPage обычным путем:
Код: Выделить всё
        Dim ШтрихКод As String = TextBox1.Text
        Dim Fnt As New Font("barcode font", 50)

        'печать злого штрих-кода
        e.Graphics.DrawString(ШтрихКод, Fnt, Brushes.Black, 100, 150)
Я уже проверил: принтер действительно печатает с dpi = 300 или 600 - это уж как я выставлю его настройки. А форма рендерится с dpi = 96.

Но! Мне не подходит e.Graphics.DrawString, потому как мне надо на печать отправлять не только одно поле TextBox, а именно всю форму, на которой и TextBox имеются различные, в том числе несколько и со штрих-кодами.

Как мне отрендерить всю форму с dpi = 300 хотя бы? А то если она рендерится с dpi=96, а потом печатается с dpi=300 (600), то это апроксимация графики получается и штрих-код "мутный" (не читается сканером).

Хотя подозреваю, что это не возможно. Если шрифты True Type ещё можно рендерить как угодно, потому что это шрифты :) , то форму, изначально предназначающуюся для вывода исключительно на экран, с dpi=96, отрендерить с бОльшим разрешением не возможно в принципе :(


Что скажите, аксакалы? Решаема эта задача каким-либо красивым способом в рамках .NET, _без_ использования Office :?:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.05.2007 (Пт) 7:14

Перебрать контролы в цикле можно? Можно...
Посмотреть координаты каждого можно? Можно...
Посмотреть текст каждого можно? Можно...
Напечатать этот текст по этим координатам на принтере можно? Можно...
Что не получается тогда?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 04.05.2007 (Пт) 9:31

GSerg писал(а):Перебрать контролы в цикле можно? Можно...
Посмотреть координаты каждого можно? Можно...
Посмотреть текст каждого можно? Можно...
Напечатать этот текст по этим координатам на принтере можно? Можно...
Что не получается тогда?..
Ну во-первых: это не красиво. А во-вторых: на форме имеются не только текстовые контролы (TextBox), но и прочие. А "прочие" как будут рендериться с разрешением 300...6000 dpi? Сомневаюсь.... e.Graphics.DrawString применим только к шрифтовым контролам, не так-ли?

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

Ну и, как в начале упоминалось, подключив Excell или пакета Office всё сразу же решается. но это ещё $300 на одно рабочее место - не лицензированный Office ставить нельзя.

Вопрос, на данный момент, свёлся к одному: возможно-ли объекты для вывода на экран рендерить с dpi = 300...600 :?:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.05.2007 (Пт) 9:39

Excel Viewer 2003 бесплатный и позволяет печатать.
Пакет совместимости, позволяющий этим вьюером открывать файлы 2007 офиса, тоже бесплатный.
Формат файлов офиса 2007 - открытый, основанный на XML. Файлы можно генерить самому (установив FW 3.0, там средства работы с такими пакетными файлами).

Можешь пойти этим путём...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 04.05.2007 (Пт) 9:59

GSerg писал(а):Excel Viewer 2003 бесплатный и позволяет печатать.
Пакет совместимости, позволяющий этим вьюером открывать файлы 2007 офиса, тоже бесплатный.
Формат файлов офиса 2007 - открытый, основанный на XML. Файлы можно генерить самому (установив FW 3.0, там средства работы с такими пакетными файлами).

Можешь пойти этим путём...
Viewer не позволит в свои таблицы что-то там добавлять - только смотреть. А в XML формировать - ну тоже "не красиво" - сложное решение. В общем: проще свой контрол написать и в качестве dll подключать :)

А ещё проще не пожалеть $300 на Office и этим ограничиться. Тогда мне вообще из VBA ничего и переделывать не надо будет :) :) :)

Так кто-то может ответить на вопрос заданный выше? Мне, опять же, не надо кодов - только концептуально. Может объекты BitMap позволяют dpi задавать при рендеринге? Или ещё что-то подобное имеется?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.05.2007 (Пт) 10:06

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

Нет, растровая графика не тянется.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 04.05.2007 (Пт) 11:35

GSerg писал(а):Ты один раз создаёшь XSL-шаблон своего отчёта.
После этого ты каждый раз генерируешь маленький файл, содержащий только данные, и тебе автоматически всё будет подставлено.
Спасибо большое. Почитаю доки, попробую что-то выжать из подобного подхода.

GSerg писал(а):Нет, растровая графика не тянется.
Вот так :( А Гениальный Билли опять всех нагнул: "Разные задачи - разные инструменты", однако... Преклоняюсь перед ним ;)

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 04.05.2007 (Пт) 14:08

А во-вторых: на форме имеются не только текстовые контролы (TextBox), но и прочие. А "прочие" как будут рендериться с разрешением 300...6000 dpi? Сомневаюсь.... e.Graphics.DrawString применим только к шрифтовым контролам, не так-ли?


Напечатать можно практически все контролы.
По твоей просьбе код не привожу.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 04.05.2007 (Пт) 14:48

Nord777 писал(а):Напечатать можно практически все контролы.
По твоей просьбе код не привожу.
Напечатать - понятно. отрендерить с хорошим качеством - как?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 04.05.2007 (Пт) 14:58

А напечатать и отрендерить чем отличается? Как это ты понимаешь?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList  
cron