.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF

文章目錄

  • .NET C# 使用 iText 生成PDF
    • 1 安裝 iText 7 庫:
    • 2 變量定義
    • 3 創建一個PDF
    • 4 段落
    • 5 旋轉文本
    • 6 代碼塊
    • 7 外部鏈接
    • 8 內部鏈接
    • 9 表格
    • 10 注釋
    • 11 線條
    • 12 二維碼
    • 13 嵌入圖像
    • 14 列表
    • 15 設置背景
    • 16 頁眉
    • 17 頁腳
    • 18 事件
    • 19 水印
    • 20 分欄
    • 21 源碼

本文章代碼PDF生成樣例:example.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 writerPdfWriter writer = new PdfWriter(pdfPath);// 創建一個PDF documentPdfDocument pdf = new PdfDocument(writer);// 創建一個DocumentDocument 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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46396.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

老古董Lisp(1):粗魯先生Lisp再出發

粗魯先生Lisp再出發 開始的原因 目標和夢想是最近考慮的一個問題。什么是目標&#xff1f;什么是夢想&#xff1f;夢想可以激勵改變&#xff0c;目標才能實現改變。 開始這個部分的時候&#xff0c;我的夢想是什么&#xff1f;我的目標是什么&#xff1f;我想要什么&#xf…

libwebrtc.a+exosip連接fS 環境部署tips

//運行FS服務器 sudo ./freeswitch -nc -nonat //公網sudo ./freeswitch //運行客戶端 sudo ./fs_cli //加載模塊 load mod_av load mod_verto0.Invite交互過程 1.fs碼率設置 2.用戶密碼改動 3.數字簽名的摘要 4.FS收不到ACK 5.公網部署 6.查看frewswitch都占用哪些端口 7.日志…

Java(二十一)---棧的使用和模擬實現

文章目錄 前言1.什么是棧(Stack)?2. 棧的模擬實現3.stack的使用![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)4.關于棧的oj題4.1.有效的括號4.2.逆波蘭表達式4.3.棧的壓入、彈出序列4.4.最小棧 前言 前面幾篇我們學習了順序…

Vue--Router(路由)

目錄 一 Router(路由) 1.作用 2.實現步驟 3.注意 一 Router(路由) 1.作用 Router又叫做路由&#xff0c;簡單來說&#xff0c;就是用來實現vue的頁面之間跳轉的。 我們都知道&#xff0c;使用vue必然會涉及到很多個組件&#xff0c;也就是頁面&#xff0c;而頁面之間肯定需…

RK3588讀取不到顯示器edid

問題描述 3588HDMIout接老的顯示器或者HDMI轉DVI接DVI顯示器顯示不了或者顯示內容是彩色條紋,但是這種顯示器測試過如果接筆記本或者主機是可以直接顯示的。這一類問題是HDMI下的i2c與顯示器通訊沒成功,讀取不到設備的edid。問題包括全志的H3 、AML的S905都有遇到 測試環境…

Qt-事件與信號

事件和信號的區別在于&#xff0c;事件通常是由窗口系統或應用程序產生的&#xff0c;信號則是Qt定義或用戶自定義的。Qt為界面組件定義的信號往往通常是對事件的封裝&#xff0c;如QPushButton的clicked()信號可以看做對QEvent::MouseButtonRelease類事件的封裝。 在使用界面組…

【QGroundControl二次開發】二.使用QT編譯QGC(Windows)

【QGroundControl二次開發】一.開發環境準備&#xff08;Windows&#xff09; 二. 使用QT編譯QGC&#xff08;Windows&#xff09; 2.1 打開QT Creator&#xff0c;選擇打開項目&#xff0c;打開之前下載的QGC項目源碼。 編譯器選擇Desktop Qt 6.6.3 MSVC2019 64bit。 點擊運…

vue3-tree-org實現帶照片的組織架構圖

官方文檔&#xff1a;vue3-tree-org 顯示照片需要注意的地方 使用步驟 下載 npm install vue3-tree-org --save 在main.js中引入 import "vue3-tree-org/lib/vue3-tree-org.css"; import vue3TreeOrg from vue3-tree-org;app.use(vue3TreeOrg) 實現代碼 <tem…

level 6 day2 網絡基礎2

1.socket&#xff08;三種套接字&#xff1a;認真看&#xff09; 套接字就是在這個應用空間和內核空間的一個接口&#xff0c;如下圖 原始套接字可以從應用層直接訪問到網絡層&#xff0c;跳過了傳輸層&#xff0c;比如在ubtan里面直接ping 一個ip地址,他沒有經過TCP或者UDP的數…

解決TypeError: __init__() takes 1 positional argument but 2 were given

問題描述&#xff1a; 如下圖&#xff0c;在使用torch.nn.Sigmoid非線性激活時報錯 源代碼&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

記錄貼-芋道源碼

環境搭建 文字講解 鏈接: 芋道源碼-環境搭建&#xff08;一&#xff09;后端 鏈接: 芋道源碼-環境搭建&#xff08;二&#xff09;前端 鏈接: 基于FastGPT和芋道源碼挑戰一句話生成代碼 視頻講解 鏈接: 芋道源碼零基礎啟動教程&#xff08;上&#xff09; 鏈接: 芋道源碼零基…

Blackbox AI:你的智能編程伙伴

目錄 Blackbox AI 產品介紹 Blackbox AI 產品使用教程 Blackbox AI體驗 AI問答 代碼驗證 實時搜索 探索&代理 拓展集成 總結 Blackbox AI 產品介紹 Blackbox是專門為程序員量身定制的語言大模型&#xff0c;它針對20多種編程語言進行了特別訓練和深度優化&#xff0c;在AI代…

React 從入門到實戰 一一開發環境基礎搭建(小白篇)

React 從入門到實戰一一開發環境基礎搭建&#xff08;小白篇&#xff09; React 介紹什么是 react &#xff1f;react 主要功能react 框架特點 開發工具渲染測試 React 介紹 最近兩年&#xff0c;react 也愈來愈火熱&#xff0c;想要在里面分一杯羹&#xff0c;那肯定逃不過 r…

UFS協議

1. 名詞解釋 UFS: universal flash storage SCSI&#xff1a;小型計算機系統接口 SPC&#xff1a;SCSI Primary Commands SBC&#xff1a; SCSI Block Commands Application Client&#xff1a;作為主機中SCSI命令和任務管理功能請求源的實體。 Device Server&#xff1a;設備…

高級java每日一道面試題-2024年7月17日(java內存模型-后期完善)

面試官: 你對java內存模型了解多少? 我回答: Java內存模型&#xff08;JMM&#xff0c;Java Memory Model&#xff09;是Java虛擬機&#xff08;JVM&#xff09;規范的一部分&#xff0c;它定義了線程之間的內存可見性和并發執行時的原子性、有序性和可見性等特性。理解JMM對…

Windows下使用Cygwin創建rsync服務端

1 下載Cygwin 訪問官網Cygwin&#xff0c;點擊setup-X86_64.exe即可開始下載 2 安裝 前面全部默認。路徑可以自己選擇&#xff0c;站點選阿里云的&#xff0c;等待安裝即可 3 配置 使用打開Cygwin安裝后創建的快捷方式窗口&#xff0c;輸入下面的指令將windows用戶導入到cyg…

C語言中常見庫函數(1)——字符函數和字符串函數

文章目錄 前言1.字符分類函數2.字符轉換函數3.strlen的使用和模擬實現4.strcpy的使用和模擬實現5.strcat的使用和模擬實現6.strncmp的使用和模擬實現7.strncpy函數的使用8.strncat函數的使用9.strncmp函數的使用10.strstr的使用和模擬實現11.strtok函數的使用12.strerror函數的…

物聯網平臺有哪些?

隨著科技的不斷進步&#xff0c;物聯網&#xff08;IoT&#xff09;已經成為我們生活中不可或缺的一部分。物聯網平臺作為連接設備、數據和應用的橋梁&#xff0c;扮演著至關重要的角色。本文將介紹一些主流的物聯網平臺&#xff0c;并特別關注ThingsKit物聯網平臺。 物聯網平…

UE4-系統默認天空球的使用

當我們在調整平行光的時候&#xff0c;會發現場景中的光照改變了&#xff0c;但是太陽的位置并沒有改變&#xff0c;此時就需要用到系統默認的天空球中的&#xff1a; 但是只有在選中是由平行光的改變而改變的情況下才會發生改變&#xff0c;如果沒有選擇或者選擇其他的光源&am…

基恩士掃碼頭程序開發日記

需要獲取基恩士掃碼槍的掃描數據&#xff0c;并實現與access數據庫中的數據進行比對。 一. 引用 下到了的SDK&#xff0c;還選擇了Anycpu. 引用中添加了這個dll文件 Communication.dll Keyence.AutoID.SDK.dll VncClientControlCommon.dll using Keyence.AutoID.SDK; 二.遇到…