如何在.Net中利用windows api函数打印一个文档

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在.Net中利用windows api函数打印一个文档相关的知识,希望对你有一定的参考价值。

有一个任务,在。net中利用windows api函数打印一个prn或plt文件,请问具体步骤是咋样的,急。。。。。,如果回答有效,可以追加分!

我想你是不是要打印机连续打但是却中间总是有空呢?
就是说每打完一页就回把纸张往前进一点然后继续打是不是呢?
这个问题用程序我认为基本无法解决,因为这个是打印机的驱动说了算的。
除非你买票据打印机或者每打印完一页就手动转动滚桶退纸。
在windows里面,相关打印的api不多,你可以看看《windows程序设计》第五版本,里面有一句话说的很好,那就是:虽然往打印机上画东西(坐标系和转换比例设计好后,可以说是画什么打什么)就跟在屏幕上输出东西差不多,但是你要知道,屏幕上画错了刷新就好,但是打印机却是不能退纸的,纸张只进不退。
在delphi里面只是用canvas更加形象化,方便化了而已,原理一样的。

--------------------------------------------------------------------------------------
在C#中调用windows API函数

对于windows 系统API函数的调用在程序设计中有时是必不可少的,各种编程语言都规范了调用的方法和接口,在C#语言中的调用方法如下(以下编程环境为Visual Studio .NET):

1、 在工程项目中添加一个类新项,打开这个类文件,在文件头部加入对以下命名空间的引用:

using System.Runtime.InteropServices;

在类定义主体中,以静态调用的方式加入对API的引用,本文以下的API调用为例:

/// <summary>

/// 打开和关闭CD托盘.

/// </summary>

[DllImport("winmm.dll" , EntryPoint="mciSendString", CharSet=CharSet.Auto)]

public static extern int mciSendString (string lpstrCommand,string lpstrReturnstring ,int uReturnLength,int hwndCallback);

/// <summary>

/// 显示和隐藏鼠标指针.

/// </summary>

[DllImport("user32.dll", EntryPoint="ShowCursor", CharSet=CharSet.Auto)]

public static extern int ShowCursor(int bShow);

/// <summary>

/// 清空回收站.

/// </summary>

[DllImport("shell32.dll", EntryPoint="SHEmptyRecycleBin", CharSet=CharSet.Auto)]

public static extern long SHEmptyRecycleBin(IntPtr hwnd, string pszRootPath, long dwFlags);

/// <summary>

/// 打开浏览器

/// </summary>

[DllImport("shell32.dll", EntryPoint="ShellExecute", CharSet=CharSet.Auto)]

public static extern int ShellExecute(IntPtr hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);

/// <summary>

/// 最大化窗口,最小化窗口,正常大小窗口;

/// </summary>

[DllImport("user32.dll", EntryPoint="ShowWindow", CharSet=CharSet.Auto)]

public static extern int ShowWindow(IntPtr hwnd,int nCmdShow);

2、 有了上面的文件后,就可以在自己的窗体对象的事件处理中调用以上的API,方法如下:

以下strReturn是string类型的公有变量,ApiCalls指代第一步创建的类名。

打开CD托盘:

long lngReturn = ApiCalls.mciSendString("set CDAudio door open", strReturn, 127, 0);

关闭CD托盘:

long lngReturn = ApiCalls.mciSendString("set CDAudio door closed", strReturn, 127, 0);

在应用程序窗体中显示鼠标指针:

ApiCalls.ShowCursor(1);

在应用程序窗体中隐藏鼠标指针:

ApiCalls.ShowCursor(0);

清空回收站:

ApiCalls.SHEmptyRecycleBin(Form.ActiveForm.Handle,"",0x00000000);

打开浏览器窗口,textBox1.Text中表示要访问的URL地址:

Long lngReturn= ApiCalls.ShellExecute(Form.ActiveForm.Handle,"Open",textBox1.Text,"","",1);

最大化窗口:

ApiCalls.ShowWindow(Form.ActiveForm.Handle,3);

最小化窗口:

ApiCalls.ShowWindow(Form.ActiveForm.Handle,2);

恢复正常大小窗口:

ApiCalls.ShowWindow(Form.ActiveForm.Handle,1);
参考技术A prn 和 plt 文件,都是CAD的文件, 如果你要打印的话, 电脑上必须安装有相应的CAD软件, 这种情况下, 用 WINDOWS API 打印才可以实现。

而且,也很简单。
参考技术B 直接用API去做 应该是做不到的。直接API打印的除非是txt文件或者用txt文件能打开的。 打个比方excel文件,你必须去调用office的excel的打印功能去打印,假如没有电脑没有安装excel也就是无法打印excel,也就是说你想打印prn文件,假如这个文件能够用word打开,然后你可以用word打开这个文件然后去调用word的打印功能! 所以你要打印PRN必须有想关软件实现了打印功能,然后再能去打印!

如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?

【中文标题】如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?【英文标题】:How to implement Windows Authentication in a .Net Core API Gateway using Ocelot so that all downstream services can access IWindowsPrincipal? 【发布时间】:2021-12-30 20:17:03 【问题描述】:

背景

我有两个微服务需要访问调用用户的 IWindowsPrincipal。 我正在使用 .Net Core 3.1 编写一个 API 网关,它将充当这些服务的反向代理。 我在 API Gateway 中配置了 Authentication 和 Authorization 如下:

public void ConfigureServices(IServiceCollection services)

    services.AddCors(options =>
    
        options.AddPolicy("All allowed",
            builder =>
            
                builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
            );
    );

    services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate();
    services.AddAuthorization();

    services.AddControllers();
    services.AddHttpForwarder();
    services.AddOcelot();
    services.AddSwaggerForOcelot(_configuration);


public void Configure(IApplicationBuilder app)

    app.UseCors("All allowed");

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    
        endpoints.MapControllers();
    );

    app.UseSwaggerForOcelotUI(options =>
    
        options.PathToSwaggerGenerator = "/swagger/docs";
    );

    app.UseOcelot();

要求

我想使用 HttpContext.User.Identity 访问调用用户的身份 在微服务的方法中。

实际结果

在微服务的方法中,HttpContext.User.Identity.IsAuthenticated为false,身份信息为空。

问题

有没有办法在网关中配置 Ocelot,以便在必要时挑战调用者接收 Windows 身份验证信息并将其传递给微服务? 如果这不可能,是实现我的目标的推荐方法,在每个微服务中执行 Windows 身份验证? Ocelot 不应该允许我在一个地方为所有微服务处理身份验证吗?

按照问题 1

Ocelot 的文档是指使用 JWT 进行身份验证。 我是否应该断定 Ocelot 只提供 JWT 配置?

继续问题 2

我读过一些关于 Yarp 的文章 (https://microsoft.github.io/reverse-proxy/) 我应该使用 Yarp 而不是 Ocelot 来实现我的目标吗?

【问题讨论】:

【参考方案1】:

我认为答案是

有没有办法在网关中配置 Ocelot,以便在必要时挑战调用者接收 Windows 身份验证信息并将其传递给微服务?

问题是 Windows Authentication 是有状态的,服务器和客户端在同一个 Active Directory 中,你可以在 .NET Core Windows Authentication 中找到注释

Windows 身份验证是主要用于 Intranet 的有状态方案,其中代理或负载平衡器通常不处理客户端和服务器之间的流量。

微服务架构需要无状态而不是有状态(意味着服务器和客户端位于不同的 AD/OS/网络​​中)。而网关是微服务图中的一个无状态组件。

Ocelot 验证 Windows 用户身份的唯一方法是使用 Active Directory 联合服务 (ADFS) 和 OpenID Connect (OIDC) 或自行在 IIS 服务器中构建身份服务器。您可以阅读 ADFS 或 Azure AD 中的场景以了解更多详细信息。

此外,我对以下两个问题的回答:

    ,Ocelot 只是提供了插件功能来检测在允许请求通过下游之前必须包含哪些 JWT 声明。您可以构建自定义身份验证/授权中间件以允许/拒绝正确的上游。 没有,YARP在你的需求中和Ocelot的意思是一样的。

【讨论】:

但是在网关质询用户之后,它会以标头的形式接收身份。为什么 ocelot 不能将这些标头转发到 API 端点? 正如我所说,Windows 身份验证是有状态的,主要问题是该机制属于 IIS 服务器和 Windows 操作系统。两者都必须加入同一个 AD、Network 。该机制不仅仅是获取Form Header,它要求Web服务器认证机制支持网络级别的Windows认证。假设您有 Web 应用程序(客户端)、网关(代理)和 Api(Web 服务)。如果要通过网关和 Api 执行请求,它们必须保持在同一个网络、同一个 AD 上。这一点在微服务中是一个不好的做法 此外,用户不仅在网关级别进行身份验证,而且在 API 级别进行身份验证。与 SSO 相比,Windows 身份验证设置此方案更为复杂。 SSO 只需要使用 JWT 来传递服务器,服务器可以在没有第三方组件的情况下对 JWT 本身进行身份验证,而 Windows 身份验证要求服务器必须通过与 AD Server 通信来进行身份验证 感谢您的回答。我接受答案。

以上是关于如何在.Net中利用windows api函数打印一个文档的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET 中处理具有 Windows Photo Gallery 质量的整页打印图像?

利用IDAPython给Windows API下条件断点

Windows API编程的作品目录

2015.4.25利用UIAutomation 替代API函数,解决了ListView无法读数据的难题,顺便实现了鼠标模拟滚轮

WPF 使用Console.Write打印信息到控制台窗口中

Windows API函数大全(精心总结)