在 iOS 中使用 HTML 模版和 UIPrintPageRenderer 生成 P

查了下 转PDF的各种框架   发现大部分都是收费的。 发现一款免费的iTextSharp  就想玩一下

作者:GABRIEL THEODOROPOULOS,原文链接,原文日期:2016-7-10
译者:X140Yu;校对:saitjr;定稿:CMB

只是简单做个HTML 转PDF  没有过深的探究。 

你是否曾经遇到过「使用 app 中的内容生成 PDF 文件」这样的需求?如果你之前没有做过,那你有想过该如何实现吗?

 

好吧,通过抛出问题来开篇有点不太好,但上述内容总结了我将要在这篇文章中讨论的事情。要在 iOS 应用内创建一个 PDF 文档,看起来像不是一个容易的需求,但事实并不是这样。作为开发人员,你必须要随机应变,为自己创造可供选择的方案,尽量达到目标。这是件很有挑战性的事情。确实,手动绘制 PDF 是一个非常痛苦的过程(取决于内容),最终可能会变得非常低效。计算坐标、加线、设置颜色、缩进、偏移等。这可能很有趣(或并不是),但如果你要绘制的内容非常复杂,那到最后可能会变得一团糟。

首先 我在项目中引入iTextSharp   还是老方法 要么 NuGet上下载 或者 直接命令 

本文会介绍另一种创建 PDF 文件的方式,这种方式比手动绘制要简单得多。它的思想是使用 HTML 模版,�大致有以下几个步骤:

 

  1. 为要生成 PDF 的表单创建 HTML 模版。
  2. 使用这些 HTML 模版来渲染真正的内容(或者把它显示在 web view 中)。
  3. 把 HTML 的内容转换为 PDF。

然后在项目中建了一个HTML   里面就是一些简单的标签 和一些占位符

金沙官网线上,在最后一步,iOS 会替你做所有麻烦的事情。

 

说白了,我认为你也更加愿意处理 HTML,而不是直接绘制 PDF 文件吧。这种情况下,你需要的是将内容展现在 HTML 文件中,但手动去创建重复的内容,确实不太明智,也不太高效。举个例子,有一个 app 能把学生的信息打印或输出为 PDF。为每个学生创建一个 HTML 页面显然不可取,因为为了打印这些信息,一直在做重复的事情。你真正需要的是创建一个 HTML 模版。使用一种特殊的方式在关键位置用占位符占位,而不是直接使用实际的值,接着在 app 中,把这些占位符换成实际值。当然,最后一步的值替换是可以是重复且自动化的。

金沙官网线上 1

当 HTML 代码中包含实际值之后,就可以为所欲为了。你可以在 web view 中显示,保存为文件,分享,当然也可以输出为 PDF。

然后建了个PDF帮助类  里面实现具体转换的方法

那么我们到底应该怎么做呢?

public class PDFHelp
    {
        public byte[] ConvertHtmlTextToPDF(string htmltext)
        {
            if (string.IsNullOrEmpty(htmltext))
            {
                return null;
            }
            //避免htmlText没有任何html tag标签的純文字时,转PDF时会挂掉,所以一律加上<p>标签
            //htmlText = "<p>" + htmltext + "</p>";

            MemoryStream stream = new MemoryStream();
            byte[] data = Encoding.UTF8.GetBytes(htmltext);
            MemoryStream msInput = new MemoryStream(data);
            Document doc = new Document();
            PdfWriter writer = PdfWriter.GetInstance(doc, stream);
            //指定文件默认缩放标准100%
            PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 0, doc.PageSize.Height, 1f);
            doc.Open();
            //使用XMLWorkerHelper把Html parse到PDF
            XMLWorkerHelper .GetInstance().ParseXHtml(writer, doc, msInput, null, Encoding.UTF8, new UnicodeFontFactory());
            //將pdfDest 写入到PDF
            PdfAction action = PdfAction.GotoLocalPage(1, pdfDest, writer);
            writer.SetOpenAction(action);
            doc.Close();
            msInput.Close();
            stream.Close();
            //回传PDF 
            return stream.ToArray();
        }
    }

将内容输出为 PDF 是本文的最终目标,但我们是从如何用实际值替换占位符这一步开始的。Demo 的 app 是一个生成发票的小应用,非常符合本文的需求。再次说明我们不会从头来做这个应用,这不是最终目的。应用的默认功能已经实现好了,也提供了 HTML 模版,我们也会一步一步说明,所以你也有机会明白这到底是怎么一回事,占位符到底有什么意义。不管怎么样,我们会一起,一步一步地走通生成真正 HTML 内容的流程,然后将它输出为 PDF 文档。这还没完,我还会告诉你们如何给最终的 PDF 加上 header 和 footer。

 

如果你对以上的内容感兴趣,那就一起开始做吧!

本文由金沙官网线上发布于编程,转载请注明出处:在 iOS 中使用 HTML 模版和 UIPrintPageRenderer 生成 P

您可能还会对下面的文章感兴趣: