Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
#1

Печать файла на принтере - C++

30.07.2015, 12:54. Просмотров 544. Ответов 8
Метки нет (Все метки)

Обясните пожалуста как в с++ отправить файл принтеру на печать, или киньте ссылку где можно почитать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2015, 12:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Печать файла на принтере (C++):

Печать на USB-принтере, открытом как файл - C++
В MSDN есть классный способ печати: #include <stdio.h> main() { FILE *stream; stream = fopen('PRN', 'w');...

Печать текстового файла - C++
Всем привет! Нужно написать программу, которая выводит на печать файл file.txt Каким образом в С++ можно это сделать? Добавлено...

Печать текстового файла - C++
Пытаюсь распечатать текстовый файл. Использую шаги и функции как написано в MSDN: To begin a print job, call StartDocPrinter. To...

Описать функцию PoslSu(t), которая выводит на печать последнюю строку непустого текстового файла - C++
Описать функцию PoslSu(t), которая выводит на печать последнюю строку непустого текстового файла t (t-файловая переменная). Каким образом...

Записать в файл последовательного доступа N действительных чисел.Вычислить произведение компонентов файла и вывести на печать - C++
Записать в файл последовательного доступа N действительных чисел.Вычислить произведение компонентов файла и вывести на печать

Что такое "эхо печать"? И как через такую печать сделать калькулятор? - C++
Само задание такое: Создать программу-калькулятор, обеспечивающую ввод с клавиатуры в режиме эхо-печати только цифр, а также...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MansMI
1165 / 957 / 250
Регистрация: 08.01.2012
Сообщений: 3,503
30.07.2015, 12:57 #2
когда-то так было: fprintf(stdprn,"...",,,,);
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
30.07.2015, 16:32  [ТС] #3
на Stack Overflow был похожий вопрос на него ответили так - Функция fprintf не нужна. В C++ для записи в потоки (не только ofstream, а всех унаследованных от ostream классов) используется оператор <<. Меня интересует как етот файл отправить на печать принтера. В книге Лафоре есть пример но не работает ( сразу пишет - Формат команды: oprint имя_файла . )

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
#include <fstream> // для файловых функций
#include <iostream>
using namespace std;
#include <process.h> // для exit()
int main(int argc, char* argv[] )
{
 if(argc != 2)
 {
 cerr << "\nФормат команды: oprint имя_файла\n";
 exit(-1);
 }
 char ch;  // символ для считывания
 ifstream infile;  // создать входной файл
 infile. open(argv[1] ) ;   // открыть файл
 if(! infile) // проверить на наличие ошибок
 {
 cerr << "\nНевозможно открыть " << argv[1] << endl;
 exit(-1);
 }
 ofstream outfile;  // Создать файл
 outfile. open("PRN");  // открыть доступ принтера к нему
 while(infile. get(ch) != 0) // считать символ
 outfile. put(ch) ;  // отправить символ на печать
 outfile. put('\x0C' );  // прогон страницы
 return 0;
}
Потом нашол в гугле что можно так
C++
1
system("print text.txt");
но пишет - не удается инициализировать устройство prn .
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 16:58 #4
PRN - устройство ОС DOS. Полагаю что эта программа не для Windows.
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
30.07.2015, 17:02  [ТС] #5
странно вроде Лафоре под вин вся книга но ладно , а можете обяснить как запустить подобное из под виндовс .
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
30.07.2015, 17:15 #6
Объяснить не могу, т.к. никогда не пользовался, но могу дать наводку: 1, 2.
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
30.07.2015, 17:21  [ТС] #7
спасиб
nmcf
5310 / 4630 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
30.07.2015, 18:58 #8
Если файл стандартный, то проще через ShellExecute() с print.
Геомеханик
620 / 427 / 310
Регистрация: 26.06.2015
Сообщений: 964
31.07.2015, 19:17 #9
Вот набросал печать текущим принтером при помощи GDI.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#include <windows.h>
#include <string>
#include <stdio.h>
#ifdef _MSC_VER
#pragma comment(lib, "winspool.lib")
#endif
static DWORD readfile(const TCHAR* filename, std::string& str);
static TCHAR* get_filename(TCHAR* d, const TCHAR* f);
 
//печать текстового файла текущим принтером
BOOL file_print(const TCHAR* filename, const TCHAR* fontname = TEXT("Lucida Console"), 
                int fsize = 9, DWORD charset = RUSSIAN_CHARSET){
    DWORD       err;
    std::string str;
    if((err = readfile(filename, str)) != ERROR_SUCCESS){
        SetLastError(err);
        return FALSE;
    }
 
    TCHAR pname[128];
//вдруг используется раритет
#if defined(_MSC_VER) && (_MSC_VER <= 1200)
    DWORD flags = PRINTER_ENUM_DEFAULT | PRINTER_ENUM_NAME;
    DWORD  size = 0, num = 0;
 
    EnumPrinters(flags, NULL, 2, NULL, 0, &size, &num);
    if(! size)
        return FALSE;
 
    BYTE* pbuf = (BYTE*)HeapAlloc(GetProcessHeap(), 0, size);
    if(pbuf == NULL)
        return FALSE;
 
    if(! EnumPrinters(flags, NULL, 2, pbuf, size, &size, &num) || (! num)){
        err = GetLastError();
        HeapFree(GetProcessHeap(), 0, pbuf);
        SetLastError(err);
        return FALSE;
    }
    lstrcpy(pname, ((LPPRINTER_INFO_2)pbuf)->pPrinterName);
    HeapFree(GetProcessHeap(), 0, pbuf);
#else
    DWORD size = sizeof(pname) / sizeof(pname[0]);
    if(! GetDefaultPrinter(pname, &size))             
        return FALSE;
#endif
 
    HDC pdc = CreateDC(NULL, pname, NULL, NULL);
    if(pdc == NULL)                 
        return FALSE;
 
    int   fch  = -MulDiv(fsize, GetDeviceCaps(pdc, LOGPIXELSY), 72);      
    HFONT font = CreateFont(fch, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, charset, 
                            OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, 
                            DEFAULT_PITCH, fontname); 
    if(font != NULL)
        SelectObject(pdc, font);
 
    INT arr[256];
    if(! GetCharWidth32A(pdc, 0, sizeof(arr)/sizeof(arr[0]) - 1, arr)){
        err = GetLastError();
        DeleteDC(pdc);
        DeleteObject(font);
        SetLastError(err);
        return FALSE;
    }
 
    TEXTMETRICA ftm = {0};
    if(! GetTextMetricsA(pdc, &ftm)){
        err = GetLastError();
        DeleteDC(pdc);
        DeleteObject(font);
        SetLastError(err);
        return FALSE;
    }
        
    INT left   = GetDeviceCaps(pdc, PHYSICALOFFSETX);
    INT top    = GetDeviceCaps(pdc, PHYSICALOFFSETY);        
    INT width  = GetDeviceCaps(pdc, HORZRES);  
    INT height = GetDeviceCaps(pdc, VERTRES);
    INT  marx  = width  * 5 / 100;
    INT  mary  = height * 3 / 100;
 
    left   += marx;
    top    += mary;
    width  -= marx;
    height -= mary;
        
    const UCHAR* t, *pa, *pb, *p = (const UCHAR*)str.c_str();
    INT px, py;
 
    DOCINFO doc = {0};
    doc.cbSize       = sizeof(doc);
    doc.lpszDocName  = get_filename(pname, filename);
    doc.lpszDatatype = TEXT("EMF");
 
    if(StartDoc(pdc, &doc) < 0){
        err = GetLastError();
        DeleteDC(pdc);
        DeleteObject(font); 
        SetLastError(err);              
        return FALSE;
    }
 
    py = height;
    while(*p){
        if(py >= height){
            if(StartPage(pdc) < 0)
                goto error;
            py = top;
        }
 
        pa = p;
        px = left;
        while(*p && (*p != '\n') && (px < width))
            px += arr[*p++];
        pb = p;
 
        if(px >= width){
            for(t = --pb; pb > pa; --pb){
                px -= arr[*pb];
                if((px < width) && (*pb == ' '))
                    break;
            }
            if(pb <= pa)
                pb = t;
        }
 
        if(pa < pb)
            TextOutA(pdc, left, py, (LPCSTR)pa, (int)(INT_PTR)(pb - pa));
 
        py += ftm.tmHeight;
        p   = (*pb == '\n') ? pb + 1 : pb;
        p   = (*p == ' ' && *(p + 1) != ' ') ? p + 1 : p;
                
        if((py >= height) || (! *p)){                  
            if(EndPage(pdc) < 0)
                goto error;        
        }
    }
    EndDoc(pdc);
    DeleteDC(pdc);
    if(font != NULL)
        DeleteObject(font);        
    return TRUE;
error:
    err = GetLastError();
    AbortDoc(pdc);
    DeleteDC(pdc);
    if(font != NULL)
        DeleteObject(font); 
    SetLastError(err);
    return FALSE;
}
 
 
int main(void) {
    TCHAR fn[] = TEXT("file.txt");
    if(file_print(fn))
        puts("print textfile.");
    else
        fprintf(stderr, "code error: %lu\n", GetLastError());
    getchar();
    return 0;
}
 
 
//чтение текстового файла в строку
static DWORD readfile(const TCHAR* filename, std::string& str){
    HANDLE fp = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, 
                           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(fp == INVALID_HANDLE_VALUE)
        return GetLastError();
 
    char  buf[512];
    DWORD num;
    BOOL  ret;
    for(str = ""; ; ){
        num = 0;
        ret = ReadFile(fp, buf, sizeof(buf)-1, &num, NULL);
        if(ret && (num == 0))
            break;
        else if(! ret)
            goto error;
 
        buf[num] = '\0';
        for(char* p = &buf[0]; *p; ++p){
            if(*p == '\t')
                str.append("        ");
            else if(*p == '\r')
                continue;
            else
                str += *p;
        }
    }
    CloseHandle(fp);
    return ERROR_SUCCESS;
error:
    DWORD err = GetLastError();
    CloseHandle(fp);
    return err;
}
 
//получение имени файла из пути
static TCHAR* get_filename(TCHAR* d, const TCHAR* f){
    const TCHAR* p;
    TCHAR* t = d;
    for(p = NULL; *f; ++f){
        if(*f == TEXT('\\'))
            p = f;
    }
    if(p != NULL){
        while(*p && (*p != TEXT('.')))
            *d++ = *p++;
        *d = TEXT('\0');
    } else
        lstrcpy(d, TEXT("textfile"));
    return t;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 19:17
Привет! Вот еще темы с ответами:

Простая печать одностраничного текстового файла на принтере - C#
Нужно напечатать в одном случае при открытии формы, а в другом при нажатии кнопки одностраничный текстовый файл, шрифт по умолчанию....

приложение,позволяющее организовать печать графического файла на принтере - Java SE
пишет начинающий) выручайте,передо мной вот такая вот проблема: Реализуйте программное приложение, позволяющее организовать печать...

Печать на принтере - JavaScript
Здравствуйте, передо мной стоит задача сделать кнопку, которая будет печатать через принтер текст, который формируется и выводится на...

Печать на принтере - C++ Qt
Добрый вечер! нужно распечатать странички такого плана: вверху будет текст, потом график(нарисованный при помощи qwt), и ниже...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.07.2015, 19:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru