【问题标题】:Select and Print list of PDF files from a folder从文件夹中选择并打印 PDF 文件列表
【发布时间】:2017-06-15 03:29:26
【问题描述】:

我有 2 个问题 一:当我使用 Directory.GetFiles() 时,我现在有一个报告编号(元素)和文件路径(_filePath)的列表,根据下面的代码过滤基于元素列表没有返回,所以这种过滤方式可能有问题,所以请纠正它。 二:请在foreach循环中定义打印代码

// Print the selected files.
  private void PrintReports(Item _itemNo)
    {
        //GetNDEReportDirectory() return directory based on _itemNo
        string _filePath = GetNDEReportDirectory(_itemNo);
        List<string> elements = new List<string>();
        //GetNDEReportsList() return a list of required reports numbers
        elements = GetNDEReportsList(_itemNo);

        //option-2
        var files = Directory.GetFiles(_filePath).Where(f => 
                      elements.Contains(f)).ToList();


        foreach (var file in files)
        {
          //print code

        }

    }

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    首先,Directory.GetFiles() 返回带有路径的完整文件名,您可能希望将其与 System.IO.Path.GetFileName() 结合以仅获取文件名。

    List<string> fileNames = Directory.GetFiles(_filePath).Select(d => Path.GetFileName(d)).ToList();
    

    然后,取决于GetNDEReportsList(_itemNo); 返回的内容 (带路径的完整文件名还是仅文件名?),您可以使用现有代码。

    var files = fileNames.Where(f => elements.Contains(f)).ToList();
    

    至于打印代码,这并不容易,因为您需要第三方软件来帮助打印,而且您需要 1 个对话框来确定所有设置是非常不寻常的,因为每个文档都应该有自己的对话框(它们可能有不同的页数等)。

    编辑(您实际上需要完整的路径名才能使用 Process 进行打印):

    基本上使用旧代码(来自您的问题,在看到上述内容后没有编辑),而是使用它:

    var files = Directory.GetFiles(_filePath).Where(f => elements.Contains(Path.GetFileName(f))).ToList();
    

    然后在你的 foreach 中,尝试:

    foreach (var file in files)
    {
        Process p = new Process( );
        p.StartInfo = new ProcessStartInfo( )
        {
            CreateNoWindow = true,
            Verb = "print",
            FileName = file
        };
        p.Start( );
    }
    

    这确保您使用文件的完整路径作为文件名,因此不会说文件“损坏”。

    最后,您希望能够选择/更改打印机名称,方法如下:

    System.Windows.Forms.PrintDialog pDlg = new System.Windows.Forms.PrintDialog();
    pDlg.AllowSomePages = false;
    pDlg.ShowHelp = false;
    DialogResult result = pDlg.ShowDialog();
    
    // If the result is OK then continue.
    if (result == DialogResult.OK)
    {
        //print your documents here
        foreach (var file in files)
    {
        Process p = new Process( );
        p.StartInfo = new ProcessStartInfo( )
        {
            CreateNoWindow = true,
            Verb = "print",
            FileName = file,
            Arguments = pDlg.PrinterName
            WindowStyle = ProcessWindowStyle.Hidden     //optional, if you can't hide the adobe window properly with CreateNoWindow
        };
        p.Start( );
    }
    }
    

    【讨论】:

    • 谢谢它正在工作。对于问题的第二部分,我想将选定的报告打印到打印机,只显示一次打印对话框来设置打印选项。如果可能,请提供帮助
    • @Hussein 我可以试着做点什么,我应该把它添加到这个答案中,还是你正在为此创建一个新问题?
    • 如果可能,请将其添加到此答案中,因为它是问题的第二部分。提前致谢
    • @Keyur PATEL 感谢您的回答,但此代码在 adobe acrobat 中打开 pdf 文件而不是打印它。adobe 也给出错误(文件可能已损坏 - 尽管文件没问题)而不是打开文件。最后不需要打印对话框,但至少我想设置打印机名称
    • @Hussein 根据这个 MSDN (ProcessStartInfo.Verb Property),使用 Verb: 指定“打印”字样应该要求 Adob​​e 立即打印文件。但是,FileName = path 中的路径必须是完整路径,而不仅仅是文件名(这是我们使用的)。
    猜你喜欢
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多