C# 将内容可编辑内容转换为PDF

C# 将内容可编辑内容转换为PDF,c#,pdf,contenteditable,html-to-pdf,C#,Pdf,Contenteditable,Html To Pdf,我想知道将contenteditable功能(用户输入的内容)转换为pdf的最有效方法。以下是我的意思的说明: 一, 二, 三, 我还想知道如何转换css功能,因为jsPDF不支持此功能(据我所知)jsPDF几乎不支持您需要的功能。我建议创建一个应用程序来实现这一点 我的背景是C。因此: Program.cs 使用HtmlToPdf.Models; 命名空间HtmlToPdf.Console { 公共课程 { 公共静态void Main(字符串[]args) { var model=新的H

我想知道将
contenteditable
功能(用户输入的内容)转换为pdf的最有效方法。以下是我的意思的说明:

一,

二,

三,


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

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

我的背景是C。因此:

Program.cs

使用HtmlToPdf.Models;
命名空间HtmlToPdf.Console
{
公共课程
{
公共静态void Main(字符串[]args)
{
var model=新的HtmlToPdfModel();
model.HTML=“你好,世界!”;
model.CSS=“h3{color:#f00;}”;
HtmlToPdf.Convert(模型);
}
}
}
HtmlToPdfModel.cs

namespace HtmlToPdf.Models
{
公共类HtmlToPdfModel
{
公共字符串HTML{get;set;}
公共字符串CSS{get;set;}
公共字符串输出路径{get;set;}
公共字符串FontName{get;set;}
公共字符串路径{get;set;}
}
}
HtmlToPdf.cs

使用iTextSharp.text;
使用iTextSharp.text.pdf;
使用iTextSharp.tool.xml;
使用HtmlToPdf.Models;
使用制度;
使用System.IO;
使用系统文本;
命名空间HtmlToPdf.Console
{
公共类HtmlToPdf
{
公共静态无效转换(HTMLOPDFMODEL模型)
{
尝试
{
if(model==null)返回;
字节[]字节;
//样板文件在这里设置
//创建一个我们可以写入的流,在本例中是一个MemoryStream
使用(var stream=new MemoryStream())
{
//创建一个iTextSharp文档,该文档是PDF的抽象,但**不是**PDF
使用(var doc=new Document())
{
//创建一个绑定到PDF抽象和流的编写器
使用(var writer=PdfWriter.GetInstance(doc,stream))
{
//打开文档进行写作
doc.Open();
//为了将CSS作为字符串读取,我们需要切换到不同的构造函数
//它采用流而不是文本阅读器。
//下面我们将字符串转换为UTF8字节数组,并将其包装在MemoryStream中
使用(var cssStream=newmemoryStream(Encoding.UTF8.GetBytes(model.CSS)))
{
使用(var htmlStream=newmemoryStream(Encoding.UTF8.GetBytes(model.HTML)))
{
var fontProvider=新的XMLWorkerFontProvider();
如果(!string.IsNullOrEmpty(model.FontPath)和&!string.IsNullOrEmpty(model.FontName))
{
fontProvider.Register(model.FontPath,model.FontName);
//使用css字体系列解析HTML
XMLWorkerHelper.GetInstance().ParseXHtml(编写器、文档、htmlStream、cssStream、Encoding.UTF8、fontProvider);
}
其他的
{
//解析没有css字体系列的HTML
XMLWorkerHelper.GetInstance().ParseXHtml(编写器、文档、htmlStream、cssStream);
}
}
}
doc.Close();
}
}
//在上述所有PDF“内容”完成并关闭后,但**在**之前,我们
//关闭MemoryStream,从流中获取所有活动字节
字节=stream.ToArray();
}
//现在我们只需要对这些字节做点什么。
//在这里,我将它们写入磁盘,但如果您在ASP.Net中,您可能会响应。BinaryWrite()将它们写入磁盘。
//您也可以将字节写入varbinary()列中的数据库(但请不要这样做),或者
//可以将它们传递给另一个函数以进行进一步的PDF处理。
//在Windows版本上使用此行
//File.writealBytes(model.OutputPath,字节);
//在Mac版本上使用这些行
string path=path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),“data”);
path=path.Combine(路径,“test.pdf”);
File.writealBytes(路径,字节);
}
捕获(例外e)
{
投掷e;
}
}
}
}

当我编写这个应用程序时,我已经在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
),必须提供字体文件和应用程序可分配的路径

Nuget软件包:
iTextSharp
iTextSharp.xmlworker


您可以将此控制台应用程序转换为web应用程序,每当您想要生成PDF文件时,只需向服务器发出请求(ajax)并点击方法
HtmlToPdf.convert

,这样我就可以使用ajax转换您给我的代码,让它与我的html/js/css文件一起工作?@dcnx1您可以使用我的代码创建扩展名。如果您使用的是asp.net mvc,则称为