![智能板笔记本文件的批量转换](https://linux22.com/image/1373674/%E6%99%BA%E8%83%BD%E6%9D%BF%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%89%B9%E9%87%8F%E8%BD%AC%E6%8D%A2.png)
有没有什么办法,如何将 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.pdf
basename
答案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 {} \;