C#使用iText7将PNG转PDF时出现文件夹访问权限异常求助
问题核心
你触发访问被拒绝报错的根本原因是 ImageDataFactory.Create() 方法要求传入单个图片文件的完整路径,但你当前传入的是 SeleniumScreenshots 文件夹的路径,程序尝试将文件夹作为图片文件读取,自然会触发权限类错误,和文件夹权限配置、iText7的安装配置没有关系。
解决方案
根据你的需求分两种场景处理:
场景1:仅转换单张PNG图片
直接修改ORIG变量的值为具体PNG文件的完整路径即可,示例修正代码如下:
using System; using iText.IO.Image; using iText.Kernel.Pdf; using iText.Layout; using iText.Layout.Element; namespace TesingPDFConvert { internal class Program { // 建议用系统API动态获取Documents路径,避免硬编码用户名 private static string BASE_PATH = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\c_projects\"; // 此处改为具体的PNG文件路径 private static string IMAGE_PATH = BASE_PATH + @"SeleniumScreenshots\test_screenshot.png"; private static string OUTPUT_FOLDER = BASE_PATH + @"pdf_output\"; public static void Main(string[] args) { // 提前校验输出文件夹是否存在,不存在则创建 if (!System.IO.Directory.Exists(OUTPUT_FOLDER)) { System.IO.Directory.CreateDirectory(OUTPUT_FOLDER); } PdfDocument pdfDocument = new PdfDocument(new PdfWriter(OUTPUT_FOLDER + "ImageToPdf.pdf")); Document document = new Document(pdfDocument); ImageData imageData = ImageDataFactory.Create(IMAGE_PATH); Image image = new Image(imageData); image.SetWidth(pdfDocument.GetDefaultPageSize().GetWidth() - 50); image.SetAutoScaleHeight(true); document.Add(image); document.Close(); } } }
场景2:批量转换SeleniumScreenshots文件夹下所有PNG到同一个PDF
需要先遍历文件夹下所有PNG文件,循环添加到PDF文档中,示例代码如下:
using System; using System.IO; using iText.IO.Image; using iText.Kernel.Pdf; using iText.Layout; using iText.Layout.Element; namespace TesingPDFConvert { internal class Program { private static string BASE_PATH = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\c_projects\"; private static string SCREENSHOT_FOLDER = BASE_PATH + @"SeleniumScreenshots\"; private static string OUTPUT_FOLDER = BASE_PATH + @"pdf_output\"; public static void Main(string[] args) { if (!Directory.Exists(OUTPUT_FOLDER)) { Directory.CreateDirectory(OUTPUT_FOLDER); } PdfDocument pdfDocument = new PdfDocument(new PdfWriter(OUTPUT_FOLDER + "AllScreenshotsToPdf.pdf")); Document document = new Document(pdfDocument); var pageWidth = pdfDocument.GetDefaultPageSize().GetWidth() - 50; // 遍历所有PNG文件 foreach (var imagePath in Directory.GetFiles(SCREENSHOT_FOLDER, "*.png")) { ImageData imageData = ImageDataFactory.Create(imagePath); Image image = new Image(imageData); image.SetWidth(pageWidth); image.SetAutoScaleHeight(true); // 每张图片自动设置边距,超出页面宽度会自动分页 image.SetMargins(20, 0, 20, 0); document.Add(image); } document.Close(); } } }
注意事项
- 若你Selenium输出的截图格式不是PNG,修改
Directory.GetFiles的第二个参数为对应后缀即可,比如*.jpg。 - 调试时如果还是报错,可以先打印路径变量的实际值,确认路径对应的文件真实存在。
内容的提问来源于stack exchange,提问作者Isaac M
相关产品推荐
相关产品推荐

