Xps转Pdf

一、功能说明与定义

把Xps转成Pdf

二、产生背景

由于项目的需求有用到相关的技术,因此进行了研究与整理。

三、实现方式

由于项目上已经有了相关的功能和实现(用的是开源的PdfSharp实现的),但是存在一些问题,在此的基础上我花了些时间进行了整理和研究,因此进行的整理和总结,下面将对三种实现方式进行简单的说明。

  • 存在的问题

         问题一:基于PdfSharp的转换工具都有一个问题,就是在Xps的总页码大于50页时,把Xps转成Pdf最多只能生成出50页的Pdf,查看源码都能发现原来转换接口中有如下的代码块 

    

#if DEBUG
            // stop at page...
            if (pageIndex == 50)
              break;
#endif

 

  如上,如果PdfSharp相关的代码是Debug版本,则都会出现此问题,解决办法就是找到相关的源码生成一个Release版本就可以了。

         问题二 :由于PdfSharp的转换工具存在缓存机制,因此如果Xps转换为Pdf是用在服务端进行转换那么将导致服务器内存的不断增长,最终将导致服务的崩溃。解决办法就是推荐采用第三种 3、GhostXPS 进行转换。

  • 实现方式

  以下将简单的介绍三种Xps转Pdf的实现。

  1、XpsToPdf

  GIT地址:https://github.com/XpsToPdf/XpsToPdf

  Framework版本:默认是

<TargetFrameworks>net48</TargetFrameworks>

  支持 framework4.7但是要额外引入如下程序集

     

 

  由于引入的 System.IO.Packaging 包的最低framework版本支持的是4.7因此无法在往下降了,除非找到相应的源码同步调整相应的framework版本。

  此项目其实就是基于PdfSharp的实现,因此也存在Debug下编译的dll最多只能转出50页PDF的问题,详见 存在的问题

 

  2、PdfSharp.Xps

  GIT地址:https://github.com/EbenZhang/PdfSharp.XPS

  Framework版本:

  默认是framework3.5的项目

  此项目也是基于PdfSharp的实现,实现代码基本与(1)中的一样,这里不再重复阐述,由于对framework的版本要求更低,因此更能符合大部分项目的要求。

  总结:(1),(2)实现都是基于PdfSharp的方式,因此都存在Debug下编译的版本只能生成50页PDF的问题,其次转换出来的PDF通常都比较大,目测会大10倍左右,我测试的Xps是200多页1.6M左右,生成后的Pdf是16-17M。

 

  3、GhostXPS

  GIT地址:https://github.com/nmanichev/GhostXPS

  Framework版本:

  默认是framework4.0的项目

  实现原理是通过带参启动gxpswin64.exe程序把Xps转成Pdf,通过此方式生成的Pdf大小通常是Xps大小的3倍左右。

 

以上就是我本次分享的全部内容,由于都是开源项目,项目里都有对项目使用的详细介绍因此这里都是简单的说明和引入。

如果大家还有其他更好的方式也欢迎大家踊跃分享。

  

 

posted @ 2022-03-26 10:10  lanwah  阅读(844)  评论(2编辑  收藏  举报