在笔记本中保存<iframe>对象的屏幕截图?

时间:2017-02-16 22:43:18

标签: google-chrome ipython jupyter-notebook jupyter

我正在插入引用远程网站的&lt; iframe ...&gt; 对象,并在Chrome中为我提供笔记本中的交互式可视化(来自在Jupyter中可视化TensorFlow图的简单方法?)。这样做的缺点是,当我关闭笔记本,然后再打开它时,所有可视化都会被空白空格替换。

&#xA;&#xA;

我怀疑它需要重新执行 iframe 中的javascript代码。

&#xA;&#xA;

另一个缺点是托管这个笔记本(即github)时,所有这些单元格都是空的,所以a静态图像方法比重新执行javascript更容易。

&#xA;&#xA;

有人能看到保存这些单元格的屏幕截图并将它们嵌入到笔记本中的方法吗?也许类似于 camera_ready(14),它将从输出单元格14中嵌入可视化的静态屏幕截图。

&#xA;

1 个答案:

答案 0 :(得分:1)

PhantomJS可以帮助您捕获屏幕。当您的笔记本电脑正在运行时,PhantomJS浏览器将打开它并制作指定输出单元的屏幕截图:

PhantomJS的JS文件:

<Window.Resources>
    <local:HeaderConverter x:Key="headerConverter"/>
</Window.Resources>

<Grid>
    <DataGrid Name="dg">
        <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <TextBlock MinWidth="30" TextAlignment="Center">
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource headerConverter}">
                            <Binding Path="ItemsSource" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGrid}" />
                            <Binding Path="Item" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>
    </DataGrid>
</Grid>

在脚本中指定笔记本的地址,身份验证令牌和单元格编号,并使用phantomjs运行它:

public class HeaderConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { int ind = -1; DataView dv = values[0] as DataView; if (dv != null) { DataRowView drv = values[1] as DataRowView; ind = dv.Table.Rows.IndexOf(drv.Row); } else { System.Collections.IEnumerable ien = values[0] as System.Collections.IEnumerable; ind = IndexOf(ien, values[1]); } if (ind == -1) return ""; else return (ind + 1).ToString(); } static int IndexOf(System.Collections.IEnumerable source, object value) { int index = 0; foreach (var item in source) { if (item.Equals(value)) return index; index++; } return -1; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }