我想将给定Windows打印作业的假脱机数据复制到磁盘上的任意位置.
我有Print Spooler API的打印作业的作业ID .我知道这个工作已经完成了假脱机.我知道在我有时间完成我需要做的任何工作之前,工作不会被删除.
如果禁用文件池,我可以通过在假脱机目录中查找格式为"xxxxx.spl"的文件来执行此操作,其中xxxxx是0填充的作业ID.
如果启用了文件池,我该怎么做?
如果有一个方法获取了作业ID并返回了一个假脱机数据流,我会很高兴,但这似乎不太可能.假设使用OpenPrinter
"PrinterName,Job xxxx"和ReadPrinter 可能会有类似的东西,如此处所述,但到目前为止我还没有能够使它工作,即使我这样做,看起来它将数据加载到内存中,我不确定这对大型假脱机文件有何影响(> 1 GB并不罕见).
我的第二个偏好是传递ID并使用磁盘上的假脱机数据取回文件的位置(无论文件池设置如何).
我的第三个偏好是将池文件("FPyyyyy.spl")映射到它的作业ID.
这些都是可行的,还是有人对如何解决这个问题有更好的了解?
(编辑补充,因为它是不明确的,我们都知道这个选项):我们的底牌是要求我们的客户通过编辑每台打印机的设置注册表禁用后台打印文件池,但我们更希望避免这种情况.
为了满足我的软件的需要,我需要创建一个打印机驱动程序,它允许我将发送给它的所有图像保存到文件中,然后打开我的程序窗口,让用户对渲染的页面执行某些操作。
我找到了这篇文章,但示例使用了该FILE:
端口,而我需要制作自己的端口,将图像转储到文件并运行可执行文件。但是,我认为我可以通过在驱动程序代码中执行此操作来完成我的任务,但我不确定这是一个好的决定,因为它是一个驱动程序,即使它是一个用户模式驱动程序。
我很高兴听到有关我的问题的任何建议。提前致谢。
如何根据打印的作业ID获取进行打印的用户的域名?
我可以从例如通过GetJob检索的JOB_INFO_2获取用户名,但JOB_INFO_#结构中没有一个包含用户的域名.
我可以使用打印服务器的域名IPGlobalProperties.GetIPGlobalProperties().DomainName
,但这可能与用户的域名不同,因此它不是一个可靠的解决方案.
我正在开发一个Windows窗体应用程序,我想在其中打印自定义文档.此自定义文档具有自定义大小,我必须使用C#代码设置默认的打印页面大小.
我做了一些谷歌搜索并遇到了PrintSpoolerAPI
.我找到的代码将使用AddForm()
方法将自定义表单/页面添加到可用页面列表以进行打印.我还想将这个新添加的页面设置为默认打印页面.
我试着在代码中写这一行
bool x = SetForm(hPrinter, paperName, 1, ref formInfo);
Run Code Online (Sandbox Code Playgroud)
它返回一个true
值但不设置默认打印页面.
dmPaperSize
在这方面有任何作用吗?
这是完整的代码:
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Security;
using System.ComponentModel;
using System.Drawing.Printing;
namespace WindowsFormsApplication1
{
public class CustomPrintForm
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
internal struct structPrinterDefaults
{
[MarshalAs(UnmanagedType.LPTStr)]
public String pDatatype;
public IntPtr pDevMode;
[MarshalAs(UnmanagedType.I4)]
public int DesiredAccess;
};
[DllImport("winspool.Drv", EntryPoint = "OpenPrinter", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall),
SuppressUnmanagedCodeSecurityAttribute()]
internal static …
Run Code Online (Sandbox Code Playgroud) 我从托管代码(C#)调用Win32函数EnumJobs(http://msdn.microsoft.com/en-us/library/windows/desktop/dd162625 (v=vs.85 ) .aspx ).
[DllImport("Winspool.drv", SetLastError = true, EntryPoint = "EnumJobsA")]
public static extern bool EnumJobs(
IntPtr hPrinter, // handle to printer object
UInt32 FirstJob, // index of first job
UInt32 NoJobs, // number of jobs to enumerate
UInt32 Level, // information level
IntPtr pJob, // job information buffer
UInt32 cbBuf, // size of job information buffer
out UInt32 pcbNeeded, // bytes received or required
out UInt32 pcReturned // number of jobs received
);
EnumJobs(_printerHandle, 0, 99, 1, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为网站设置一种打印服务,以便与(pdf,html,excel)进行通信并发送可打印的文档.我决定去.
我在下面创建了简单的程序.在某些电脑上,它可以在其他电脑上工作(Windows 7)(Windows 8)它不起作用(右).当它不起作用时,作业在打印队列中可见不到一秒钟然后消失.代码不输出任何错误.我在Windows事件日志中找不到任何内容.
我也在c ++中尝试了一个RawPrinter示例,我可以在网上找到但是显示了相同的行为.
有谁知道我做错了什么?:(
package main
import (
"fmt"
"code.google.com/p/brainman/printer"
)
func main() {
defaultPrinterName, _ := printer.Default()
fmt.Println(defaultPrinterName)
p, err := printer.Open(defaultPrinterName)
if err != nil {
fmt.Println("Open failed: %v", err)
}
defer p.Close()
err = p.StartDocument("my document", "RAW")
if err != nil {
fmt.Println("StartDocument failed: %v", err)
}
defer p.EndDocument()
err = p.StartPage()
if err != nil {
fmt.Println("StartPage failed: %v", err)
}
str := "testing 123"
mySlice := []byte(str)
_, err = p.Write(mySlice)
if …
Run Code Online (Sandbox Code Playgroud) 是否可以使用 windows Spooler API 打印 PDF 文件。我试过下面的代码,但它不起作用......
int print_handle = 0;
OpenPrinter(pPrinterName, &print_handle, NULL);
if (print_handle == 0)
{
return 0;
}
docinfo1.pDocName = (LPTSTR)("My PDF");
docinfo1.pOutputFile = NULL;
docinfo1.pDatatype = (LPTSTR)("RAW");
temp = StartDocPrinter(print_handle, 1, &docinfo1);
temp = StartPagePrinter(print_handle);
temp = WritePrinter(print_handle, (LPBYTE)filebuff, filelen, &bytes_written);
EndPagePrinter(print_handle);
EndDocPrinter(print_handle);
Run Code Online (Sandbox Code Playgroud)
WritePrinter 函数返回 SUCCESS 并且没有打印任何内容。正在使用此 API 打印 TXT 和 PRN 文件。