首页 > 编程语言 >.NET C# 生成PDF

.NET C# 生成PDF

时间:2024-07-15 17:55:48浏览次数:19  
标签:C# pdf Add Paragraph new PDF NET document page

.NET C# 生成PDF

文章目录

1 安装 iText 7 库:

Install-Package itext7
Install-Package itext7.bouncy-castle-adapter

环境:itext7 8.0.4 | itext7.bouncy-castle-adapter 8.0.4

2 变量定义

// 定义PDF文件路径
const string pdfPath = "example.pdf";
// 定义字体文件路径
const string sunFontPath = @"C:\Windows\Fonts\simsun.ttc,0";
const string heiFontPath = @"C:\Windows\Fonts\simhei.ttf";
// 定义图片路径
const string imagePath = @"res\image.png";
const string cover1Path = @"res\c1.png";
const string cover2Path = @"res\c2.png";
const string cover3Path = @"res\c3.png";
// 定义PDF背景路径
const string backgroundPath = @"res\background.jpg";
// 创建字体
static PdfFont heiFont = PdfFontFactory.CreateFont(heiFontPath, PdfEncodings.IDENTITY_H);
static PdfFont sunFont = PdfFontFactory.CreateFont(sunFontPath, PdfEncodings.IDENTITY_H);

3 创建一个PDF

// 创建一个PDF writer
PdfWriter writer = new PdfWriter(pdfPath);
// 创建一个PDF document
PdfDocument pdf = new PdfDocument(writer);
// 创建一个Document
Document document = new Document(pdf, PageSize.A4);

4 段落

Paragraph paragraph = new Paragraph("这是一个段落。")
    .SetFont(heiFont)
    .SetFontSize(12)
    .SetTextAlignment(TextAlignment.LEFT);
document.Add(paragraph);

5 旋转文本

Paragraph rotatedText = new Paragraph("旋转的文本")
    .SetRotationAngle(Math.PI / 4)
    .SetFont(heiFont)
    .SetFontSize(12);
document.Add(rotatedText);

6 代码块

Paragraph codeBlock = new Paragraph()
    .Add(new Text("public static void main(String[] args)\n{\n"))
    .Add(new Tab())
    .Add(new Text("System.out.println(\"Hello, World!\");"))
    .Add(new Text("\n}"))
    .SetFont(PdfFontFactory.CreateFont(StandardFonts.COURIER))
    .SetFontSize(12)
    .SetBackgroundColor(new DeviceRgb(0xEE, 0xF0, 0xF4))
    .SetPadding(10)
    .SetBorderRadius(new BorderRadius(5));
document.Add(codeBlock);

7 外部链接

Text externalLink = new Link("访问网站", PdfAction.CreateURI("https://www.example.com")).SetFontColor(ColorConstants.BLUE).SetUnderline();
Paragraph linkParagraph = new Paragraph("这是一个带有外部链接的段落: ").SetFont(heiFont).Add(externalLink);
document.Add(linkParagraph);

8 内部链接

Paragraph paragraph = new Paragraph("内部链接")
    .SetTextAlignment(TextAlignment.LEFT)
    .SetFontSize(22)
    .SetBold()
    .SetFont(heiFont)
    .SetMarginBottom(20)
    .SetDestination("externalLink");
document.Add(paragraph);
// 添加标签
PdfOutline rootOutline = document.GetPdfDocument().GetOutlines(false);
PdfOutline firstSection = rootOutline.AddOutline(title);
firstSection.AddDestination(PdfDestination.MakeDestination(new PdfString(destination)));
PdfAction action = PdfAction.CreateGoTo("externalLink");
Text internalLink = new Link("跳转到 -> 外部连接", action).SetFontColor(ColorConstants.BLUE).SetUnderline();
Paragraph internalLinkParagraph = new Paragraph("这是一个带有内部链接的段落: ").SetFont(heiFont).Add(internalLink);
document.Add(internalLinkParagraph);

9 表格

// 创建表格(3 列)
Table table = new Table(UnitValue.CreatePercentArray(new float[] { 1, 1, 1 }))
    .UseAllAvailableWidth();
// 添加表头
table.AddHeaderCell(new Cell().Add(new Paragraph("表头 1").SetFont(heiFont)));
table.AddHeaderCell(new Cell().Add(new Paragraph("表头 2").SetFont(heiFont)));
table.AddHeaderCell(new Cell().Add(new Paragraph("表头 3").SetFont(heiFont)));
// 添加五行数据
for (int i = 1; i <= 5; i++)
{
    table.AddCell(new Cell().Add(new Paragraph("单元格 " + i + ", 1").SetFont(heiFont)));
    table.AddCell(new Cell().Add(new Paragraph("单元格 " + i + ", 2").SetFont(heiFont)));
    table.AddCell(new Cell().Add(new Paragraph("单元格 " + i + ", 3").SetFont(heiFont)));
}
document.Add(table);

10 注释

PdfAnnotation annotation = new PdfTextAnnotation(new Rectangle(100, 600, 0, 0))
    .SetOpen(true)
    .SetTitle(new PdfString("iText"))
    .SetContents(new PdfString("annotation content..."));
pdf.GetLastPage().AddAnnotation(annotation);

11 线条

LineSeparator ls = new LineSeparator(new SolidLine());
LineSeparator ls1 = new LineSeparator(new DashedLine());
LineSeparator ls2 = new LineSeparator(new DottedLine());

document.Add(ls);
document.Add(new Paragraph("\n"));
document.Add(ls1);
document.Add(new Paragraph("\n"));
document.Add(ls2);

12 二维码

Paragraph paragraph = new Paragraph("扫描访问网址:https://www.example.com")
    .SetFont(heiFont)
    .SetFontSize(12)
    .SetTextAlignment(TextAlignment.LEFT);
document.Add(paragraph);
BarcodeQRCode qrCode = new BarcodeQRCode("https://www.example.com");
PdfFormXObject barcodeObject = qrCode.CreateFormXObject(ColorConstants.BLACK, pdf);
Image barcodeImage = new Image(barcodeObject);
barcodeImage.SetWidth(100);
barcodeImage.SetHeight(100);
document.Add(barcodeImage);

13 嵌入图像

ImageData imageData = ImageDataFactory.Create(imagePath);
Image image = new Image(imageData);
document.Add(image);

14 列表

List list = new List()
    .SetSymbolIndent(12)
    .SetListSymbol("·")
    .SetFont(heiFont);
for (int i = 1; i < 6; i++)
{
    ListItem listItem = new ListItem($"条目 {i}");
    Paragraph paragraph = new Paragraph($"这里是条目 {i} 的内容。\n这里是条目 {i} 的内容。")
        .SetFont(heiFont)
        .SetFontSize(12)
        .SetBackgroundColor(new DeviceRgb(0xEE, 0xF0, 0xF4))
        .SetPadding(10)
        .SetBorderRadius(new BorderRadius(5));
    listItem.Add(paragraph);
    list.Add(listItem);
}
document.Add(list);

15 设置背景

// 加载背景图片
ImageData imageData = ImageDataFactory.Create(backgroundPath);
Image background = new Image(imageData);
// 设置背景图片的尺寸和位置
background.SetFixedPosition(0, 0);
background.SetWidth(pdf.GetDefaultPageSize().GetWidth());
background.SetHeight(pdf.GetDefaultPageSize().GetHeight());
PdfPage page = pdf.GetLastPage();
PdfCanvas canvas = new PdfCanvas(page);
canvas.AddImageFittedIntoRectangle(imageData, new Rectangle(0, 0, page.GetPageSize().GetWidth(), page.GetPageSize().GetHeight()), true);

16 页眉

PdfPage page = pdf.GetLastPage();
Rectangle pageSize = page.GetPageSize();
// 添加页眉文本
Canvas canvas = new Canvas(page, pageSize);
canvas.ShowTextAligned(new Paragraph("这里是页眉~~~").SetFont(heiFont),
    pageSize.GetWidth() / 2, pageSize.GetTop() - 25, TextAlignment.CENTER);
canvas.Close();

17 页脚

PdfPage page = pdf.GetLastPage();
Rectangle pageSize = page.GetPageSize();
// 添加页脚文本
Canvas canvas = new Canvas(page, pageSize);
Paragraph footer = new Paragraph("这里是页脚~~~")
    .SetFontSize(10)
    .SetFont(heiFont)
    .SetTextAlignment(TextAlignment.CENTER);
canvas.ShowTextAligned(footer,
    pageSize.GetWidth() / 2, pageSize.GetBottom() + 20, TextAlignment.CENTER);
canvas.Close();

18 事件

// 自动添加页码
pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, new FooterEventHandler());

public class FooterEventHandler : IEventHandler
{
    public void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
        PdfDocument pdfDoc = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        Rectangle pageSize = page.GetPageSize();
        // 添加页脚文本
        Canvas canvas = new Canvas(page, pageSize);
        int pageNumber = pdfDoc.GetPageNumber(page);
        Paragraph footer = new Paragraph($"第 {pageNumber} 页")
            .SetFont(heiFont)
            .SetFontSize(10)
            .SetTextAlignment(TextAlignment.RIGHT);
        canvas.ShowTextAligned(footer,
            pageSize.GetWidth() - 20, pageSize.GetBottom() + 20, TextAlignment.RIGHT);
        canvas.Close();
    }
}

19 水印

PdfPage page = pdf.GetLastPage();
Rectangle pageSize = page.GetPageSize();
// 添加水印文本
Canvas canvas = new Canvas(page, pageSize);
Paragraph watermark = new Paragraph("WineMonk")
    .SetFontSize(50)
    .SetFontColor(ColorConstants.LIGHT_GRAY)
    .SetBold()
    .SetTextAlignment(TextAlignment.CENTER);

float xStep = pageSize.GetWidth() / 3;
float yStep = pageSize.GetHeight() / 5;

for (float x = xStep / 2; x < pageSize.GetWidth(); x += xStep)
{
    for (float y = yStep / 2; y < pageSize.GetHeight(); y += yStep)
    {
        canvas.ShowTextAligned(
            watermark,
            x, y,
            pdf.GetPageNumber(page),
            TextAlignment.CENTER,
            VerticalAlignment.MIDDLE,
            0.8f);
    }
}
canvas.Close();

20 分栏

float offSet = 36;
PdfPage page = pdf.GetLastPage();
Rectangle ps = page.GetPageSize();
float columnWidth = (ps.GetWidth() - offSet * 2 + 10) / 3;
float columnHeight = ps.GetHeight() - offSet * 2 - 40;
Rectangle[] columns = new Rectangle[] {
    new Rectangle(offSet - 5, offSet, columnWidth, columnHeight),
    new Rectangle(offSet + columnWidth, offSet, columnWidth, columnHeight),
    new Rectangle(offSet + columnWidth * 2 + 5, offSet, columnWidth, columnHeight)
};
document.SetRenderer(new ColumnDocumentRenderer(document, columns));
Image conver1 = new Image(ImageDataFactory.Create(cover1Path)).SetWidth(columnWidth);
AddArticle(
    document,
    "硅基流动完成近亿元融资:加速生成式AI技术普惠进程",
    "作者:OneFlow_Official, 2024-07-05",
    conver1,
    "硅基流动(SiliconFlow)近日完成总金额近亿元人民币的天使+轮融资。本轮融资由某知名产业方领投,跟投方包括智谱AI、360 和水木清华校友基金等知名企业及机构,老股东耀途资本继续超额跟进,华兴资本担任独家财务顾问。\r\n\r\n本轮融资不仅是对硅基流动技术实力和市场前景的高度认可,也将为其未来发展提供强劲动力。创始人兼 CEO 袁进辉表示:“非常感谢各位投资方对硅基流动的信任和支持。这次融资将帮助我们进一步加快产品创新,为开发者提供触手可及的 AI 云服务,促进 AI 应用层的繁荣,推动 AGI 技术普惠化。”近两年,生成式 AI 和大模型技术爆发,使得 AI 基础设施(AI Infra)成为市场的关键一环。\r\n\r\n根据 Gartner 的报告,2023 年专用于 AI 工作负载的芯片创造近 534 亿美元的收入,占据了AGI产业中的大部分价值。而未来随着模型提升、架构改进和定制芯片等降本提效措施的实施,AI 应用的盈利能力将逐步提高,AI 应用层的价值将逐步显现,在这一进程中,离开发者最近的 AI Infra 生态位具备显著优势。\r\n \r\n\r\nAI Infra天然提供了应用开发者与硬件、模型之间的桥梁,不仅能提升开发效率和释放创新能力,还有效应对了市场对高性能和低成本 AI 解决方案的强烈需求。\r\n \r\n\r\n历史一再证明,“得开发者得天下”,最接近用户的生态位能够最快响应市场变化和用户需求。硅基流动就瞄准了AI Infra 生态位的机会,通过技术创新,大幅降低了 AI 应用的开发和使用门槛,凭借创新的技术和领先的产品,迅速崛起,成为 AI Infra 领域的重要玩家。");

Image conver2 = new Image(ImageDataFactory.Create(cover2Path)).SetWidth(columnWidth);
AddArticle(
    document,
    "国产大模型新标杆!比肩GPT4,DeepSeek V2重磅升级",
    "作者:OneFlow_Official, 2024-07-03",
    conver2,
    "近日,深度求索团队更新了DeepSeek-V2模型,新版本DeepSeek-V2-Chat模型推理能力有了极大提升。尤其在数学解题、逻辑推理、编程、指令跟随、Json格式输出不同维度上,最高有16%的性能提升。\r\n\r\n在Arena-Hard测评中,DeepSeek-V2-Chat与GPT-4-0314的对战胜率从41.6%提升到了68.3%。DeepSeek-V2-Chat模型的角色扮演能力显著增强,可以在对话中按要求扮演不同角色。\r\n\r\n此外,深度求索团队对DeepSeek-V2-Chat的“system”区域指令跟随能力进行了优化,显著增强了沉浸式翻译、RAG 等任务的用户体验。短短半年,深度求索团队的进步堪称神速。\r\n\r\n今年1月,他们开源了国内首个MoE模型,随后在5月初发布了最强开源MoE模型DeepSeek-V2,6月中旬,他们发布了代码生成能力超越GPT4-Turbo的DeepSeek Coder V2。\r\n\r\n这一次,DeepSeek-V2-Chat在各方面或比肩GPT4,至少是国产大模型的新标杆。\r\n\r\n据官方此前介绍,DeepSeek-V2系列模型采用了全新的模型结构。DeepSeek V2没有沿用主流的“类LLaMA的Dense结构”和“类Mistral的Sparse结构”,而是对模型框架进行了全方位的创新,提出了媲美MHA的MLA(Multi-head Latent Attention)架构,大幅减少计算量和推理显存;自研Sparse结构DeepSeekMoE进一步将计算量降低到极致,两者结合最终实现模型性能跨级别的提升。");

Image conver3 = new Image(ImageDataFactory.Create(cover3Path)).SetWidth(columnWidth);
AddArticle(
    document,
    "CVPR最佳论文:谷歌基于Spectral Volume从单图生成视频",
    "作者:AI记忆, 2024-06-21",
    conver3,
    "本文提出了一种新颖的方法来模拟场景运动的图像空间先验。通过从真实视频序列中提取的自然振荡动态(如树木、花朵、蜡烛和衣物随风摆动)学习运动轨迹,作者将长期运动建模为傅里叶域中的频谱体积。给定单张图片,训练好的模型使用频率协调的扩散采样过程预测频谱体积,进而转换为整个视频的运动纹理。结合基于图像的渲染模块,预测的运动表示可以用于多种应用,例如将静态图像转换为无缝循环视频,或允许用户与真实图像中的对象进行交互,产生逼真的模拟动态。");
public static void AddArticle(Document doc, string title, string author, Image img, string text)
{
    Paragraph p1 = new Paragraph(title)
        .SetFont(heiFont)
        .SetFontSize(14);
    doc.Add(p1);
    doc.Add(img);
    Paragraph p2 = new Paragraph()
        .SetFont(heiFont)
        .SetFontSize(7)
        .SetFontColor(ColorConstants.GRAY)
        .Add(author);
    doc.Add(p2);
    Paragraph p3 = new Paragraph()
        .SetFont(sunFont)
        .SetFontSize(10)
        .Add(text);
    doc.Add(p3);
}

21 源码

using iText.Barcodes;
using iText.IO.Font;
using iText.IO.Font.Constants;
using iText.IO.Image;
using iText.Kernel.Colors;
using iText.Kernel.Events;
using iText.Kernel.Font;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Action;
using iText.Kernel.Pdf.Annot;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Canvas.Draw;
using iText.Kernel.Pdf.Navigation;
using iText.Kernel.Pdf.Xobject;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;

namespace TestIText
{
    class Program
    {
        // 定义PDF文件路径
        const string pdfPath = "example.pdf";
        // 定义字体文件路径
        const string sunFontPath = @"C:\Windows\Fonts\simsun.ttc,0";
        const string heiFontPath = @"C:\Windows\Fonts\simhei.ttf";
        // 定义图片路径
        const string imagePath = @"res\image.png";
        const string cover1Path = @"res\c1.png";
        const string cover2Path = @"res\c2.png";
        const string cover3Path = @"res\c3.png";
        // 定义PDF背景路径
        const string backgroundPath = @"res\background.jpg";
        // 创建字体
        static PdfFont heiFont = PdfFontFactory.CreateFont(heiFontPath, PdfEncodings.IDENTITY_H);
        static PdfFont sunFont = PdfFontFactory.CreateFont(sunFontPath, PdfEncodings.IDENTITY_H);

        static void AddTitle(Document document, string title, string destination)
        {
            // 添加标题
            Paragraph paragraph = new Paragraph(title)
                .SetTextAlignment(TextAlignment.LEFT)
                .SetFontSize(22)
                .SetBold()
                .SetFont(heiFont)
                .SetMarginBottom(20)
                .SetDestination(destination);
            document.Add(paragraph);
            // 添加标签
            PdfOutline rootOutline = document.GetPdfDocument().GetOutlines(false);
            PdfOutline firstSection = rootOutline.AddOutline(title);
            firstSection.AddDestination(PdfDestination.MakeDestination(new PdfString(destination)));
        }

        static void Main()
        {
            // 创建一个PDF writer
            PdfWriter writer = new PdfWriter(pdfPath);
            // 创建一个PDF document
            PdfDocument pdf = new PdfDocument(writer);
            // 创建一个Document
            Document document = new Document(pdf, PageSize.A4);

            // 自动添加页码
            pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, new FooterEventHandler());

            AddParagraph(document);

            AddTable(document);

            AddRotatedText(document);

            AddCodeBlock(document);

            AddAnnotation(pdf, document);

            AddExternalLink(document);

            AddInternalLink(document);

            AddLine(document);

            AddQRCode(pdf, document);

            AddImage(document);

            AddList(document);

            AddBackground(pdf, document);

            AddPageHeader(pdf, document);

            AddPageFooter(pdf, document);

            AddWatermark(pdf, document);

            AddSubfield(pdf, document);

            // 关闭文档
            document.Close();
        }

        private static void AddSubfield(PdfDocument pdf, Document document)
        {
            AddTitle(document, "分栏", "subfield");
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
            float offSet = 36;
            PdfPage page = pdf.GetLastPage();
            Rectangle ps = page.GetPageSize();
            float columnWidth = (ps.GetWidth() - offSet * 2 + 10) / 3;
            float columnHeight = ps.GetHeight() - offSet * 2 - 40;
            Rectangle[] columns = new Rectangle[] {
                new Rectangle(offSet - 5, offSet, columnWidth, columnHeight),
                new Rectangle(offSet + columnWidth, offSet, columnWidth, columnHeight),
                new Rectangle(offSet + columnWidth * 2 + 5, offSet, columnWidth, columnHeight)
            };
            document.SetRenderer(new ColumnDocumentRenderer(document, columns));
            Image conver1 = new Image(ImageDataFactory.Create(cover1Path)).SetWidth(columnWidth);
            AddArticle(
                document,
                "硅基流动完成近亿元融资:加速生成式AI技术普惠进程",
                "作者:OneFlow_Official, 2024-07-05",
                conver1,
                "硅基流动(SiliconFlow)近日完成总金额近亿元人民币的天使+轮融资。本轮融资由某知名产业方领投,跟投方包括智谱AI、360 和水木清华校友基金等知名企业及机构,老股东耀途资本继续超额跟进,华兴资本担任独家财务顾问。\r\n\r\n本轮融资不仅是对硅基流动技术实力和市场前景的高度认可,也将为其未来发展提供强劲动力。创始人兼 CEO 袁进辉表示:“非常感谢各位投资方对硅基流动的信任和支持。这次融资将帮助我们进一步加快产品创新,为开发者提供触手可及的 AI 云服务,促进 AI 应用层的繁荣,推动 AGI 技术普惠化。”近两年,生成式 AI 和大模型技术爆发,使得 AI 基础设施(AI Infra)成为市场的关键一环。\r\n\r\n根据 Gartner 的报告,2023 年专用于 AI 工作负载的芯片创造近 534 亿美元的收入,占据了AGI产业中的大部分价值。而未来随着模型提升、架构改进和定制芯片等降本提效措施的实施,AI 应用的盈利能力将逐步提高,AI 应用层的价值将逐步显现,在这一进程中,离开发者最近的 AI Infra 生态位具备显著优势。\r\n \r\n\r\nAI Infra天然提供了应用开发者与硬件、模型之间的桥梁,不仅能提升开发效率和释放创新能力,还有效应对了市场对高性能和低成本 AI 解决方案的强烈需求。\r\n \r\n\r\n历史一再证明,“得开发者得天下”,最接近用户的生态位能够最快响应市场变化和用户需求。硅基流动就瞄准了AI Infra 生态位的机会,通过技术创新,大幅降低了 AI 应用的开发和使用门槛,凭借创新的技术和领先的产品,迅速崛起,成为 AI Infra 领域的重要玩家。");

            Image conver2 = new Image(ImageDataFactory.Create(cover2Path)).SetWidth(columnWidth);
            AddArticle(
                document,
                "国产大模型新标杆!比肩GPT4,DeepSeek V2重磅升级",
                "作者:OneFlow_Official, 2024-07-03",
                conver2,
                "近日,深度求索团队更新了DeepSeek-V2模型,新版本DeepSeek-V2-Chat模型推理能力有了极大提升。尤其在数学解题、逻辑推理、编程、指令跟随、Json格式输出不同维度上,最高有16%的性能提升。\r\n\r\n在Arena-Hard测评中,DeepSeek-V2-Chat与GPT-4-0314的对战胜率从41.6%提升到了68.3%。DeepSeek-V2-Chat模型的角色扮演能力显著增强,可以在对话中按要求扮演不同角色。\r\n\r\n此外,深度求索团队对DeepSeek-V2-Chat的“system”区域指令跟随能力进行了优化,显著增强了沉浸式翻译、RAG 等任务的用户体验。短短半年,深度求索团队的进步堪称神速。\r\n\r\n今年1月,他们开源了国内首个MoE模型,随后在5月初发布了最强开源MoE模型DeepSeek-V2,6月中旬,他们发布了代码生成能力超越GPT4-Turbo的DeepSeek Coder V2。\r\n\r\n这一次,DeepSeek-V2-Chat在各方面或比肩GPT4,至少是国产大模型的新标杆。\r\n\r\n据官方此前介绍,DeepSeek-V2系列模型采用了全新的模型结构。DeepSeek V2没有沿用主流的“类LLaMA的Dense结构”和“类Mistral的Sparse结构”,而是对模型框架进行了全方位的创新,提出了媲美MHA的MLA(Multi-head Latent Attention)架构,大幅减少计算量和推理显存;自研Sparse结构DeepSeekMoE进一步将计算量降低到极致,两者结合最终实现模型性能跨级别的提升。");

            Image conver3 = new Image(ImageDataFactory.Create(cover3Path)).SetWidth(columnWidth);
            AddArticle(
                document,
                "CVPR最佳论文:谷歌基于Spectral Volume从单图生成视频",
                "作者:AI记忆, 2024-06-21",
                conver3,
                "本文提出了一种新颖的方法来模拟场景运动的图像空间先验。通过从真实视频序列中提取的自然振荡动态(如树木、花朵、蜡烛和衣物随风摆动)学习运动轨迹,作者将长期运动建模为傅里叶域中的频谱体积。给定单张图片,训练好的模型使用频率协调的扩散采样过程预测频谱体积,进而转换为整个视频的运动纹理。结合基于图像的渲染模块,预测的运动表示可以用于多种应用,例如将静态图像转换为无缝循环视频,或允许用户与真实图像中的对象进行交互,产生逼真的模拟动态。");
        }

        public static void AddArticle(Document doc, string title, string author, Image img, string text)
        {
            Paragraph p1 = new Paragraph(title)
                .SetFont(heiFont)
                .SetFontSize(14);
            doc.Add(p1);
            doc.Add(img);
            Paragraph p2 = new Paragraph()
                .SetFont(heiFont)
                .SetFontSize(7)
                .SetFontColor(ColorConstants.GRAY)
                .Add(author);
            doc.Add(p2);
            Paragraph p3 = new Paragraph()
                .SetFont(sunFont)
                .SetFontSize(10)
                .Add(text);
            doc.Add(p3);
        }

        private static void AddWatermark(PdfDocument pdf, Document document)
        {
            PdfPage page = pdf.GetLastPage();
            Rectangle pageSize = page.GetPageSize();
            // 添加水印文本
            Canvas canvas = new Canvas(page, pageSize);
            Paragraph watermark = new Paragraph("WineMonk")
                .SetFontSize(50)
                .SetFontColor(ColorConstants.LIGHT_GRAY)
                .SetBold()
                .SetTextAlignment(TextAlignment.CENTER);

            float xStep = pageSize.GetWidth() / 3;
            float yStep = pageSize.GetHeight() / 5;

            for (float x = xStep / 2; x < pageSize.GetWidth(); x += xStep)
            {
                for (float y = yStep / 2; y < pageSize.GetHeight(); y += yStep)
                {
                    canvas.ShowTextAligned(
                        watermark,
                        x, y,
                        pdf.GetPageNumber(page),
                        TextAlignment.CENTER,
                        VerticalAlignment.MIDDLE,
                        0.8f);
                }
            }
            canvas.Close();
            AddTitle(document, "水印", "watermark");
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddPageFooter(PdfDocument pdf, Document document)
        {
            AddTitle(document, "页脚", "pageFooter");
            PdfPage page = pdf.GetLastPage();
            Rectangle pageSize = page.GetPageSize();
            // 添加页脚文本
            Canvas canvas = new Canvas(page, pageSize);
            Paragraph footer = new Paragraph("这里是页脚~~~")
                .SetFontSize(10)
                .SetFont(heiFont)
                .SetTextAlignment(TextAlignment.CENTER);
            canvas.ShowTextAligned(footer,
                pageSize.GetWidth() / 2, pageSize.GetBottom() + 20, TextAlignment.CENTER);
            canvas.Close();
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddPageHeader(PdfDocument pdf, Document document)
        {
            AddTitle(document, "页眉", "pageHeader");
            PdfPage page = pdf.GetLastPage();
            Rectangle pageSize = page.GetPageSize();
            // 添加页眉文本
            Canvas canvas = new Canvas(page, pageSize);
            canvas.ShowTextAligned(new Paragraph("这里是页眉~~~").SetFont(heiFont),
                pageSize.GetWidth() / 2, pageSize.GetTop() - 25, TextAlignment.CENTER);
            canvas.Close();
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddBackground(PdfDocument pdf, Document document)
        {
            // 加载背景图片
            ImageData imageData = ImageDataFactory.Create(backgroundPath);
            Image background = new Image(imageData);
            // 设置背景图片的尺寸和位置
            background.SetFixedPosition(0, 0);
            background.SetWidth(pdf.GetDefaultPageSize().GetWidth());
            background.SetHeight(pdf.GetDefaultPageSize().GetHeight());
            PdfPage page = pdf.GetLastPage();
            PdfCanvas canvas = new PdfCanvas(page);
            canvas.AddImageFittedIntoRectangle(imageData, new Rectangle(0, 0, page.GetPageSize().GetWidth(), page.GetPageSize().GetHeight()), true);
            AddTitle(document, "设置背景", "background");
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddList(Document document)
        {
            AddTitle(document, "列表", "list");
            List list = new List()
                .SetSymbolIndent(12)
                .SetListSymbol("·")
                .SetFont(heiFont);
            for (int i = 1; i < 6; i++)
            {
                ListItem listItem = new ListItem($"条目 {i}");
                Paragraph paragraph = new Paragraph($"这里是条目 {i} 的内容。\n这里是条目 {i} 的内容。")
                    .SetFont(heiFont)
                    .SetFontSize(12)
                    .SetBackgroundColor(new DeviceRgb(0xEE, 0xF0, 0xF4))
                    .SetPadding(10)
                    .SetBorderRadius(new BorderRadius(5));
                listItem.Add(paragraph);
                list.Add(listItem);
            }
            document.Add(list);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddImage(Document document)
        {
            AddTitle(document, "嵌入图像", "image");
            ImageData imageData = ImageDataFactory.Create(imagePath);
            Image image = new Image(imageData);
            document.Add(image);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddQRCode(PdfDocument pdf, Document document)
        {
            AddTitle(document, "二维码", "qrCode");
            Paragraph paragraph = new Paragraph("扫描访问网址:https://www.example.com")
                .SetFont(heiFont)
                .SetFontSize(12)
                .SetTextAlignment(TextAlignment.LEFT);
            document.Add(paragraph);
            BarcodeQRCode qrCode = new BarcodeQRCode("https://www.example.com");
            PdfFormXObject barcodeObject = qrCode.CreateFormXObject(ColorConstants.BLACK, pdf);
            Image barcodeImage = new Image(barcodeObject);
            barcodeImage.SetWidth(100);
            barcodeImage.SetHeight(100);
            document.Add(barcodeImage);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddLine(Document document)
        {
            AddTitle(document, "线条", "line");
            LineSeparator ls = new LineSeparator(new SolidLine());
            LineSeparator ls1 = new LineSeparator(new DashedLine());
            LineSeparator ls2 = new LineSeparator(new DottedLine());

            document.Add(ls);
            document.Add(new Paragraph("\n"));
            document.Add(ls1);
            document.Add(new Paragraph("\n"));
            document.Add(ls2);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddInternalLink(Document document)
        {
            AddTitle(document, "内部链接", "internalLink");
            PdfAction action = PdfAction.CreateGoTo("externalLink");
            Text internalLink = new Link("跳转到 -> 外部连接", action).SetFontColor(ColorConstants.BLUE).SetUnderline();
            Paragraph internalLinkParagraph = new Paragraph("这是一个带有内部链接的段落: ").SetFont(heiFont).Add(internalLink);
            document.Add(internalLinkParagraph);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddExternalLink(Document document)
        {
            AddTitle(document, "外部链接", "externalLink");
            Text externalLink = new Link("访问网站", PdfAction.CreateURI("https://www.example.com")).SetFontColor(ColorConstants.BLUE).SetUnderline();
            Paragraph linkParagraph = new Paragraph("这是一个带有外部链接的段落: ").SetFont(heiFont).Add(externalLink);
            document.Add(linkParagraph);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddAnnotation(PdfDocument pdf, Document document)
        {
            AddTitle(document, "注释", "annotation");
            PdfAnnotation annotation = new PdfTextAnnotation(new Rectangle(100, 600, 0, 0))
                .SetOpen(true)
                .SetTitle(new PdfString("iText"))
                .SetContents(new PdfString("annotation content..."));
            pdf.GetLastPage().AddAnnotation(annotation);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddCodeBlock(Document document)
        {
            AddTitle(document, "代码块", "codeBlock");
            Paragraph codeBlock = new Paragraph()
                .Add(new Text("public static void main(String[] args)\n{\n"))
                .Add(new Tab())
                .Add(new Text("System.out.println(\"Hello, World!\");"))
                .Add(new Text("\n}"))
                .SetFont(PdfFontFactory.CreateFont(StandardFonts.COURIER))
                .SetFontSize(12)
                .SetBackgroundColor(new DeviceRgb(0xEE, 0xF0, 0xF4))
                .SetPadding(10)
                .SetBorderRadius(new BorderRadius(5));
            document.Add(codeBlock);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddRotatedText(Document document)
        {
            AddTitle(document, "旋转文本", "rotatedText");
            Paragraph rotatedText = new Paragraph("旋转的文本")
                .SetRotationAngle(Math.PI / 4)
                .SetFont(heiFont)
                .SetFontSize(12);
            document.Add(rotatedText);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddTable(Document document)
        {
            AddTitle(document, "表格", "table");
            // 创建表格(3 列)
            Table table = new Table(UnitValue.CreatePercentArray(new float[] { 1, 1, 1 }))
                .UseAllAvailableWidth();
            // 添加表头
            table.AddHeaderCell(new Cell().Add(new Paragraph("表头 1").SetFont(heiFont)));
            table.AddHeaderCell(new Cell().Add(new Paragraph("表头 2").SetFont(heiFont)));
            table.AddHeaderCell(new Cell().Add(new Paragraph("表头 3").SetFont(heiFont)));
            // 添加五行数据
            for (int i = 1; i <= 5; i++)
            {
                table.AddCell(new Cell().Add(new Paragraph("单元格 " + i + ", 1").SetFont(heiFont)));
                table.AddCell(new Cell().Add(new Paragraph("单元格 " + i + ", 2").SetFont(heiFont)));
                table.AddCell(new Cell().Add(new Paragraph("单元格 " + i + ", 3").SetFont(heiFont)));
            }
            document.Add(table);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        private static void AddParagraph(Document document)
        {
            AddTitle(document, "段落", "paragraph");
            Paragraph paragraph = new Paragraph("这是一个段落。")
                .SetFont(heiFont)
                .SetFontSize(12)
                .SetTextAlignment(TextAlignment.LEFT);
            document.Add(paragraph);
            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }

        public class FooterEventHandler : IEventHandler
        {
            public void HandleEvent(Event @event)
            {
                PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
                PdfDocument pdfDoc = docEvent.GetDocument();
                PdfPage page = docEvent.GetPage();
                Rectangle pageSize = page.GetPageSize();
                // 添加页脚文本
                Canvas canvas = new Canvas(page, pageSize);
                int pageNumber = pdfDoc.GetPageNumber(page);
                Paragraph footer = new Paragraph($"第 {pageNumber} 页")
                    .SetFont(heiFont)
                    .SetFontSize(10)
                    .SetTextAlignment(TextAlignment.RIGHT);
                canvas.ShowTextAligned(footer,
                    pageSize.GetWidth() - 20, pageSize.GetBottom() + 20, TextAlignment.RIGHT);
                canvas.Close();
            }
        }
    }
}

源码地址 - Demo/iText/TestIText at master · WineMonk/Demo (github.com)

标签:C#,pdf,Add,Paragraph,new,PDF,NET,document,page
From: https://blog.csdn.net/szy13323042191/article/details/140445350

相关文章

  • Structure of Linux Kernel Device Driver(Part I)
    StructureofLinuxKernelDeviceDriverref.https://www.youtube.com/watch?v=XoYkHUnmpQo&list=LL&index=1&t=272sDeviceDriversDef.:设备驱动(DeviceDrivers),实际上就是硬件设备对应的抽象,用户能够通过这样的一个抽象与对应的硬件进行交互设备驱动与固件的区别:设备驱......
  • 虚树复习 & O(1) 查询 LCA
    放假是不可能做题的。那就写总结把。虚树问题的情境涉及多次树上询问,每次指定一些点,让你计算。此类问题需要我们在线地找到尽可能少的【关键点】进行计算,最好和给的点级别一样。虚树的思想就是这个过程。二次排序一个关键直觉:【指定点】两两的LCA一定是【关键点】。并且......
  • 从0到1打造一个 WebRTC 应用
    ......
  • K8S 中的 CRI、OCI、CRI shim、containerd
    哈喽大家好,我是咸鱼。好久没发文了,最近这段时间都在学K8S。不知道大家是不是和咸鱼一样,刚开始学K8S、Docker的时候,往往被CRI、OCI、CRIshim、containerd这些名词搞得晕乎乎的,不清楚它们到底是干什么用的。所以今天,咸鱼打算借这篇文章来解释一下这些名词,帮助大家理清它们的......
  • 【C/C++】结构体内存对齐
    结构体内存对齐详解1、第一个成员在与结构体变量偏移量为0的地址处2、其他成员变量要偏移到对齐数的整数倍的地址处,注意偏移是从结构体首地址处开始的。对齐数取的是编译器默认的一个对齐数与该成员大小 这个俩个数中的最小值。【VS中默认的值为8、Linu......
  • connect 脚本
    `procedure(ContInOrder()prog((OBJ1OBJ2obj1obj2VlineHlineHWVWHBPVBPxHBPyHBPxHEPyHEPxVBPyVBPxVEPyVEPSpace1Space2Space3Space4LeftDownLeftUpRightUpRightDownTechFileCGroupIdMyViaOptionsWindowNum1Num2BigNumSmallNumNEWVIAS)......
  • Turtlebot3在ROS Gazebo中使用OpenCV检测并跟踪球体
    原文链接:https://www.youtube.com/watch?v=Rw6ATkORRG8   一个小巧的机器人在虚拟世界中敏捷地追踪着一个滚动的球体。Turtlebot3,一个搭载ROS操作系统的智能机器人,在Gazebo仿真环境中,利用OpenCV的神奇力量,展现出令人惊叹的视觉追踪能力。 Turtlebot3的"眼睛"是一台高清......
  • cout的使用
    C++语句结构#include"iostream"usingnamespacestd;intmain(){return0;}cout结构cout<<...<<...<<...<<endl;非数字,用""包裹数字可以""包围,也可以不包围输出单份内容cout<<"hello,word!"......
  • Scrum学习心得
       作为一种敏捷开发框架,强调团队的协作、快速响应变化以及持续的价值交付, Scrum迭代开发模式让我印象深刻。   Scrum将项目分解为短周期的迭代,每个迭代都能产生可交付的成果,这不仅能够及时获得用户反馈,还能够让团队根据实际情况迅速调整方向,避免了在错误的道路上走......
  • C35 空气污染和暴露其中的人口(Part 7)
    导读在过去的几十年里,我们越来越多地接触到一系列监测地球大气成分的卫星传感器。然而,重要的是要注意,卫星测量的是对流层和平流层的污染物浓度,对流层和平流层在地球表面以上延伸许多公里。因此,卫星测量不一定代表人类在地面上接触到的浓度,因此不建议仅依靠卫星数据进行人类健康应......