从MVC控制器内部运行控制台命令而不是输出

时间:2017-08-23 09:40:18

标签: c# asp.net-mvc command-line

我们有一个MVC网络应用程序,允许下载动态生成的PDF报告。我试图允许在浏览器中查看报告,并且由于浏览器兼容性问题,我们无法使用JS PDF查看器,因此我正在使用现有代码生成PDF的控制器操作,然后使用它将其转换为HTML第三方程序并返回HTML。

第三方程序pdf2htmlEX通过命令行界面使用,但是当我尝试调用程序将PDF转换为HTML时,没有任何反应。我没有收到错误,但没有生成HTML文件。

我首先尝试了一行来启动转换Process.Start("commands here"),但是当它无效时,我尝试了一种更高级的方法来启动该过程,并允许捕获此答案中找到的StdOut:{{3但是,我似乎也没有获得任何输出。我不熟悉使用c#调用命令行程序,所以我不确定我是否犯了一个简单的错误。我当前的控制器操作如下所示:

public ActionResult GetReportPdfAsHtml(int userId, ReportType reportType, int page = 1)
{
    // get pdf
    var pdfService = new PdfServiceClient();
    var getPdfResponse = pdfService.GetPdfForUser(new GetPdfForUserRequest {
        UserId = userId,
        ReportType = reportType,
        BaseUri = Request.Url.Host
    });
    pdfService.Close();

    // save pdf to temp location
    var folderRoot = Server.MapPath("~");
    var location = Path.Combine(folderRoot, "pdfTemp");
    var outputDir = $"{location}\\output";
    var fileName = $"{userId}_{reportType}";
    Directory.CreateDirectory(outputDir);
    var file = $"{location}\\{fileName}.pdf";
    //IOFile is alias of system.IO.File to avoid collision with the 'File' Method already on the controller
    IOFile.WriteAllBytes(file, getPdfResponse.Pdf);

    //********************************************************************
    //***** Works fine up to here, PDF is successfully generated and saved
    //******************************************************************** 

    // Convert pdf above to html
    var arguments = $"{file} --dest-dir {outputDir} -f {page} -l {page}";
    // Start the child process.
    var p = new Process {
        StartInfo = {
            UseShellExecute = false,
            RedirectStandardOutput = true,
            FileName = Server.MapPath("~\\pdf2htmlEX.exe"),
            Arguments = arguments
        }
    };
    p.Start();
    // Read the output stream first and then wait.
    var output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();

    // Function continues and returns fine, but MVC then errors because the 
    // file isn't created so the path below doesn't exist
    return File($"{outputDir}\\{fileName}.html", "text/html");
}

更新:我已尝试在cmd控制台中运行该命令,但它运行正常。但是,当我尝试通过Process.Start()方法运行它时,我从Pdf2htmlEX获得以下输出:

>temporary dir: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244  
>Preprocessing: 0/1   
>Preprocessing: 1/1  
>Add new temporary file: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/__css  
>Add new temporary file: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/__outline  
>Add new temporary file: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/__pages  
>Working: 0/1  
>Install font 1: (14 0) SUBSET+LatoLightItalic  
>Add new temporary file: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/f1.ttf  
>Embed font: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/f1.ttf 1  
>Add new temporary file: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/__raw_font_1.ttf  
>em size: 2000  
>Add new temporary file: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/f1.map  
>Missing space width in font 1: set to 0.5  
>space width: 0.5  
>Add new temporary file: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/__tmp_font1.ttf  
>Add new temporary file: [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/__tmp_font2.ttf  
>Internal Error: Attempt to output 2147483647 into a 16-bit field. It will be truncated and the file may not be useful.  
>Internal Error: File Offset wrong for ttf table (name-data), -1 expected 150  
>Save Failed  
>Cannot save font to [Redacted]\pdfTemp\temp/pdf2htmlEX-a46244/__tmp_font1.ttf

0 个答案:

没有答案