如何在C#中借助IKVM与PDFBox将System.Drawing.Bitmap转为java.awt.image.BufferedImage
在C#中用IKVM+PDFBox实现图片转PDF的解决方案
我来帮你搞定这个转换问题——在IKVM环境下把System.Drawing.Bitmap转成java.awt.image.BufferedImage其实有现成的工具类,不用自己手动处理像素数据,下面是完整的实现方案:
核心步骤说明
首先要确保你引用了IKVM.AWT.WinForms.dll这个程序集,它里面的BitmapConverter类专门负责.NET和Java的图像格式互转,这是解决问题的关键。
完整代码示例
using System.Drawing; using java.awt.image; using org.apache.pdfbox.pdmodel; using org.apache.pdfbox.pdmodel.graphics.image; using org.apache.pdfbox.pdmodel.common; using IKVM.AWT.WinForms; // 必须引入这个命名空间 class Program { static void Main(string[] args) { // 初始化PDF文档和页面 using (PDDocument document = new PDDocument()) { PDPage page = new PDPage(); document.addPage(page); using (PDPageContentStream contentStream = new PDPageContentStream(document, page)) { string imgLoc = @"C:\your-image-path.jpg"; // 替换成你的图片路径 // 使用using语句确保Bitmap资源被正确释放 using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(imgLoc)) { // 核心转换:把.NET Bitmap转成Java BufferedImage BufferedImage bufImg = BitmapConverter.ToBufferedImage(bitmap); // 用PDJpeg创建PDF可识别的图像对象(新版PDFBox也可以用PDImageXObject) PDJpeg img = new PDJpeg(document, bufImg); // 绘制图片到PDF指定位置(x=50, y=50) contentStream.drawImage(img, 50, 50); } } // 保存PDF文件 document.save(@"C:\output-accessible.pdf"); } } }
额外注意事项
- 版本兼容性:要确保IKVM的版本和你使用的PDFBox版本匹配,避免出现类找不到或方法不兼容的问题。
- 新版PDFBox推荐用法:如果你使用的是较新的PDFBox版本,更推荐使用
PDImageXObject来替代PDJpeg,代码更通用:PDImageXObject img = PDImageXObject.createFromBufferedImage(document, bufImg); contentStream.drawImage(img, 50, 50); - 资源释放:处理图片时一定要用
using语句包裹Bitmap和PDPageContentStream,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Briyatis




