鱼C论坛

 找回密码
 立即注册
查看: 1299|回复: 11

[已解决]请教一个大文件分多次打印到打印机

[复制链接]
发表于 2021-11-27 14:07:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近这个打印大数据问题让人很头疼,文件为几个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
最佳答案
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-27 14:28:26 | 显示全部楼层
jackz007 发表于 2021-11-27 14:21
只有与 block 直接相关的打印语句才有必要进循环

高手出手果然历害,太感谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-27 14:32:44 | 显示全部楼层
cxnet 发表于 2021-11-27 14:28
高手出手果然历害,太感谢了

        如果问题已经解决,应该设置 "最佳答案"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-27 14:36:25 | 显示全部楼层
jackz007 发表于 2021-11-27 14:32
如果问题已经解决,应该设置 "最佳答案"。

已经设置好了,关于从TCP打印机端口获取数据的问题你知道吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

       没有任何意义,即便你能截取,截取到的也是已经被驱动程序规划好的的打印机指令流,对于我们这样的普通用户,不会有什么实际意义的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我是要将原驱动打印出来的数据进行修改后再打印,目前没有好的办法我只有把打印机端口设置为保存为固定文件,然后程序再读取文件进行修改打印,但这样有个问题就是打印机端口保存的文件名是固定的,如果连续打印两个文件到打印机端口,前面的文件内容就被后面的内容给复盖了,所以才想通过TCP端口来读取数据这样就可以连续打印文件不怕被复盖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

       事实上,你根本就无法读懂打印指令,怎么谈得上修改?而且,即便能修改,可是,打印必须得通过电脑吧,你无法避开驱动程序的干预,所以,你的修改未必可以凑效。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-27 15:12:05 | 显示全部楼层
        "打印端口文件" 是个什么东东?难道你的电脑不是通过网络直接驱动打印机,而是向打印服务器发打印作业?即便是发打印作业,一个作业在没有结束的时候,后面的作业会自动等待,而且,作业文件是断不可能被意外覆盖的,要不,还怎么敢叫 "电脑" 呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我是固定在数据后面增加一个尾巴而已,不用修改太多东西,我目前是可以修改的,也是没问题的,就差一个从TCP端口获取数据的方法了,呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

         既然你可以得到端口文件,十有八九,就是从 TCP 接收到的原始数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-27 15:16:11 | 显示全部楼层
          我不懂什么 TCP 抱歉!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表