Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 20.05.2021
Сообщений: 25
1

Не могу разобраться: почему при печати картинки ее файл не отпускается после процедуры печати

08.06.2021, 21:53. Показов 1313. Ответов 7
Метки нет (Все метки)

Простая задача: сгенерировать баркод консольной утилитой в графический файл и распечатать его на этикетку.
Поскольку имя файла постоянно, (можно менять но хлопотно и не нужно) повторная печать натыкается на предыдущий файл, захваченный другим процессом и все трапится.
Не понятно, как организовать процесс печати, чтобы этого не происходило.
Вот пример кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    
// по кнопке создаем Prewiew для печатаемого документа
    private void btPreview_Click(object sender, EventArgs e)
    {
        // убить старый файл баркода
        if (File.Exists("out.png"))
            File.Delete("out.png");
 
        // запускаем процесс печати в режиме  Preview
                PrintDocument pd = new PrintDocument()
        pd.PrintPage += new PrintPageEventHandler(this.printDocument1_PrintPage);
        printPreviewDialog1.Document = pd;
        printPreviewDialog1.ShowDialog();
        printPreviewDialog1.Document = null; // мои извращения - не помогают!
    } 
    //--------------------------------------------------------------------------
    
// обработчик печати образа документа
    private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {            
        // создаем баркод консольным приложением с выводом в png-файл.
        GenerateBarcode(barcode_data);
        // рисуем картинку баркода в документе печати
        e.Graphics.DrawImage(Image.FromFile("out.png"), fromLeft, fromTop);
    } // printDocument1_PrintPage
    //---------------------------------------------------------------------
 
// генерация собственно картинки баркода в отдельном процессе
    private void GenerateBarcode(string barcodeData)
    {
        if (File.Exists("out.png")) File.Delete("out.png");
        using (Process process = new Process())
        {
            process.StartInfo.FileName = "bcode.exe";
            process.StartInfo.Arguments = barcodeData;
            process.Start();
            process.Close();
        }
    } 
    //----------------------------------------------------------------------
Однократно нажимаешь кнопку - все замечательно!
На второй клик вызывается исключение при попытке удалить файл баркода "out.png". Говорит, что он занят другим процессом :-(
В приведенном примере попробовал создавать временный документ печати. Надеялся: файл будет отпущен после его выгрузки. Не помогает.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2021, 21:53
Ответы с готовыми решениями:

Почему пропадают картинки при печати?
Вывожу на печать данные таким образом: function printInventoryForm() { var container =...

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

Обрезание текста и отключение границ при печати(ошибка во время печати)
Есть несколько excel документов с заголовками и таблицей. Есть 2 проблемы, при переходе в режим...

Как при печати отчета программно установить параметры печати?
как при печати отчета ( VBA ) программно установить параметры печати ( ширину полей )

7
Строитель
867 / 538 / 190
Регистрация: 01.04.2014
Сообщений: 606
Записей в блоге: 6
08.06.2021, 23:39 2
АнаП,
C#
1
2
3
4
5
6
    private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {            
        GenerateBarcode(barcode_data);
        using(var img = Image.FromFile("out.png"))
           e.Graphics.DrawImage(img, fromLeft, fromTop);
    }
0
Администратор
Эксперт .NET
13991 / 11351 / 4596
Регистрация: 17.03.2014
Сообщений: 22,946
Записей в блоге: 1
09.06.2021, 00:59 3
Лучший ответ Сообщение было отмечено АнаП как решение

Решение

АнаП, если решение Nord790 не поможет, то попробуйте так

C#
1
2
3
4
5
6
7
8
9
10
11
    private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {            
        // создаем баркод консольным приложением с выводом в png-файл.
        GenerateBarcode(barcode_data);
        // рисуем картинку баркода в документе печати
        using (var fstream = File.OpenRead("out.png"))
        using(var img = Image.FromStream(fstream))
        {
            e.Graphics.DrawImage(img, fromLeft, fromTop);
        }
    } // printDocument1_PrintPage
1
0 / 0 / 0
Регистрация: 20.05.2021
Сообщений: 25
09.06.2021, 19:18  [ТС] 4
Коллеги, спасибо за внимание!
Я директиву using конечно использовал первым делом, и вставлял ее куда только имело смысл без успеха.
Я так понимаю, отпускание файла произойдет исключительно после закрытия всего процесса печати документа.
А предварительный просмотр - это не его завершение, почему-то.
Не хотелось, но придется генерить множество файлов с инкрементным именем, их запоминать, а потом всех чистить на закрытии приложения или, если повезет - после реальной печати документа. :-(
.
0
Администратор
Эксперт .NET
13991 / 11351 / 4596
Регистрация: 17.03.2014
Сообщений: 22,946
Записей в блоге: 1
09.06.2021, 19:37 5
АнаП, дело не в using, а в баге Image.FromFile который держит файл открытым. Мое решение с Image.FromStream должно решить вашу проблему.
0
0 / 0 / 0
Регистрация: 20.05.2021
Сообщений: 25
09.06.2021, 20:25  [ТС] 6
OwenGlendower
Спасибо за дельный совет!
Реально помогло.
Недодумался я так поступить; и файлстрим усечь и отдельным удаляемым имиджем его прихватить до отрисовки
Класс!.
0
3134 / 2226 / 1099
Регистрация: 14.08.2016
Сообщений: 7,613
09.06.2021, 21:17 7
имхо, можно было проще, 1 раз( по кнопке или при старте) загрузить изображение, и по кнопке печатать, не перечитывая заново заведомо такой же файл
0
0 / 0 / 0
Регистрация: 20.05.2021
Сообщений: 25
09.06.2021, 23:00  [ТС] 8
Сделал еще проще: нарисовал на битмапе, а не в документе, и его сохранив в файл, показал как Preview в PictureBox-e.
При этом исключение от стирания файла образа штрихкода не происходт.
А в документе при печати отрисовываю тот же битмап.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2021, 23:00

Kyocera FS-1370DN не сохранятся профиль печати при печати из под общего доступа
Добрый день уважаемые форумчане !!! в недавнем времени приобрели такой аппарат - Kyocera...

Excel при печати разбивает область печати по ячейкам
При масштабировании страницы (чтобы документ влез на одну страницу) Ексель автоматом определяет...

МФУ Canon mf4730, при печати - ошибка печати
Купили новый принтер, в связи с этим некоторый переезд принтеров произошел. Со всеми порядок, кроме...

Дублирование при печати в файл
Вот кусочек когда, записывающий в текстовый файл. <html> и др. теги <form action=forma.php...

После обновления до 8.3.15.1700 1С зависает при печати
После обновления до 8.3.15.1700 1С зависает при печати большого количества документов, обычно после...

Почему при вставке списка или печати пропадают строки в Excel
Почему при вставке списка пропадают строки в Екселе? Это очень неудобно с печатанием списков. Я бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru