问题标签 [print-spooler-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 在 Windows 中捕获和阻止打印请求
我想捕获打印机作业请求,检查源文档是什么,如果它来自浏览器(chrome、IE、Firefox),则拒绝打印请求。
我尝试使用Windows Spooler API
,FindFirstPrinterChangeNotification
和FindNextPrinterChangeNotification
函数,但我注意到这些 API 引发的事件是异步的。当我处理请求事件时,它会到达打印机。有没有一种方法可以捕获打印作业并仅在满足特定标准(在我的情况下为非浏览器打印请求)时才允许它到达打印机。
任何帮助,将不胜感激。
PS 我想避免开发和使用新的虚拟打印机。
python - 以编程方式阻止特定文件(.txt 扩展名)的打印请求?
我已经捕获了特定文件(.txt 扩展名)的打印事件。现在我想阻止该特定文件的打印事件请求。有没有办法以编程方式阻止特定文件(扩展名 .txt)的打印作业?我正在使用操作系统:Windows 10 并以 Python 语言实现。
c# - 如何在 C# 中确定 DM_OUT_BUFFER 的值
我正在用 C# 打印文本框的输出。为此,我使用原始打印。但是,在发送要打印的文本之前,使用WritePrinter
我想将设备结构修改为横向模式。
我可以执行第一个DocumentProperties调用,因为它返回将由pDevMode
.
但是,对DocumentProperties的第二次调用既需要一个指向设备信息块的指针,也需要一个常量DM_OUT_BUFFER
来告诉函数将设备信息写入设备信息块,由pDevMode
.
如何DM_OUT_BUFFER
从 C# 访问值?我已经阅读了很多文章,但没有遇到任何可以说明这一点的文章。
WinAPI
下面列出了大部分完整的原始打印函数,不包括不能从 C# 直接访问的函数所需的 DLL 。
这个例子工作正常,除了它发送文档纵向模式,即使打印机默认为横向模式。
c# - GETJob() Win32 Print spooler api 64bit 参数不正确,如何解决?
我试图让getJob()从 64 位的 printerspooler api 工作。
我使用以下定义(正如其他人在 SO 上使用的那样)
但这仅在我不调试并且我不在 64 位时才有效。
在 64 位中,我得到了 windows 错误:参数不正确。
我该如何解决这个问题?
我尝试将 Int32 更改为 IntPtr(64 位中 4=>8 个字节)和反向 IntPtr => Int32。无济于事。。
文档在这里:https ://docs.microsoft.com/en-us/windows/desktop/printdocs/getjob :
我还尝试将 ref 更改为 out 并将 ref/out 放入 lpJob 参数,但即使这样似乎也不起作用。
接下来我可以尝试什么?
编辑
似乎有效的是:
并按如下方式使用它:
编辑2
似乎不起作用,有时它似乎起作用,但单元测试没有注意到 csproj 文件中的变化,所以我最终仍在测试 32 位。
将以下行添加到 csproj 使其工作(它以 32 位运行,将其置于 64 位,它失败)
windows - 如果打印到 prn 文件,为什么会丢失扩展属性
如果直接打印到打印机,打印机设置对话框的所有扩展属性都将起作用,例如装订、缩放到 50% 或在文档上制作水印。它们对于打印机装订器按预期工作非常重要。
但如果我先打印到文件,然后将文件复制到打印机,HP Laserjet (PCL) 上的所有扩展属性都会丢失。
为了重现这一点,我也在 Delphi 中用一个非常简单的代码进行了模拟。在正常打印到打印机后按预期工作,我只将 DocInfo 中的 lpszOutput 更改为“...\test.prn”(不是更多!)并且已经生成了 prn 文件。然后我以二进制模式打开文件并将其写入同一台打印机(“StartDocPrinter”、“WritePrinter”、“EndDocPrinter”)。然后文档打印正确,但是扩展属性中的所有设置都丢失了,没有缩放,没有水印..
我想,打印机应该得到完全相同的二进制数据流,但是请问这可能是什么原因,显然驱动程序将不同的内容写入 prn 文件和不同的打印机?还是有一些我必须通过代码设置的标志或命令?是惠普特有的问题吗?提前致谢。
.net - 如何减小打印假脱机文件大小
我有一个大小为 13.1MB 的 pdf 文件。使用 Acrobat Reader DC 打印时,假脱机文件的大小为 105MB。但是,当我尝试使用 PdfiumViewer 以编程方式打印时,假脱机文件大小超过 500MB,最终由于打印机内存不足导致程序崩溃。
代码如下
我知道 pdf 文件需要转换为打印机可以理解的某种数据格式,并且数据的大小因应用程序而异。我的问题是,Acrobat 如何减小假脱机文件的大小?在将文件转换为打印机可以理解的数据格式之前,它是否会预处理 pdf 文件(压缩?)?
我正在尝试获取一些线索,并希望可以像 Acrobat 一样减少假脱机文件的大小。
printing - XPS Writer 完成后启动外部 .exe
我使用 XPS 驱动程序示例XPS 驱动程序示例编写了一个 XPS 驱动程序 我现在要做的是,当 XPS 驱动程序完成其工作并且文档准备好时,我需要启动一个外部程序。所以用户应该点击“print with... -> myCustomXPSDriver...”,在 xps 文档准备好之后,一个程序应该启动。我的问题是,我无法获取工作状态,并且不知道如何在不查看目录的情况下获取文档准备好的信息。我需要 Windows 10 的驱动程序,所以我不能使用端口监视器。任何示例和/或想法是正确的方法吗?
- 打印机扩展?- 通用 Windows 应用程序?-双向扩展?
非常感谢您的时间和帮助!
windows - 如何在实际打印机上打印文档时另存为 PDF
我正在尝试找到一个通用解决方案,说明如何在 Windows 7/10 操作系统上的实际打印机上打印时将文档保存为 PDF。场景:无论我要打印的是图像还是文件,还是来自第三方应用程序(如 POS 或丝网打印)(如用户按下第三方应用程序上的 pint 按钮,或者如果第三方应用程序支持此热键,则按 CTRL+P),我需要将文档保存为 PDF 格式,该文档正在到达正在打印硬拷贝的实际打印机。我想推广以支持各种打印机,无论是点阵打印机还是激光打印机或热敏打印机等...
我尝试过的解决方案:
- 虚拟打印机将打印 pdf,然后将 pdf 路由到实际打印机。但是很少有打印机不支持 PDF,例如热敏打印机不支持 PDF,此外,我需要注意纸张设置和页面设置。我试过像 Win2PDF / ClawPDF 这样的虚拟打印机
- 我研究了 Windows 打印体系结构,并尝试保存假脱机文件并监听打印事件并将假脱机文件路由到虚拟打印机以创建 pdf。这部分起作用,因为某些打印机驱动程序会发出 RAW Spool 文件。PCL 和 Postscript 可以很好地转换为 PDF。
- 使用 PrintMulti 之类的打印处理器,但问题与第二个相同。
- 即使我可以从 Windows 打印创建假脱机文件的某种输入文件中得到某种输入文件,我也试图调查,但我无法得到它。
- 我尝试了打印机池,但这就像负载共享之类的东西。
谁能帮我解决这个问题。我也无法通过谷歌找到任何解决方案,所以在这里发布。实现它看起来很正常,但即使在两周后我也找不到任何解决方案。这很难实现通用解决方案吗?
c# - DocumentProperties 未使用新的 DEVMODE 结构更新打印作业
我正在尝试使用DEVMODE
在我的 C# win 表单应用程序中设置为打印机结构的新属性来更新打印作业。具体来说,要打印到的托盘。
我遇到的问题是最终调用DocumentProperties
不会更新打印机作业设置。IsDevmodeValid
我已经通过每次读取或写入结构时插入调用来检查结构是否有效,并且它返回正常。我已经尝试DEVMODE
在作业设置之前和之后设置结构。当我查看打印作业属性时,它只是不更新设置。
谁能告诉我我在这里缺少什么?仅供参考,它可以很好地打印任何文档,但打印到打印机的默认托盘。