cxnet 发表于 2021-11-27 14:07:12

请教一个大文件分多次打印到打印机

最近这个打印大数据问题让人很头疼,文件为几个G的打印机数据文件,如果一次性读取写入打印机,内存就会溢出,我分成8MB左右的大小进行读取和打印,读取操作都是正常的,但就是打印到打印机后就变成若干个8mb左右的文件,正常打印到打印机的大小应该是和原文件大小差不多的数据,求高手指点一下。

另外,咱们python有没有办法直接从TCP端口获取打印机数据的功能呢?比如我的打印机驱动端口是TCP的,IP为127.0.0.1,而端口号可以随意取,在易语言里有从服务器取回数据的功能,我在百度查找了很久,只有TCP客户端和服务端之间传送文件,而不能直接从打印机驱动的TCP端口取回数据,有知道的也麻烦指点一下,谢谢

下面是我写的代码

import os
import win32print

with open(r'd:\big_data.spl', 'rb') as f:
    while True:
      block = f.read(1024*8000)
      if len(block)!=0:
            printer_name=win32print.GetDefaultPrinter ()   
            hPrinter = win32print.OpenPrinter (printer_name)
            hJob = win32print.StartDocPrinter (hPrinter, 1, ('Print test', None, "RAW"))
            win32print.StartPagePrinter (hPrinter)
            win32print.WritePrinter (hPrinter, block)            
      else:
            win32print.EndPagePrinter (hPrinter)
            win32print.ClosePrinter (hPrinter)            
            break

jackz007 发表于 2021-11-27 14:21:14

本帖最后由 jackz007 于 2021-11-27 14:22 编辑

      只有与 block 直接相关的打印语句才有必要进循环
import os
import win32print

printer_name=win32print.GetDefaultPrinter ()   
hPrinter = win32print.OpenPrinter (printer_name)
hJob = win32print.StartDocPrinter (hPrinter, 1, ('Print test', None, "RAW"))
win32print.StartPagePrinter (hPrinter)

with open(r'd:\big_data.spl', 'rb') as f:
    while True:
      block = f.read(1024*8000)
      if len(block)!=0:
            win32print.WritePrinter (hPrinter, block)
      else:
            win32print.EndPagePrinter (hPrinter)
            win32print.ClosePrinter (hPrinter)
            break

cxnet 发表于 2021-11-27 14:28:26

jackz007 发表于 2021-11-27 14:21
只有与 block 直接相关的打印语句才有必要进循环

高手出手果然历害,太感谢了{:5_110:}

jackz007 发表于 2021-11-27 14:32:44

cxnet 发表于 2021-11-27 14:28
高手出手果然历害,太感谢了

      如果问题已经解决,应该设置 "最佳答案"。

cxnet 发表于 2021-11-27 14:36:25

jackz007 发表于 2021-11-27 14:32
如果问题已经解决,应该设置 "最佳答案"。

已经设置好了,关于从TCP打印机端口获取数据的问题你知道吗?

jackz007 发表于 2021-11-27 14:45:16

cxnet 发表于 2021-11-27 14:36
已经设置好了,关于从TCP打印机端口获取数据的问题你知道吗?

       没有任何意义,即便你能截取,截取到的也是已经被驱动程序规划好的的打印机指令流,对于我们这样的普通用户,不会有什么实际意义的。

cxnet 发表于 2021-11-27 14:52:18

jackz007 发表于 2021-11-27 14:45
没有任何意义,即便你能截取,截取到的也是已经被驱动程序规划好的的打印机指令流,对于我们这样 ...

我是要将原驱动打印出来的数据进行修改后再打印,目前没有好的办法我只有把打印机端口设置为保存为固定文件,然后程序再读取文件进行修改打印,但这样有个问题就是打印机端口保存的文件名是固定的,如果连续打印两个文件到打印机端口,前面的文件内容就被后面的内容给复盖了,所以才想通过TCP端口来读取数据这样就可以连续打印文件不怕被复盖

jackz007 发表于 2021-11-27 15:06:46

cxnet 发表于 2021-11-27 14:52
我是要将原驱动打印出来的数据进行修改后再打印,目前没有好的办法我只有把打印机端口设置为保存为固定文 ...

       事实上,你根本就无法读懂打印指令,怎么谈得上修改?而且,即便能修改,可是,打印必须得通过电脑吧,你无法避开驱动程序的干预,所以,你的修改未必可以凑效。

jackz007 发表于 2021-11-27 15:12:05

      "打印端口文件" 是个什么东东?难道你的电脑不是通过网络直接驱动打印机,而是向打印服务器发打印作业?即便是发打印作业,一个作业在没有结束的时候,后面的作业会自动等待,而且,作业文件是断不可能被意外覆盖的,要不,还怎么敢叫 "电脑" 呢?

cxnet 发表于 2021-11-27 15:13:07

jackz007 发表于 2021-11-27 15:06
事实上,你根本就无法读懂打印指令,怎么谈得上修改?而且,即便能修改,可是,打印必须得通过电 ...

我是固定在数据后面增加一个尾巴而已,不用修改太多东西,我目前是可以修改的,也是没问题的,就差一个从TCP端口获取数据的方法了,呵呵

jackz007 发表于 2021-11-27 15:14:59

cxnet 发表于 2021-11-27 15:13
我是固定在数据后面增加一个尾巴而已,不用修改太多东西,我目前是可以修改的,也是没问题的,就差一个从 ...

         既然你可以得到端口文件,十有八九,就是从 TCP 接收到的原始数据。

jackz007 发表于 2021-11-27 15:16:11

          我不懂什么 TCP 抱歉!
页: [1]
查看完整版本: 请教一个大文件分多次打印到打印机