div中的可编辑内容转换为pdf

问题描述 投票:0回答:1

我想知道将可编辑内容(用户输入的内容)转换为pdf的最有效方法。这是我的意思的说明:

1。

User inputs something in div contenteditable

2

Then download the pdf

3

And lastly the text that has been put into the pdf

[我也想知道如何转换css功能,因为jsPDF不支持(据我所知)

谢谢大家!

pdf contenteditable html-to-pdf
1个回答
0
投票

jsPDF几乎不支持您需要的功能。我建议创建一个应用程序来做到这一点。

我的背景是C#。因此:

Program.cs

using HtmlToPdf.Models;

namespace HtmlToPdf.Console
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var model = new HtmlToPdfModel();
            model.HTML = "<h3>Hello world!</h3>";
            model.CSS = "h3{color:#f00;}";

            HtmlToPdf.Convert(model);
        }
    }
}

HtmlToPdfModel.cs

namespace HtmlToPdf.Models
{
    public class HtmlToPdfModel
    {
        public string HTML { get; set; }

        public string CSS { get; set; }

        public string OutputPath { get; set; }

        public string FontName { get; set; }

        public string FontPath { get; set; }
    }
}

HtmlToPdf.cs

using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using HtmlToPdf.Models;
using System;
using System.IO;
using System.Text;

namespace HtmlToPdf.Console
{
    public class HtmlToPdf
    {
        public static void Convert(HtmlToPdfModel model)
        {
            try
            {
                if (model == null) return;

                Byte[] bytes;

                //Boilerplate iTextSharp setup here
                //Create a stream that we can write to, in this case a MemoryStream
                using (var stream = new MemoryStream())
                {
                    //Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF
                    using (var doc = new Document())
                    {
                        //Create a writer that's bound to our PDF abstraction and our stream
                        using (var writer = PdfWriter.GetInstance(doc, stream))
                        {
                            //Open the document for writing
                            doc.Open();

                            //In order to read CSS as a string we need to switch to a different constructor
                            //that takes Streams instead of TextReaders.
                            //Below we convert the strings into UTF8 byte array and wrap those in MemoryStreams
                            using (var cssStream = new MemoryStream(Encoding.UTF8.GetBytes(model.CSS)))
                            {
                                using (var htmlStream = new MemoryStream(Encoding.UTF8.GetBytes(model.HTML)))
                                {
                                    var fontProvider = new XMLWorkerFontProvider();

                                    if (!string.IsNullOrEmpty(model.FontPath) && !string.IsNullOrEmpty(model.FontName))
                                    {
                                        fontProvider.Register(model.FontPath, model.FontName);

                                        //Parse the HTML with css font-family
                                        XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, htmlStream, cssStream, Encoding.UTF8, fontProvider);
                                    }
                                    else
                                    {
                                        //Parse the HTML without css font-family
                                        XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, htmlStream, cssStream);
                                    }
                                }
                            }

                            doc.Close();
                        }
                    }

                    //After all of the PDF "stuff" above is done and closed but **before** we
                    //close the MemoryStream, grab all of the active bytes from the stream
                    bytes = stream.ToArray();
                }

                //Now we just need to do something with those bytes.
                //Here I'm writing them to disk but if you were in ASP.Net you might Response.BinaryWrite() them.
                //You could also write the bytes to a database in a varbinary() column (but please don't) or you
                //could pass them to another function for further PDF processing.

                // use this line on Windows version
                //File.WriteAllBytes(model.OutputPath, bytes);

                // use these lines on Mac version
                string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "data");
                path = Path.Combine(path, "test.pdf");

                File.WriteAllBytes(path, bytes);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
}

enter image description here

[当我编写此应用程序时,我已经在Windows上进行了测试。因此,如果您使用的是Mac,则可以替换以下行:

File.WriteAllBytes(model.OutputPath, bytes);

在文件HtmlToPdf.cs至]中>

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "data");
path = Path.Combine(path, "test.pdf");

File.WriteAllBytes(path, bytes);

我已在代码内部发表评论。

关于字体问题,如果要使用特定字体(例如:Roboto,则必须提供字体文件和应用程序可以分配给的路径。

© www.soinside.com 2019 - 2024. All rights reserved.