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

如何获取Adobe Reader已打开文件的路径?C#实现可行吗?

嘿,我来帮你搞定这两个关于Adobe Reader文件路径的问题!

一、如何获取Adobe Reader已打开文件的路径

有几种实用的方式可以拿到这个路径,分手动操作和技术手段两类:

  • 手动查看界面:打开Adobe Reader后,窗口标题栏通常会显示文件名和完整路径(如果路径没被窗口宽度截断的话);或者点击顶部菜单栏的文件→属性,在弹出的属性窗口里,位置字段就是文件的完整路径。
  • 通过Windows任务管理器:按下Ctrl+Shift+Esc打开任务管理器,切换到详细信息标签页,找到AcroRd32.exe(或新版本的AcroRd64.exe)进程,右键选择属性,在命令行字段里就能看到包含PDF文件路径的启动参数,展开后即可查看完整路径。
二、用C#实现获取Adobe Reader已打开文件的路径

当然可以!这里给你两种靠谱的实现思路,适配不同场景:

方法1:遍历进程解析命令行参数

这种方法不依赖Adobe的专属组件,通用性更强,适合大多数环境。核心逻辑是找到所有Adobe Reader进程,读取它们的命令行参数并提取PDF路径。

using System;
using System.Diagnostics;
using System.Management;

class AdobePathGetter
{
    static void Main()
    {
        // 根据你的Adobe Reader版本调整进程名,旧版本是AcroRd32.exe,新版本可能是AcroRd64.exe
        string targetProcess = "AcroRd32";
        var adobeProcesses = Process.GetProcessesByName(targetProcess);

        foreach (var process in adobeProcesses)
        {
            try
            {
                string commandLine = GetProcessCommandLine(process);
                if (!string.IsNullOrWhiteSpace(commandLine))
                {
                    // 提取命令行中引号包裹的PDF路径(适配带空格的路径)
                    int quoteStart = commandLine.IndexOf('"');
                    int quoteEnd = commandLine.IndexOf('"', quoteStart + 1);
                    if (quoteStart != -1 && quoteEnd != -1)
                    {
                        string pdfPath = commandLine.Substring(quoteStart + 1, quoteEnd - quoteStart - 1);
                        Console.WriteLine($"已打开的PDF路径:{pdfPath}");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"读取进程信息失败:{ex.Message}");
            }
            finally
            {
                process.Dispose();
            }
        }
    }

    // 辅助方法:通过WMI获取进程的完整命令行
    private static string GetProcessCommandLine(Process process)
    {
        using (var searcher = new ManagementObjectSearcher(
            $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {process.Id}"))
        {
            foreach (var obj in searcher.Get())
            {
                return obj["CommandLine"]?.ToString();
            }
        }
        return null;
    }
}

注意:这个方法需要在项目中引用System.Management程序集,且运行程序时可能需要管理员权限才能读取所有进程的命令行信息。

方法2:使用Adobe Reader的COM接口

如果你的环境中安装了Adobe Reader的COM组件,可以直接通过官方接口获取路径,准确性更高。

  1. 先在C#项目中添加COM引用:右键项目→添加→引用→COM,找到Adobe Acrobat Reader DC Type Library(或对应版本的AcroPDFLib)并勾选。
  2. 然后使用以下代码实现:
using AcroPDFLib;

class AdobeComPathGetter
{
    static void Main()
    {
        try
        {
            var acroApp = new AcroPDF();
            if (acroApp.GetNumDocs() > 0)
            {
                // 获取第一个已打开的文档(可循环遍历GetNumDocs()返回的数量)
                var openedDoc = acroApp.GetDoc(0);
                string pdfPath = openedDoc.Path;
                Console.WriteLine($"已打开的PDF路径:{pdfPath}");
            }
            else
            {
                Console.WriteLine("Adobe Reader当前没有打开任何文档");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"操作失败:{ex.Message}");
        }
    }
}

注意:这种方法依赖Adobe Reader的版本,不同版本的COM库可能存在差异;如果用户的Adobe Reader未注册COM组件,可能会触发报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:23:29