You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm中PDF无法显示为图片问题求助(附代码)

C# WinForm TreeView点击PDF文件提示“不是PDF文件”的问题解决

问题场景

我是C#新手,用WinForm开发扫描应用时遇到问题:TreeView展示文件夹内容,图片文件点击能正常在PictureBox显示,但点击PDF文件时,应用提示“该文件不是PDF文件”,但实际确实是PDF文件。

问题根源

你的代码逻辑存在顺序错误:在treeView1_AfterSelect事件中,首先判断IsImageFile(selectedFile),而PDF的扩展名不在IsImageFile的校验列表里,所以会直接进入else分支,触发“Selected file is not an image or PDF.”的错误提示,根本没机会执行PDF文件的加载逻辑。

另外还有两个次要问题:

  • PDF加载时用treeView1.SelectedNode.Index作为页码是错误的,这个Index是节点在父节点中的位置,不是PDF的页码,应该默认渲染第一页(索引0)。
  • 加载图片时没有释放旧的Image对象,可能导致内存泄漏。

解决方案

调整文件类型判断逻辑,先分别判断是否是图片或PDF,各自执行对应的加载逻辑;修正PDF页码的错误;添加Image资源释放。

修改后的核心代码

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    if (e.Node != null && e.Node.Tag != null && File.Exists(e.Node.Tag.ToString()))
    {
        string selectedFile = e.Node.Tag.ToString();
        if (File.Exists(selectedFile))
        {
            try
            {
                // 释放PictureBox旧的Image资源,避免内存泄漏
                if (pictureBox1.Image != null)
                {
                    pictureBox1.Image.Dispose();
                    pictureBox1.Image = null;
                }

                if (IsPdfFile(selectedFile))
                {
                    using (PdfiumViewer.PdfDocument document = PdfiumViewer.PdfDocument.Load(selectedFile))
                    {
                        // 渲染PDF第一页(索引0),而非节点在父级的位置
                        using (Bitmap image = (Bitmap)document.Render(0, 300, 300, true))
                        {
                            pictureBox1.Image = new Bitmap(image);
                        }
                    }
                }
                else if (IsImageFile(selectedFile))
                {
                    pictureBox1.Image = Image.FromFile(selectedFile);
                }
                else
                {
                    MessageBox.Show("Selected file is not an image or PDF.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error loading file: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        else
        {
            MessageBox.Show("Selected file does not exist.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

// 可简化PDF判断逻辑
private bool IsPdfFile(string fileName)
{
    return Path.GetExtension(fileName).Equals(".pdf", StringComparison.OrdinalIgnoreCase);
}

// IsImageFile和PopulateTreeView方法可保持原有实现

关键改动说明

  • 调整判断顺序:先检查PDF类型,再检查图片类型,确保两种文件都能进入对应处理分支。
  • 添加旧Image资源释放:避免多次加载文件后出现内存泄漏。
  • 修正PDF页码:用固定索引0渲染第一页,替代错误的节点位置索引。
  • 简化PDF扩展名判断:直接用忽略大小写的比较,逻辑更简洁高效。

内容的提问来源于stack exchange,提问作者LongPham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:17:13