iText7 For .Net 系列文章(一)-Hello World
医疗行业近几年有一个词汇听得非常多-“无纸化”,例如病案无纸化、检查检验报告无纸化,一方面医院空间有限,纸质化病案存放是一大头疼问题,加上病案数据信息化、数字化发展的必要。常规病案无纸化的做法时文档化,PDF文件以在任何平台都不会像其他文件格式容易出现排版错乱、变样的优点加上不易编辑、不易改变的特点成为文档化的首选格式,据我了解目前各大医疗软件厂商基本都是采用这种格式。
最近闲暇时间在了解Net平台比较好用的PDF操作的插件,根据搜索引擎结果iText好像为各大程序员都推崇,无论.Net平台还是Java平台。去官网看了一下,功能还挺强大,还有一些付费组件。开始还是以熟知的Hello World!开始吧。
第一步就通过Nuget安装iText
在Browse页搜索iText发现还有iTextSharp,但是根据描述该组件已经弃用了,只有安全修复类的更新,所以果断还是使用最新的最稳定版本 iText 7.2.0
UI方面,采用比较熟悉和简单的Winform窗体,里面有四个控件: menuStrip(实现按章节组织小功能)、folderBrowserDialog(用于选择文件夹或创建新文件夹,可以根据用户选择获取到一个创建PDF文档,或读取文件的路径)、saveFileDialog(用于保存文件)、openFileDialog(用于选取需要copy的原文件)。
private void HelloWorldToolStripMenuItem_Click(object sender, EventArgs e) { string filename = "hello_world.pdf"; //传递一个文件名,生成的文件在当前程序根目录下 //var writer = new PdfWriter(filename); //传递一个FileStream,可实现在指定目录下生成PDF文件 string path = GetSelectedPath(); var fullFileName = System.IO.Path.Combine(path, filename); using (FileStream fileStream = new FileStream(fullFileName, FileMode.OpenOrCreate)) { var writer = new PdfWriter(fileStream); var pdf = new PdfDocument(writer); var document = new Document(pdf); document.Add(new Paragraph("Hello World!")); document.Close(); } } private string GetSelectedPath() { folderBrowserDialog1.ShowNewFolderButton = true; folderBrowserDialog1.ShowDialog(); return folderBrowserDialog1.SelectedPath; }
代码相对还是有一点麻烦,主要我这里想自己选择保存文件的路径,不然去程序根目录找不方便。如果使用我注释掉的那种方式,直接使用下面的这段代码就可以实现了,这就简单多了。
private void HelloWorldToolStripMenuItem_Click(object sender, EventArgs e) { string filename = "hello_world.pdf"; //传递一个文件名,生成的文件在当前程序根目录下 var writer = new PdfWriter(filename); var pdf = new PdfDocument(writer); var document = new Document(pdf); document.Add(new Paragraph("Hello World!")); document.Close(); }
运行程序,点击“Hello World”菜单,你就可以在你选择的目录下找到生成的 hello_world.pdf 文件,打开就可以看到效果啦。
我们创建一个 PdfWriter 实例。 PdfWriter 是一个可以写入 PDF 文件的对象。它不太了解它正在编写的 PDF 文档的实际内容。 PdfWriter 不知道文档是关于什么的,它只是在文件结构完成后写入组成有效文档的不同文件部分和不同对象。在这种情况下,我们传递一个名为 fileName 的字符串参数,它可以包含文件的路径,例如 results/chapter01/hello_world.pdf。构造函数还接受一个 Stream 作为参数。例如:如果我们想编写一个 Web 应用程序,我们可以写入 HttpResponse.OutputStream;如果我们想在内存中创建一个 PDF 文档,我们可以使用 MemoryStream;等等。
PdfWriter
知道要写什么,因为它侦听 PdfDocument。 PdfDocument
管理添加的内容,将该内容分发到不同的页面,并跟踪与该内容相关的任何信息。在第 7 章中,我们将发现 PdfWriter 可以收听各种风格的
PdfDocument 类。
一旦我们创建了一个 PdfWriter 和一个 PdfDocument,我们就完成了所有低级的、特定于 PDF 的代码。我们创建了一个以 PdfDocument 作为参数的 Document。现在我们有了文档对象,我们可以忘记我们正在创建 PDF。
我们创建一个包含文本“Hello World”的段落,并将该段落添加到文档对象中。
我们关闭文档。我们的 PDF 已经创建。
鉴于此,我们还可以实现写一个像 ul->li这样结构的一个无序编号的文本列表,还有读取一个文件夹里的图片写入到一个PDF文件中,代码如下:
private void ListExampleToolStripMenuItem_Click(object sender, EventArgs e) { //通过SaveFileDialog实现用户自定义路径和文件名 using (FileStream fileStream = new FileStream(GetSavingFileNameContainDirectory(), FileMode.OpenOrCreate)) { var writer = new PdfWriter(fileStream); var pdf = new PdfDocument(writer); var document = new Document(pdf); // Create a PdfFont var font = PdfFontFactory.CreateFont(iText.IO.Font.Constants.StandardFonts.HELVETICA_BOLDOBLIQUE); // Add a Paragraph document.Add(new Paragraph("iText is:").SetFont(font)); // Create a List List list = new List() .SetSymbolIndent(12) .SetListSymbol("\u2022") .SetFont(font); // Add ListItem objects list.Add(new ListItem("Never gonna give you up")) .Add(new ListItem("Never gonna let you down")) .Add(new ListItem("Never gonna run around and desert you")) .Add(new ListItem("Never gonna make you cry")) .Add(new ListItem("Never gonna say goodbye")) .Add(new ListItem("Never gonna tell a lie and hurt you")); // Add the list document.Add(list); document.Close(); } } private void ImageExampleToolStripMenuItem1_Click(object sender, EventArgs e) { //选择图片目录 string imagesPath = GetSelectedPath(); DirectoryInfo directoryInfo = new DirectoryInfo(imagesPath); List<string> imageExtensionList = new List<string> { ".png", ".jpg", ".jpeg", ".bmp" }; using (FileStream fileStream = new FileStream(GetSavingFileNameContainDirectory(), FileMode.OpenOrCreate)) { var writer = new PdfWriter(fileStream); var pdf = new PdfDocument(writer); var document = new Document(pdf); var font = PdfFontFactory.CreateFont(StandardFonts.HELVETICA_BOLDOBLIQUE); var p = new Paragraph("images:").SetFont(font); document.Add(p); var imageArea = new Paragraph(); foreach (var fileInfo in directoryInfo.GetFiles().Where(x => imageExtensionList.Contains(x.Extension.ToLower()))) { var image = new Image(ImageDataFactory.Create(fileInfo.FullName)); imageArea.Add(image); } document.Add(imageArea); document.Close(); } } private string GetSelectedPath() { folderBrowserDialog1.ShowNewFolderButton = true; folderBrowserDialog1.ShowDialog(); return folderBrowserDialog1.SelectedPath; } private string GetSavingFileNameContainDirectory(string filter = "PDF(*.pdf)|*.pdf") { saveFileDialog1.Filter = filter; saveFileDialog1.AddExtension = true; saveFileDialog1.ShowDialog(); return saveFileDialog1.FileName; }
如果对内容有任何疑问或者需要源代码参考,可以评论区留言。
如果内容对您有帮助,可以在主页-公告栏下面扫码给我打赏,你的鼓励是我前进的动力。
本文来自博客园,作者:业荒于嬉,转载请注明原文链接:https://www.cnblogs.com/FreeLoopPowter/p/15683830.html
如内容对您有所帮助,还请不吝推荐一下!