从文件夹中选择并打印PDF文件列表

时间:2017-06-15 03:29:27

标签: c# linq

我有2个问题 一:我有一个报告编号(元素)列表和文件路径(_filePath)现在,当我使用Directory.GetFiles()时根据下面的代码过滤基于元素列表没有返回任何内容,所以过滤这种方式可能有问题,好好纠正它。 二:请在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

        }

    }

1 个答案:

答案 0 :(得分: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处理打印的完整路径名称):

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

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( );
}

这可以确保您使用文件的FULL路径作为FileName,因此它不会说该文件已经损坏了#34;。

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

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( );
}
}