2

我希望能够阅读网站的屏幕截图,并尝试使用 phantomjs 和 ASP.NET。

我尝试使用 page.render 将屏幕截图保存到文件中。它作为控制台应用程序工作,但当我从 asp.net 处理程序调用它时就不行了。这可能是由于文件权限,因为简单的应用程序(如 hello.js)工作正常。

没关系,我的偏好不是写入文件,而是处理字节并直接从处理程序返回图像。

我对如何做到这一点有点迷茫。我注意到一个名为 page.renderBase64 的方法,但不知道如何使用它。

目前我正在使用 IHttpHandler。

这里有一个类似的问题,但那个人最终放弃了 phantomjs。我喜欢它的外观,如果可能的话,我想继续使用它。 使用 C# 运行 Phantomjs 以获取网页快照

4

5 回答 5

10

根据您的最后评论,您可以在 phantom js 文件中执行以下操作:

var base64image = page.renderBase64('PNG');
system.stdout.write(base64image);

在 C# 中:

    var startInfo = new ProcessStartInfo {
    //some other parameters here
    ...
    FileName = pathToExe,
    Arguments = String.Format("{0}",someParameters),
    UseShellExecute = false,
    CreateNoWindow = true,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    RedirectStandardInput = true,
    WorkingDirectory = pdfToolPath
    };
    var p = new Process();
    p.StartInfo = startInfo;
    p.Start();
    p.WaitForExit(timeToExit);
    //Read the Error:
    string error = p.StandardError.ReadToEnd();
    //Read the Output:
    string output = p.StandardOutput.ReadToEnd();

在您的输出变量中,您可以读取从 phantomJS 返回的 base64,然后执行您的计划。

于 2013-04-30T11:57:49.520 回答
3

从这里使用 Phantomjs 的包装器 nreco wrapper

你可以在这里获取 rastor 的 js:rastorize

然后 C# 中的以下代码将完成这项工作。

var phantomJS=new PhantomJS();
phantomJS.Run("rasterize.js", new[] { "http://google.com","ss.pdf" });
于 2015-05-12T20:15:03.167 回答
2

这个问题源于我对 base64 字符串的实际含义缺乏了解。

在 phantomjs 运行的 javascript 文件中,我可以将 base64 图像直接写入控制台,如下所示:

var base64image = page.renderBase64('PNG');
console.log(base64image);

在运行 phantomjs 的 c# 代码中,我可以将控制台输出转换回字节并将图像写入响应,如下所示:

var info = new ProcessStartInfo(path, string.Join(" ", args));
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
info.CreateNoWindow = true;

var p = Process.Start(info);
p.Start();

var base64image = p.StandardOutput.ReadToEnd();
var bytes = Convert.FromBase64CharArray(base64image.ToCharArray(), 0, base64image.Length);

p.WaitForExit();

context.Response.OutputStream.Write(bytes, 0, bytes.Length);
context.Response.ContentType = "image/PNG";

这似乎避免了我遇到的文件锁定问题。

于 2013-04-30T11:47:11.523 回答
1

使用 CasperJS 和 PhantomJS ,我得到了漂亮的网页照片。

var casper = require('casper').create();

casper.start('http://target.aspx', function() {
    this.capture('snapshot.png');
});

casper.run(function() {

    this.echo('finished');
});

我强烈建议您查看该工具。不过,我仍然不确定如何进行回传..

于 2013-04-23T21:00:55.357 回答
0

设置 ProcessStartInfo 对象的“WorkingDirectory”属性以指定文件的保存位置。

于 2013-08-06T08:17:39.193 回答