C# Net Core 使用 itextsharp.lgplv2.core 把Html转PDF

 

C# Net Core 使用 itextsharp.lgplv2.core 把Html转PDF

 

只支持英文(中文我不知道怎么弄,懂的朋友帮我看一下)!!!!!【补充:评论区的小伙伴已解决】

 

引入包itextsharp.lgplv2.core

 

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public static MemoryStream Pdf(string html)
{
    StringReader sr = new StringReader(html);
    //步骤1
    Document document = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
 
    MemoryStream stream = new MemoryStream();
    //步骤2
    PdfWriter.GetInstance(document, stream);
    //步骤3
    document.Open();
 
    //创建一个样式表
    StyleSheet styles = new StyleSheet();
    ////设置默认字体的属性
    //styles.LoadTagStyle(HtmlTags.BODY, "encoding", "Identity-H");
    //styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONT, "Tahoma");
    //styles.LoadTagStyle(HtmlTags.BODY, "size", "16pt");
 
    //FontFactory.Register(@"C:\Windows\Fonts\tahoma.ttf");
 
    var unicodeFontProvider = FontFactoryImp.Instance;
    unicodeFontProvider.DefaultEmbedding = BaseFont.EMBEDDED;
    unicodeFontProvider.DefaultEncoding = BaseFont.IDENTITY_H;
 
    var props = new Hashtable
    {
    //    { "img_provider", new MyImageFactory() },
        { "font_factory", unicodeFontProvider } //始终使用Unicode字体
    };
 
    //步骤4
    //var objects = HtmlWorker.ParseToList(sr, styles, props);
    var objects = HtmlWorker.ParseToList(sr, styles);
    foreach (IElement element in objects)
    {
        document.Add(element);
    }
 
    document.Close();
    return stream;
}

  

 

-------------------后面补充-----------------

后面看到了这个帖子:https://dotnetcoretutorials.com/2019/07/02/creating-a-pdf-in-net-core/

中的 这段话

 

 

我决定使用包【pugpdf】:https://github.com/pug-pelle-p/pugpdf

当然如果能解决itextsharp.lgplv2.core的中文问题,我觉得他是最好的选择

-------------------后面补充-----------------

 

-------------------后面补充2-----------------

经过评论区的小伙伴的努力,解决了中文的问题,以下是全代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public static MemoryStream Pdf(string html)
{
    StringReader sr = new StringReader(html);
    //步骤1
    Document document = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
 
    MemoryStream stream = new MemoryStream();
    //步骤2
    PdfWriter.GetInstance(document, stream);
    //步骤3
    document.Open();
 
    //创建一个样式表
    StyleSheet styles = new StyleSheet();
    ////设置默认字体的属性
    //styles.LoadTagStyle(HtmlTags.BODY, "encoding", "Identity-H");
    //styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONT, "Tahoma");
    //styles.LoadTagStyle(HtmlTags.BODY, "size", "16pt");
 
    //FontFactory.Register(@"C:\Windows\Fonts\tahoma.ttf");
 
    var unicodeFontProvider = FontFactoryImp.Instance;
    unicodeFontProvider.DefaultEmbedding = BaseFont.EMBEDDED;
    unicodeFontProvider.DefaultEncoding = BaseFont.IDENTITY_H;
 
    var props = new Hashtable
    {
    //    { "img_provider", new MyImageFactory() },
        { "font_factory", unicodeFontProvider } //始终使用Unicode字体
    };
 
    //步骤4
    //var objects = HtmlWorker.ParseToList(sr, styles, props);
    var objects = HtmlWorker.ParseToList(sr, styles);
    foreach (IElement element in objects)
    {
        BaseFont baseFont = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont);
        Paragraph temp = element as Paragraph;
        if (temp != null)
        {
            var chuck = temp[0] as Chunk;
            if (chuck != null)
            {
                chuck.Font = font;
                //document.Add(temp);
            }
        }
        document.Add(element);
    }
 
    document.Close();
    return stream;
}

  

但是我发现复杂的html解析效果不是很好(相对于其他)

于是我尝试着自己来生成pdf

以下代码完成了以下功能:

*添加图片

*添加段落(文本)

*添加块到某一处(文本)

1
2
using iTextSharp.text;
using iTextSharp.text.pdf;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
        public static byte[] CreatePdfFile()
        {
            using (var stream = new MemoryStream())
            {
                var document = new Document(PageSize.A4, 0f, 0f, 0f, 0f);
 
                var writer = PdfWriter.GetInstance(document, stream);
                document.Open();
 
                //设置图片大小和位置
                byte[] arr = Convert.FromBase64String(DataPdf.backgroundImg);
                Image image = Image.GetInstance(arr);
                image.ScaleToFit(document.PageSize.Width, document.PageSize.Height);
                image.SetAbsolutePosition(0, 0);
                //添加图片
                document.Add(image);
 
                //创建字体
                BaseFont baseFont = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                Font font = new Font(baseFont);
 
                //一个段落文本
                Paragraph paragraph = new Paragraph(@"asdas打算的!@#$%^&*()_
asd
 
asdasdasd
 
                    扯哦阿斯加德欧艾斯激动我按实际欧艾斯卷阿胜境的
 
熬时间大厦将颠
", font);
                 
                //添加段落
                document.Add(paragraph);
 
          //添加块到列
          var ct = new ColumnText(writer.DirectContent);
 
          ct.SetSimpleColumn(100, 150, 500, 800, 24, Element.ALIGN_LEFT);
 
          var chunk = new Chunk("啥的阿萨德阿萨德as阿萨德aaaaasdasfdawswd",font);
 
          ct.AddElement(chunk);
          ct.Go();
 
                //document.NewPage();
                //document.Add(new Phrase(""));
 
                //document.NewPage();
                //writer.PageEmpty = false;
 
                document.Close();
                return stream.ToArray();
            }
        }

  

学习文本(块,短语,段落)

https://www.mikesdotnetting.com/article/82/itextsharp-adding-text-with-chunks-phrases-and-paragraphs

 

-------------------后面补充2-----------------

 

块,短语和段落的文本

posted @   爱恋的红尘  阅读(3087)  评论(12编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示