如何使用Magick.NET在PDF文件上添加文字?附相关批处理示例
嘿,既然你已经有ImageMagick的使用经验,转用Magick.NET给PDF加文字其实没啥门槛!核心逻辑和你之前写的批处理是通的,只不过换成了C#(或VB.NET)代码实现。我给你拆解下关键步骤和实用示例:
第一步:安装Magick.NET包
首先得通过NuGet安装对应的Magick.NET包,推荐安装带Ghostscript依赖的版本(因为PDF处理依赖Ghostscript):
- 如果你用的是.NET Framework,安装
Magick.NET-Q16-AnyCPU - 如果你用的是.NET Core/.NET 5+,安装
Magick.NET-Q16-AnyCPU.Core
单页PDF添加文字示例
这是最基础的场景,指定单页PDF并添加文字:
using ImageMagick; // 设置PDF读取参数,300DPI保证文字清晰,指定要处理的页码 var readSettings = new MagickReadSettings { Density = new Density(300, 300), Page = 1 // 页码从1开始 }; // 加载目标PDF页 using (var pdfPage = new MagickImage(@"C:\PDF\your_file.pdf", readSettings)) { // 定义文字样式和位置 var textDrawables = new Drawables() .Font("Arial") // 系统中存在的字体名称 .FontPointSize(14) .FillColor(MagickColors.DarkBlue) // 文字颜色 .Text(60, 60, "这是添加的自定义文字"); // x,y坐标(左上角为原点) // 把文字绘制到PDF页上 pdfPage.Draw(textDrawables); // 保存修改后的文件 pdfPage.Write(@"C:\PDF\your_file_with_text.pdf"); }
多页PDF批量添加文字
如果要给PDF的每一页都加上相同的文字,用MagickImageCollection来处理更高效:
using ImageMagick; var readSettings = new MagickReadSettings { Density = new Density(300, 300) // 全局设置解析密度 }; // 加载整个PDF文档 using (var pdfCollection = new MagickImageCollection(@"C:\PDF\multi_page.pdf", readSettings)) { // 定义统一的文字样式 var textDrawables = new Drawables() .Font("Microsoft YaHei") // 用中文字体的话要确保系统有安装 .FontPointSize(12) .FillColor(new MagickColor(0.6, 0, 0, 0)) // 半透明红色(RGBA,最后一位是透明度) .TextAlignment(TextAlignment.Right) // 文字右对齐 .Text(pdfCollection[0].Width - 40, pdfCollection[0].Height - 40, "页面右下角的水印"); // 遍历每一页添加文字 foreach (var page in pdfCollection) { page.Draw(textDrawables); } // 保存修改后的完整PDF pdfCollection.Write(@"C:\PDF\multi_page_with_watermark.pdf"); }
几个实用的进阶技巧
- 字体自定义:如果系统没有你需要的字体,可以直接指定字体文件路径:
textDrawables.Font(@"C:\Fonts\CustomFont.ttf"); - 文字样式增强:可以设置加粗、斜体等样式:
textDrawables.FontWeight(FontWeight.Bold) .FontStyle(FontStyle.Italic); - 坐标精准控制:可以通过页面的宽高计算相对位置,比如居中显示文字:
var centerX = pdfPage.Width / 2; var centerY = pdfPage.Height / 2; textDrawables.TextAlignment(TextAlignment.Center) .Text(centerX, centerY, "居中显示的文字");
和你批处理代码的对应关系
其实Magick.NET的API就是把命令行参数封装成了类和方法,比如你批处理里的:
convert -density 300→ 对应代码里的Density = new Density(300, 300)-font Arial -fill black -draw "text 50,50 'xxx'"→ 对应Drawables里的Font()、FillColor()、Text()方法
内容的提问来源于stack exchange,提问作者Ghidus Miclaus




