最近在工作上遇到一个需要生成PDF文件并提供下载的需求,由于是使用.net开发的。
经过综合考虑时候,决定使用iTextSharp 这个插件。
这里总结一下遇到的问题和解决方法。
先看看这个插件的基本用法:
![iTextSharp 插件生成PDF(使用总结)](http://p2.ttnews.xyz/loading.gif)
基本用法
可以看出 当你创建一个Document时,就需要指定一个存放路径,生成的pdf会存放到对应的位置。
可是我是需要返回一个文件流呀。
这里我想到了两种做法,都实践过了,各有优点和缺点。
先来讲讲遇到的第一个坑:中文显示问题
如果你使用该插件,啥都不设置的话,默认是指显示英文字体,中文的字体和标点符号都不会显示出来的。需要显示中文字体,就需要设置字体来支持中文显示。上代码
![iTextSharp 插件生成PDF(使用总结)](http://p2.ttnews.xyz/loading.gif)
第一种方法
我在项目的相对路径上创建了一个临时的文件夹,将生成的pdf存放到这个文件夹里面。在返回的时候,读取这个文件,然后将临时文件夹删除,再将这个流包装成返回格式返回。
这种做法对于大部分项目应该是可以正常运行的,然而,如果你的项目有特别严格的文件夹权限管理的话,操作起来可能就比较麻烦(大佬不用考虑这个问题)。因为我只是想实现一个下载pdf的功能,当时项目转测之后,需要在好几个项目上运行,然后测试对应的生成pdf功能。大部分项目是正常运行的,但是其中有一个项目就因为创建临时文件夹失败(权限不够,被拒绝了),导致该功能不可用。有人说,改一下文件夹的权限就好了。嗯是的,改完之后,确实通过测试了,但是线上环境,谁能说的清呢。稳妥起见。我决定使用第二种方法。
第一种方法①
第一种方法②
第二种方法
使用MemoryStream ms = new MemoryStream(); 生成一个内存流。将生成的pdf文件输出到这个内存流里面,再从内存流读取字节,内存流关闭,返回字节。
之所以使用这个方法,是因为本身生成的pdf不大,而且生成pdf功能使用频率也不高。所以直接内存转出就完事了。代码撸起来也比较清晰。大Pdf不推荐这种做法,还是老老实实用第一种,排查文件夹权限更好一点
第二种方法
閱讀更多 上弦孤月c 的文章