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

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

Восстановить пароль Регистрация
 
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
30.07.2015, 12:54     Печать файла на принтере #1
Обясните пожалуста как в с++ отправить файл принтеру на печать, или киньте ссылку где можно почитать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2015, 12:54     Печать файла на принтере
Посмотрите здесь:

Печать текстового файла C++
C++ Печать на USB-принтере, открытом как файл
Печать из формы C++
Записать в файл последовательного доступа N действительных чисел.Вычислить произведение компонентов файла и вывести на печать C++
C++ Сформировать два текстовых файла из целых чисел. Записать в третий файл минимальный элемент первого файла и максимальный элемент второго файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MansMI
1047 / 844 / 205
Регистрация: 08.01.2012
Сообщений: 3,027
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
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 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
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 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
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
30.07.2015, 18:58     Печать файла на принтере #8
Если файл стандартный, то проще через ShellExecute() с print.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 19:17     Печать файла на принтере
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Геомеханик
 Аватар для Геомеханик
517 / 324 / 253
Регистрация: 26.06.2015
Сообщений: 738
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;
}
Yandex
Объявления
31.07.2015, 19:17     Печать файла на принтере
Ответ Создать тему
Опции темы

Текущее время: 07:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru