智能板笔记本文件的批量转换

智能板笔记本文件的批量转换

有没有什么办法,如何将 SMART *.notebook(用于为 Smartboard 创建演示文稿的文件格式)批量转换为 PDF?

我有大约数千个这样的文件需要转换为 pdf,而 Smartboard 分发的软件只允许逐个导出为 pdf。

答案1

为了简单的笔记本,你可以自己做这件事。

.notebook文件只是带有清单(用作电子书的书脊)的 .ZIP 文件,允许您浏览笔记本内的页面文件。

并且页面文件是 SVG 格式的文件,因此您可以轻松转换在 Linux 上,但也有适用于 Windows 的工具(甚至在线工具 - 我不知道如何使用它们但是,服务条款可能禁止这样做)。

为了进行测试,在 Linux 上(它也可以在 Windows 上运行,但需要安装带有 Perl 的 Cygwin), 我试过:

$ unzip -l Untitled.notebook
Archive:  Untitled.notebook
  Length      Date    Time    Name
---------  ---------- -----   ----
    11715  2013-08-21 14:28   page1377095283484.svg
     1251  2013-08-21 14:28   imsmanifest.xml
     7137  2013-08-21 14:28   page0.svg
---------                     -------
    20103                     3 files

在清单文件中,我发现:

<resource adlcp:scormType="asset" href="page0.svg" identifier="pages" type="webcontent">
  <file href="page0.svg"/>
  <file href="page1377095283484.svg"/>
</resource>

通过运行svg转pdf,我可以将这两个页面正确地转换为 PDF。

此时,简单运行pdftk允许我获得包含两页的单个 PDF。

将这一切包装成转换器需要稍微调整一下从清单中轻松提取 SVG 页面(在 CPAN 中,force install App::Xml_grep2由于测试失败,我不得不这么做,因为它看起来是虚假的)。

# Temporary files named from 1 to N. It is unlikely that
# any legitimate files exist with such names, but this has
# better be done in a temporary directory, just in case.

unzip $1

if [ ! -r imsmanifest.xml ]; then
    echo Sorry, this notebook seems to have no manifest.
    exit 2
fi

# Get page numbers
XPATH="//*[@identifier='pages']/*[local-name()='file']/@href"
PAGES=`xml_grep2 -t "$XPATH" imsmanifest.xml`

# Remove manifest, we need it no more.
rm imsmanifest.xml
N=0
for page in $PAGES; do
    # Create 
    N=$[ $N + 1 ]
    svg2pdf $page $N
    # Remove SVG page, we need it no more.
    rm $page
done
pdftk $( seq 1 $N ) output $1.pdf
# Now remove temporary files
rm $( seq 1 $N )

我已经尝试过用以下方法创建的一些笔记本智能科技快讯,并且它有效。我无法提供其他保证。

一旦保存为脚本,上述内容可以递归转换一个充满 .notebook 文件的大目录:

find . -name "*.notebook" -exec /path/to/converter \{\}\;

...最后,在每个 .notebook 文件的旁边都会有(嗯,那里应该...)是.notebook.pdf具有相同名称和转换内容的文件(可以修改脚本以摆脱。笔记本名称的一部分,即使用实用程序转换Sample.notebook为)。Sample.pdfbasename

答案2

我没有您提到的软件,但如果它接受命令行参数或者转换器/导出器是一个单独的程序,则您可以使用批处理文件进行转换。

例如,如果可以通过converter.exe <input file> <output file>在命令行中输入来激活转换器/导出器,则以下批处理文件将转换*.notebook与其自身位于同一文件夹中的所有文件:

set PATH_TO_CONVERTER=<insert path here>
for %%a in ("*.notebook") do "%PATH_TO_CONVERTER%" "%%a" "newfiles\%%~na.pdf"

在第 1 行中,您需要更改<insert path here>为转换器的完整路径,例如C:\Program Files\something\converter.exe

如果只能使用软件的图形界面执行导出,您可以使用 AutoHotKey 等程序编写脚本来为您执行单击操作。首先将要转换的所有文件复制到新文件夹。脚本必须是这样的(快捷键仅供参考,它们可能因您使用的软件而异):

Type Ctrl+O      -- Open the file chooser dialog
Wait a few seconds for it to open
Type down arrow  -- Select the first file
Type enter       -- Open the file
Wait a few seconds for it to open
Type Alt+F+X     -- Call the export command
Wait a few seconds for export dialog to open
Type enter       -- Export file
Type Ctrl+W      -- Close the file
Type Ctrl+O      -- Open the file chooser dialog
Wait a few seconds for it to open
Type down arrow  -- Select the first file
Type Del         -- We're done with the first file so delete it
Type Enter       -- Agree to delete
Type Esc         -- Close file chooser
Go back to beginning of script

答案3

Powershell 脚本。需要更新 inkscape 和 pdftk 可执行文件的路径,并安装 chocolatey(Windows 包管理器)才能安装 XMLStarlet。

function SmartNotebook2PDF
{
    Param($notebookfile)
    $notebasename = (Get-Item $notebookfile).basename
    $zipfile = $notebasename + ".zip"
    Write-Host "Working on $notebookfile"
    Copy-Item $notebookfile -Destination $zipfile
    Expand-Archive $zipfile -Force
        if (!(Test-Path $notebasename\imsmanifest.xml)) {
        Write-Host "sorry, this notebook seems to have no manifest."
        Break
        }
    $pages = xml sel -t -v "//*/_:resource[@identifier='pages']/_:file/@href" $notebasename\imsmanifest.xml
    $n = 0
    ForEach ($page in $pages) {
        $n++
        Write-Host "Found $page, converting"
        inkscape $notebasename\$page --export-area-page --export-pdf=$n
        Remove-Item -path $notebasename\$page
    }
    Write-Host "Exported $n pages to PDF with Inkscape"
    pdftk $(1..$n) output "$notebookfile.pdf"
    Write-Host "PDF created with pdftk at $notebookfile.pdf. Cleaning up."
    del $(1..$n)
    Remove-Item -path $notebasename -recurse
    Remove-Item -path $zipfile
    Write-Host "Done."
}


$files = dir -recurse -ea 0 *.notebook | % FullName

ForEach ($file in $files) {
    SmartNotebook2PDF ($file)
    }

比我聪明的人可能会想出如何从 powershell 中本机获取 XML 属性,而不是使用 XMLStarlet。

答案4

lserni 提供的解决方案给我带来了很多问题。例如,我找不到 xml_grep2 或 svg2pdf。也许它只是需要更新。以下是我的解决方案:

#!/bin/bash

# Temporary files named from 1 to N. It is unlikely that
# any legitimate files exist with such names, but this has
# better be done in a temporary directory, just in case.

# un-comment for debug messages
# set -x

# always overwrite when unzipping
unzip -o "$1"

if [ ! -r imsmanifest.xml ]; then
  echo Sorry, this notebook seems to have no manifest.
  exit 2
fi

# Get page numbers
XPATH="//*/_:resource[@identifier='pages']/_:file/@href"
PAGES=`xmlstarlet sel -t -v "//*/_:resource[@identifier='pages']/_:file/@href" imsmanifest.xml`

N=0
for page in $PAGES; do
    # Create   
    ((N++))

    inkscape $page --export-area-page --export-pdf=$N
    #inkscape $page --export-area-drawing --export-pdf=$N

    # Remove SVG page, we need it no more.   
    rm $page   
done

pdftk $( seq 1 $N ) output "$1.pdf"

# Now remove temporary files
rm $( seq 1 $N )
rm -rf images annotationmetadata
rm metadata.rdf metadata.xml settings.xml preview.png
rm imsmanifest.xml

要对多个文件运行它,我使用了:

find . -name "*.notebook" -exec convert.sh {} \;

相关内容