第 11 章 数据转换

# 第 11 章 数据转换

下面是关于Debian 系统上可用的格式转化工具及其相关提示的信息。

基于标准的工具，是非常好用的，但支持的专有数据格式有限.

## 11.1. 文本数据转换工具

如下是文本数据转换工具。

表 11.1. 文本数据转化工具列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`libc6` | V:940, I:999 | 5355 | 字符集 | 使用 iconv(1) 的不同语言环境（locale）之间的文本编码转换器 (基础的)
`recode` | V:2, I:13 | 528 | 字符集+换行 | 不同语言环境（locale）之间的文本编码转换器（多功能的，更多别名和特性）
`konwert` | V:2, I:42 | 137 | 字符集 | 不同语言环境（locale）之间的文本编码转换器（高档的）
`nkf` | V:0.4, I:8.5 | 359 | 字符集 | 日语字符集翻译
`tcs` | V:0.01, I:0.14 | 518 | 字符集 | 字符集翻译
`unaccent` | V:0.03, I:0.30 | 35 | 字符集 | 代替重音字符，使用和它们相当的非重音字符
`tofrodos` | V:1, I:13 | 50 | 换行 | 在 DOS 和 Unix 之间的文本格式转换: fromdos(1) 和 todos(1)
`macutils` | V:0.04, I:0.45 | 319 | 换行 | 在 Macintosh 和 Unix 之间的文本格式转换: frommac(1) 和 tomac(1)

### 11.1.1. 用 iconv 命令来转换文本文件

| 提示
iconv(1) 是 `libc6` 软件包的一部分并且它可以在类 Unix 的系统上转换字符的编码。

你能够通过如下的命令用 iconv(1) 来转换文本文件的编码。

    $ iconv -f encoding1 -t encoding2 input.txt >output.txt

编码值是大小写不敏感的，且会在匹配时忽略“`-`”和“`_`”。可以使用“`iconv -l`”命令检查支持的编码。

表 11.2. 编码值和用法的列表

编码值 | 用法
--- | ---
ASCII | 美国信息交换标准代码，7位代码不带重音符号
UTF-8 | 用于所有现代操作系统的多语言标准
ISO-8859-1 | 旧的西欧语言标准，ASCII + 重音符号
ISO-8859-2 | 旧的东欧语言标准，ASCII + 重音符号
ISO-8859-15 | 旧的带有欧元符号的西欧语言标准（ISO-8859-1）
CP850 | code page 850，用于西欧语言的微软 DOS 的带有图形的字符，ISO-8859-1 的变体
CP932 | code page 932, 日语 Microsoft Windows 的 Shift-JIS 变体
CP936 | code page 936，用于简体中文的微软操作系统风格的 GB2312，GBK 或者 GB18030 的变体
CP949 | code page 949，用于韩语的微软操作系统风格的 EUC-KR 或者 Unified Hangul Code 的变体
CP950 | code page 950，用于繁体中文的微软操作系统风格的 Big5 的变体
CP1251 | code page 1251，用于西里尔字母的微软操作系统风格的编码
CP1252 | code page 1252，用于西欧语言的微软操作系统风格的 ISO-8859-15 的变体
KOI8-R | 用于西里尔字母的旧俄语 UNIX 标准
ISO-2022-JP | 日文邮件的标准编码，只使用 7 位字节
eucJP | 老的日文 UNIX 标准的 8 位字节，和 Shift-JIS 完全不同
Shift-JIS | 日文 JIS X 0208 附录 1 标准 (参见 CP932)

| 注意
一些编码只支持数据转换，它不能作为语言环境的值 (第 8.1 节 “语言环境”)。

像 ASCII 和 ISO-8859 这样适用于单字节的字符集，字符编码和字符集几乎指的是同一件事情。

对于多字符的字符集，比如说，用于日文的 JIS X 0213，或用于差不多所有语言的 Universal Character Set (UCS, Unicode, ISO-10646-1) , 有多种编码方案来序列化它们的字节数据。

- 日文的 EUC 和 ISO/IEC 2022 (也被称为 JIS X 0202)

- Unicode 的 UTF-8、UTF-16/UCS-2 和 UTF-32/UCS-4 编码

对于以上这些，字符集和字符编码之间有着明显的区别。

对某些计算机厂家而言，code page 是作为字符编码表的同义词来使用。

| 注意
请注意，大部分编码系统共享 ASCII 的 7 位字符的同样编码，但也有一些列外。如果你从通常所说的 shift-JIS 编码格式，转化老的日文 C 语言程序和 URL 数据，到 UTF-8 格式,你需要使用 "`CP932`" 作为编码名来代替 "`shift-JIS`" 来得到期望的结果： `0x5C` → "`\`" 和 `0x7E` → "`~`".否则，这些将被转化为错误的字符。

| 提示
recode(1) 也可能被使用并且不仅仅是 iconv(1)，fromdos(1)，todos(1)，frommac(1) 和 tomac(1) 功能的结合。想要获得更多信息，请参见 "`info recode`"。

### 11.1.2. 用 iconv 检查文件是不是 UTF-8 编码

你能够通过如下命令用 iconv(1) 来检查一个文本文件是不是用 UTF-8 编码的。

    $ iconv -f utf8 -t utf8 input.txt >/dev/null || echo "non-UTF-8 found"

| 提示
在上面的例子中使用 "`--verbose`" 参数来找到第一个 non-UTF-8 字符。

### 11.1.3. 使用 iconv 转换文件名

这里是一个示例脚步，在同一目录下，将在老的操作系统系统下创建的文件名编码，转换为现代 UTF-8.

    #!/bin/sh
    ENCDN=iso-8859-1
    for x in *;
     do
     mv "$x" "$(echo "$x" | iconv -f $ENCDN -t utf-8)"
    done

"`$ENCDN`" 变量定义了在老的操作系统下，文件名使用的原始编码，见 表 11.2 “编码值和用法的列表”.

对于更加复杂的情况，请使用适当的编码作为 mount(8) 的选项(参见 第 8.1.3 节 “文件名编码”) 来挂载包含有这样文件名的文件系统（比如说，磁盘上的一个分区），使用 "`cp -a`" 命令来拷贝它的整个内容到另外一个使用 UTF-8 挂载的文件系统上。

### 11.1.4. 换行符转换

文本文件的格式，特别是行尾（换行符）编码，有平台独立性。

表 11.3. 不同平台的换行符样式列表

平台 | 换行符编码 | 控制码 | 十进制 | 16 进制
--- | --- | --- | --- | ---
Debian (unix) | LF | `^J` | 10 | 0A
MSDOS 和 Windows | CR-LF | `^M^J` | 13 10 | 0D 0A
苹果的 Macintosh | CR | `^M` | 13 | 0D

换行符转换程序, fromdos(1), todos(1), frommac(1), 和 tomac(1), 是相当方便. recode(1) 也是有用的。

| 注意
在 Debian 系统上的一些数据，如 `python-moinmoin` 软件包的 wiki 页面数据，使用 MSDOS 式样的 CR-LF 作为换行符编码。所以，上面的规则仅仅是一个通用规则。

| 注意
大部分编辑器 (比如： `vim`, `emacs`, `gedit`, …) 能够透明处理 MSDOS 式样的换行符文件。

| 提示
对于混合 MSDOS 和 Unix 式样的文件，统一到 MSDOS 换行符式样，使用 "`sed -e '/\r$/!s/$/\r/'`" 代替 todos(1) 比较好。 (例如，在使用 diff3(1)移植两个 MSDOS 式样的文件后.)这是因为 `todos` 给所有的行增加 CR.

### 11.1.5. TAB 转换

这里有一些转换 tab 代码的专业工具。

表 11.4. `bsdmainutils` 和 `coreutils` 包中的用于转换 TAB 的命令列表

功能 | `bsdmainutils` | `coreutils`
--- | --- | ---
把制表符扩展成空格 | "`col -x`" | `expand`
将空格转换为制表符（unexpand） | "`col -h`" | `unexpand`

`indent` 包中的 indent(1) 命令能够重新格式化 C 程序中的空格。

例如 `vim` 和 `emacs` 这样的编辑软件可以被用来扩展 TAB。就拿 `vim` 来说，你能够按顺序输入 "`:set expandtab`" 和 "`:%retab`" 命令来扩展 TAB。你也可以按顺序输入 `:%set noexpandtab`" 和 "`:%retab`" 命令来复原。

### 11.1.6. 带有自动转换功能的编辑器

像 `vim` 这样的现代智能编辑器软件是相当聪明的并且能够处理任何编码系统以及任何文件格式。你应该在支持 UTF-8 编码的控制台上并在 UTF-8 环境下使用这些编辑器来获得最好的兼容性。

以 latin1（iso-8859-1）编码存储的旧西欧语言的 Unix 文本文件，“`u-file.txt`”，能通过如下所示的用 `vim` 轻易的编辑。

    $ vim u-file.txt

这是可能的因为 `vim` 的文件编码自动检测机制先假定文件是 UTF-8 编码，如果失败了，则假定它是 latin1 编码。

以 latin2（iso-8859-2） 编码存储的旧波兰语的 Unix 文本文件，“`pu-file.txt`”，能通过如下所示的用 `vim` 编辑。

    $ vim '+e ++enc=latin2 pu-file.txt'

以 eucJP 编码存储的旧日语的 Unix 文本文件，"`ju-file.txt`"，能通过如下所示的用 `vim` 编辑。

    $ vim '+e ++enc=eucJP ju-file.txt'

以所谓的 shift-JIS 编码 (更确切的说法是：CP932) 存储的旧日语 MS-Windows 文本文件，"`jw-file.txt`"，能通过如下所示的用 `vim` 编辑。

    $ vim '+e ++enc=CP932 ++ff=dos jw-file.txt'

当一个文件用 vim 打开的时候带有 "`++enc`" 和 "`++ff`" 选项，在 Vim 命令行输入 "`:w`" 命令会以原格式存储文件并且会覆盖原文件。你也可以在 Vim 命令行指定存储文件名及其格式，例如，"`:w ++enc=utf8 new.txt`"。

请查阅 `vim` 在线帮助中的 mbyte.txt，"多字节文本支持"和表 11.2 “编码值和用法的列表”来获得 "`++enc`" 使用的本地值的信息。

`emacs` 家族的程序能够实现同样的功能。

### 11.1.7. 提取纯文本

如下所示读入 web 页面并把它转化成文本文件。当从 Web 中拷贝配置或者是在 web 页面中应用类似 grep(1) 的基础 Unix 文本工具时，以下命令是非常有用的。

    $ w3m -dump https://www.remote-site.com/help-info.html >textfile

同样，你可以使用如下所示的工具从其他格式提取纯文本数据。

表 11.5. 用于提取纯文本数据的工具列表

软件包 | 流行度 | 大小 | 关键词 | 功能
--- | --- | --- | --- | ---
`w3m` | V:11, I:137 | 2853 | html→text | 用 "`w3m -dump`" 命令把 HTML 转化为文本的转换器
`html2text` | V:3, I:68 | 298 | html→text | 高级的 HTML 到文本文件的转换器 (ISO8859-1)
`lynx` | V:28, I:449 | 2031 | html→text | 用 "`lynx -dump`" 命令把 HTML 转化为文本的转化器
`elinks` | V:3, I:16 | 1789 | html→text | 用 "`elinks -dump`" 命令把 HTML 转化为文本的转换器
`links` | V:2, I:21 | 2321 | html→text | 用 "`links -dump`" 命令把 HTML 转化为文本的转换器
`links2` | V:1, I:10 | 5466 | html→text | 用 "`links2 -dump`" 命令把 HTML 转化为文本的转换器
`catdoc` | V:15, I:171 | 682 | MSWord→text,TeX | 转化 MSWord 文件到纯文本或 TeX文件
`antiword` | V:0.9, I:6.5 | 587 | MSWord→text,ps | 转化 MSWord 文件到纯文本或 ps 文件
`unhtml` | V:0.04, I:0.50 | 40 | html→text | 从一个 HTML 文件里面删除标记标签
`odt2txt` | V:1, I:21 | 60 | odt→text | 从开放文档格式到文本格式的转化器

### 11.1.8. 高亮并格式化纯文本数据

你可以通过如下所示的来高亮并格式化纯文本数据。

表 11.6. 高亮纯文本数据的工具列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`vim-runtime` | V:17, I:365 | 38706 | 高亮 | 用 "`:source $VIMRUNTIME/syntax/html.vim`" Vim 宏命令转化源代码到 HTML
`cxref` | V:0.03, I:0.23 | 1191 | c→html | 从 C 程序到 latex 和 HTML 的转换器（C语言）
`src2tex` | V:0.02, I:0.18 | 1799 | 高亮 | 转换许多源代码到 TeX（C语言）
`source-highlight` | V:0.5, I:3.2 | 2131 | 高亮 | 转换源代码到带有高亮显示的 HTML, XHTML, LaTeX, Texinfo, ANSI 颜色转义序列和 DocBook 文件 (C++)
`highlight` | V:0.4, I:3.1 | 1411 | 高亮 | 转化许多源代码到带有高亮显示的 HTML, XHTML, RTF, LaTeX, TeX or XSL-FO 文件。(C++)
`grc` | V:1.0, I:6.0 | 208 | text→有颜色的 | 用于任何文本的通用颜色生成器 (Python)
`pandoc` | V:10, I:47 | 208068 | text→any | 通用标记转化器 (Haskell)
`python3-docutils` | V:12, I:52 | 2009 | text→any | 重构文本文档到 XML (Python)
`markdown` | V:0.5, I:5.9 | 56 | text→html | Markdown 文本文档到 (X)HTML (Perl)
`asciidoctor` | V:0.4, I:4.8 | 101 | text→any | AsciiDoc 文本文档格式化到 XML/HTML (Ruby)
`python3-sphinx` | V:6, I:27 | 3235 | text→any | 基于文档发布系统 (Python)重构文本
`hugo` | V:0.8, I:5.1 | 66608 | text→html | 基于 Markdown 的静态站点发布系统(Go)

## 11.2. XML 数据

扩展标记语言 Extensible Markup Language (XML) 是一种标记语言，用于含有结构化信息的文档。

在 XML.COM 查看介绍信息.

- "什么是 XML?"

- "什么是 XSLT?"

- "什么是 XSL-FO?"

- "什么是 XLink?"

### 11.2.1. XML 的基本提示

XML 文本看起来有些像 HTML.它能够使我们管理一个文档的多个格式。一个简单的 XML 系统是 `docbook-xsl` 软件包，在这里使用。

每一个 XML 文件使用下面的标准 XML 声明开始。

    <?xml version="1.0" encoding="UTF-8"?>

XML 元素的基本语法是按下面的方式标记。

    <name attribute="value">content</name>

内容为空的 XML 元素，使用下面的短格式标记。

    <name attribute="value" />

上面列子中的 "`attribute="value"`" 是可选的。

XML 里面的注释部分，是按下面的方式标记。

    <!-- comment -->

不同于增加标记，XML 至少要求使用预定义实体里的内容来转化下列字符。

表 11.7. XML 预定义实体列表

预定义实体 | 转化的字符
--- | ---
`&quot;` | `"` : 引号
`&apos;` | `'` : 撇号
`&lt;` | `<` : 小于号
`&gt;` | `>` : 大于号
`&amp;` | `&` :＆号

| 小心
“`<`”或“`&`”不能在属性（attributes）或元素（elements）中使用。

| 注意
当 SGML 式样的用户定义实体，比如 "`&some-tag;`", 被使用的时候，第一个定义会覆盖其它的。实体定义在 "`<!ENTITY some-tag "entity value">`"里表示。

| 注意
只要 XML 标记是一致使用某一标签名集合（一些数据作为内容或属性值），使用 Extensible Stylesheet Language Transformations (XSLT) 来转换到另外一个 XML，是一个微不足道的任务。

### 11.2.2. XML 处理

有许多工具可以用于处理 XML 文件，比如说： 可扩展样式表语言 Extensible Stylesheet Language (XSL).

一旦你创建了一个好的成形的 XML 文件，基本上来讲，你就可以使用 可扩展样式表语言转换 Extensible Stylesheet Language Transformations (XSLT)，将其转换成任何格式。

格式化对象的可扩展样式表语言 Extensible Stylesheet Language for Formatting Objects (XSL-FO) 是用来作为格式化的解决方案. `fop` 软件包比 Debian `main` 档案库要新，因为它依赖 Java 编程语言. LaTeX 代码通常是从 XML 使用 XSLT 生成，LaTeX 系统是用来创建 DVI, PostScript 和 PDF 这类可打印的文件。

表 11.8. XML 工具列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`docbook-xml` | V:15, I:408 | 2126 | xml | DocBook 的 XML 文档类型定义（DTD）
`docbook-xsl` | V:14, I:145 | 14823 | xml/xslt | 使用 XSLT 将 DocBook XML 处理成各种输出格式的 XSL 样式表
`xsltproc` | V:15, I:73 | 83 | xslt | XSLT 命令行处理器 (XML→ XML, HTML, 纯文本，等等)
`xmlto` | V:0.5, I:8.6 | 124 | xml/xslt | 使用 XSLT 将 XML 转换到任意格式的转换器
`fop` | V:0.7, I:8.1 | 281 | xml/xsl-fo | 转换 Docbook XML 文件到 PDF
`dblatex` | V:0.9, I:5.8 | 4636 | xml/xslt | 使用 XSLT 将 Docbook 文件转换为 DVI, PostScript, PDF 文档
`dbtoepub` | V:0.05, I:0.50 | 37 | xml/xslt | DocBook XML 到 .epub 转换

由于 XML 是 标准通用标记语言 Standard Generalized Markup Language (SGML)的一个子集,用于处理 SGML 的扩展工具，也能够处理 XML，比如说 文档式样语言和规范语言 Document Style Semantics and Specification Language (DSSSL).

表 11.9. DSSSL 工具列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`openjade` | V:1, I:22 | 1066 | dsssl | ISO/IEC 10179:1996 标准 DSSSL 处理器 (最新的)
`docbook-dsssl` | V:0.5, I:7.9 | 2594 | xml/dsssl | 使用 DSSSL 处理 DocBook XML 到各种输出格式的 DSSSL 样式表
`docbook-utils` | V:0.4, I:5.6 | 287 | xml/dsssl | DocBook 文件的工具包，包括使用 DSSSL 的转换成其它格式 (HTML, RTF, PS, man, PDF)的 `docbook2*` 命令

| 提示
GNOME 的 `yelp` 往往能够方便的直接读取 DocBook XML 文件，这是因为它可以从 X 获得适当的渲染。

### 11.2.3. XML 数据提取

使用下面的方法，你能够从其它格式提取 HTML 或 XML 数据。

表 11.10. XML 数据提取工具列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`man2html` | V:0.1, I:1.3 | 142 | man 手册页→html | 从 man 手册页到 HTML 的转换器(支持 CGI)
`doclifter` | V:0.01, I:0.05 | 487 | troff→xml | troff 到 DocBook XML 的转换器
`texi2html` | V:0.2, I:3.0 | 1847 | texi→html | 从 Texinfo 到 HTML 的转换器
`info2www` | V:0.9, I:1.5 | 76 | info→html | 从 GNU info 到 HTML 的转换器 (支持 CGI)
`wv` | V:0.2, I:2.5 | 733 | MSWord→任何格式 | 从微软 Word 格式到 HTML, LaTeX, 等格式的文件转换器。
`unrtf` | V:0.3, I:2.9 | 159 | rtf→html | 从 RTF 到 HTML 等的转换器
`wp2x` | V:0.01, I:0.09 | 200 | WordPerfect→任意格式 | WordPerfect 5.0 和 5.1 文件到 TeX, LaTeX, troff, GML 和 HTML

### 11.2.4. XML 数据检查

对于非 XML 的 HTML 文件，你能够转换它们为 XHTML，XHTML 是一个相当成型的 XML 实例。XHTML 能够被 XML 工具处理.

XML 文件的语法和在它们中发现的 URL 的完整性，能够被检查。

表 11.11. XML 美化打印工具列表

软件包 | 流行度 | 大小 | 功能 | 说明
--- | --- | --- | --- | ---
`libxml2-utils` | V:62, I:209 | 211 | xml↔html↔xhtml | 使用 xmllint(1) 的 XML 命令行工具 (语法检查，重新格式化，梳理, …)
`tidy` | V:0.9, I:7.3 | 79 | xml↔html↔xhtml | HTML 语法检查和重新格式化
`weblint-perl` | V:0.06, I:0.91 | 32 | 检查 | 用于 HTML 的小巧的语法检查器
`linklint` | V:0.06, I:0.47 | 343 | 链接检查 | 快速的网站维护工具及链接检查器

一旦适当的 XML 生成，基于标记的内容等，你能够使用 XSLT 技术提取数据。

## 11.3. 排版

Unix上的 troff 程序最初是由 AT&T 公司开发的，可以被用做简单排版。现在被用来创建手册页。

Donald Knuth 发明的 Tex 是非常强大的排版工具也是实际上的标准。最初是由 Leslie Lamport 开发的 LaTex 使得用户可以更为方便的利用 Tex 的强大功能。

表 11.12. 排版工具的列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`texlive` | V:1, I:28 | 55 | (La)TeX | 用于排版、预览和打印的 TeX 系统
`groff` | V:2, I:24 | 16514 | troff | GNU troff 文本格式化系统

### 11.3.1. roff 排版

传统意义上，roff 是 Unix 上主要的文本处理系统。参见 roff(7), groff(7), groff(1), grotty(1), troff(1), groff_mdoc(7), groff_man(7), groff_ms(7), groff_me(7), groff_mm(7) 和 "`info groff`"。

安装好 `groff` 软件包以后，你输入 "`-me`" 宏指令就能看到一份不错的指导手册，它的位置是 "`/usr/share/doc/groff/`"。

| 提示
"`groff -Tascii -me -`" 输出带有 ANSI 转义码的纯文本。如果你想要 manpage 的输出带有许多 "^H" 和 "_"，那么使用替代命令 "`GROFF_NO_SGR=1 groff -Tascii -me -`"。

| 提示
如果想要移除 `groff` 生成的文本文件中的 "^H" 和 "_"，使用 "`col -b -x`" 来过滤它。

### 11.3.2. TeX/LaTeX

Tex Live 软件提供了全部的 TeX 系统。`texlive` 元软件包只是 TeX Live 中的一部分，但是它足够应付日常任务。

这里有许多可用的 TeX 和 LaTeX 的参考资料。

- The teTeX HOWTO: The Linux-teTeX Local Guide

- tex(1)

- latex(1)

- texdoc(1)

- texdoctk(1)

- "The TeXbook", 作者 Donald E. Knuth, (Addison-Wesley)

- "LaTeX - A Document Preparation System", 作者 Leslie Lamport, (Addison-Wesley)

- "The LaTeX Companion", 作者 Goossens, Mittelbach, Samarin, (Addison-Wesley)

这是最强大的排版环境。许多 SGML 处理器把它作为其后台字处理工具。`lyx` 软件包提供的 Lyx 和 `texmacs` 软件包提供的 GNU TeXmacs 都为 LaTeX 提供了非常不错的所见即所得的编辑环境，然而许多人使用 Emacs 和 Vim 作为其源代码编辑器。

有许多在线资源存在。

- TEX Live Guide - TEX Live 2007 ("`/usr/share/doc/texlive-doc-base/english/texlive-en/live.html`") (`texlive-doc-base` 包)

- Latex/Lyx 的一个简单指引

- 使用 LaTeX 进行文字处理

当文档变得更大时，TeX 有时会出错。你必须在 "`/etc/texmf/texmf.cnf`" 中增加 pool 的大小 (更确切的说话是编辑是 "`/etc/texmf/texmf.d/95NonPath`" 并且运行 update-texmf(8)) 来修复此问题。

| 注意
"The TeXbook" 的 TeX 源码可以从 texbook.tex 的 www.ctan.org tex-archive 站点上下载。此文件包含了绝大多数所需的宏指令。我听说把文档中的第7到第10行注释了并且添加 "`\input manmac \proofmodefalse`"，就可以用 tex(1) 来处理此文档。我强烈建议去购买这本书 (还有 Donald E. Knuth 写的其他书) 而不是使用在线版本，但是在线版本中的源码确实是学习 Tex 输入很好的例子！

### 11.3.3. 漂亮的打印手册页

你能够用如下任意一个命令在打印机上漂亮的打印手册页。

    $ man -Tps some_manpage | lpr

### 11.3.4. 创建手册页

尽管用纯 troff 格式写手册页（manpage）是可能的，这里还是有一些辅助的程序包用于创建手册页。

表 11.13. 创建手册页的工具列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`docbook-to-man` | V:0.6, I:5.7 | 189 | SGML→man 手册页 | 从 DocBook SGML 到 roff 手册页宏指令的转换器
`help2man` | V:0.6, I:6.3 | 542 | text→man 手册页 | 通过 --help 参数自动生成手册页的工具
`info2man` | V:0.01, I:0.19 | 134 | info→man 手册页 | 转换 GNU info 到 POD 或手册页的转换器
`txt2man` | V:0.06, I:0.64 | 112 | text→man 手册页 | 把纯粹的 ASCII 文本转化为手册页格式

## 11.4. 可打印的数据

在 Debian 系统中，可打印的数据是 PostScript 格式的。对于非 PostScript 打印机，通用 Unix 打印系统 (CUPS) 使用 Ghostscript 作为其后台光栅（rasterizer）处理程序。

在最近的 Debian 系统中，可打印的数据，也可以用 PDF 格式表示。

PDF 文件能够使用 GUI（图形用户界面）的查看工具显示，它的排版条目也可以被填充到 GUI（图形用户界面）查看工具，比如 Evince 和 Okular (参见 第 7.4 节 “GUI（图形用户界面）应用”); 以及现代浏览器，比如 Chromium。

PDF 文件能够使用某些图像工具编辑，比如 LibreOffice、Scribus 和 Inkscape (参见 第 11.6 节 “图形数据工具”)。

| 提示
你能够用 GIMP 阅读 PDF 文件，并能够用高于 300 dpi 像素的解析度，将 PDF 转换为 PNG 格式。这个可以作为 LibreOffice 背景图片，用最简单的操作生成一个期望的替代打印输出。

### 11.4.1. Ghostscript

处理可打印的数据的核心是 Ghostscript PostScript 解释器，它能够生成光栅图像（raster image）。

表 11.14. Ghostscript PostScript 解释器列表

软件包 | 流行度 | 大小 | 说明
--- | --- | --- | ---
`ghostscript` | V:142, I:563 | 177 | GPL Ghostscript PostScript/PDF 解释器
`ghostscript-x` | V:0, I:15 | 88 | GPL Ghostscript PostScript/PDF 解释器-X 显示支持
`libpoppler156` | V:9, I:16 | 4989 | PDF 渲染库 (xpdf PDF 浏览器的分支)
`libpoppler-glib8t64` | V:68, I:297 | 576 | PDF 渲染库（基于 Glib 的共享库)
`poppler-data` | V:150, I:585 | 13086 | 用于 PDF 渲染库的 CMaps (CJK 支持：Adobe-*)

| 提示
"`gs -h`" 能够显示 Ghostscript 的配置信息。

### 11.4.2. 合并两个 PS 或 PDF 文件

你能够使用 Ghostscript 中的 gs(1) 来合并两个 PostScript(PS) 或可移植文档格式（PDF） 文件。

    $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=bla.ps -f foo1.ps foo2.ps
    $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

| 注意
PDF 是用途很广的跨平台可打印的数据格式，它本质上是带有一些额外特性和扩展的压缩了的 PS 格式。

| 提示
对于命令行来说，psmerge(1) 和 `psutils` 包中的其他命令在处理 PostScript 文档时是很有用的。`pdftk` 包中的 pdftk(1) 在处理 PDF 文档的时候同样是很好用的。

### 11.4.3. 处理可印刷数据的工具

如下是处理可印刷数据的工具列表。

表 11.15. 处理可印刷数据的工具列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`poppler-utils` | V:106, I:474 | 756 | pdf→ps,text,… | PDF 工具：`pdftops`, `pdfinfo`, `pdfimages`, `pdftotext`, `pdffonts`
`psutils` | V:4, I:51 | 34 | ps→ps | PostScript 文件转换工具
`poster` | V:0.1, I:1.7 | 57 | ps→ps | 用 PostScript 页制作大型海报
`enscript` | V:1, I:11 | 2138 | text→ps, html, rtf | 转化 ASCII 文本到 PostScript, HTML, RTF 或 Pretty-Print
`a2ps` | V:0.7, I:7.1 | 4109 | text→ps | '任何文本到 PostScript' 的转换器并且也是相当不错的打印程序
`pdftk` | V:1, I:22 | 28 | pdf→pdf | PDF 文档转换工具：`pdftk`
`html2ps` | V:0.1, I:1.7 | 256 | html→ps | 从 HTML 到 PostScript 的转换器
`gnuhtml2latex` | V:0.05, I:0.58 | 26 | html→latex | 从 html 到 latex 的转换器
`latex2rtf` | V:0.1, I:2.1 | 495 | latex→rtf | 转换 LaTeX 文档到能被 Microsoft Word 读取的 RTF 格式的文档
`ps2eps` | V:2, I:33 | 95 | ps→eps | 从 PostScript 到 EPS（Encapsulated PostScript）的转换器
`e2ps` | V:0.01, I:0.11 | 104 | text→ps | 带有日文编码支持的文本到 PostScript 转换器
`impose+` | V:0.1, I:1.5 | 118 | ps→ps | PostScript 工具
`trueprint` | V:0.01, I:0.09 | 148 | text→ps | 漂亮的打印许多源程序（C, C++, Java, Pascal, Perl, Pike, Sh, 和 Verilog）到 PostScript。(C 语言)
`pdf2svg` | V:0.2, I:3.0 | 33 | pdf→svg | PDF 到svg 可缩放矢量图形（Scalable Vector Graphics）格式的转换器
`pdftoipe` | V:0.01, I:0.46 | 70 | pdf→ipe | 从 PDF 到 IPE‘s XML 格式的转换器

### 11.4.4. 用 CUPS 打印

Unix 通用打印系统（CUPS） 中的 lp(1) 和 lpr(1) 命令都提供了自定义打印数据的选项。

你可以使用下列命令中的一个来打印 3 份有装订页码的文件。

    $ lp -n 3 -o Collate=True filename

    $ lpr -#3 -o Collate=True filename

你能够通过 "`-o number-up=2`", "`-o page-set=even`", "`-o page-set=odd`", "`-o scaling=200`", "`-o natural-scaling=200`" 等等打印机选项来进一步定制打印机操作，详细的文档参见命令行打印和选项。

## 11.5. 邮件数据转换

下列邮件数据转换软件包捕获了我的眼球。

表 11.16. 有助于邮件数据转换的软件包列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`sharutils` | V:3, I:28 | 1436 | 邮件 | shar(1), unshar(1), uuencode(1), uudecode(1)
`mpack` | V:0.9, I:8.0 | 109 | MIME | 编码和解码 MIME 信息: mpack(1) 和 munpack(1)
`tnef` | V:0.4, I:4.1 | 103 | ms-tnef | 解包 MIME 附件类型 "application/ms-tnef"，该格式仅由微软使用
`uudeview` | V:0.2, I:1.8 | 105 | 邮件 | 下列格式的编码器和解码器: uuencode, xxencode, BASE64, quoted printable 和 BinHex

| 提示
如果邮件客户端可以配置使用 IMAP4 服务器，互联网消息访问协议 版本 4 (IMAP4) 服务器可以用来把邮件从专有邮件系统里面移出来。

### 11.5.1. 邮件数据基础

邮件 (SMTP) 数据需要被限制为 7 位数据序列。二进制数据和 8 位文本数据使用 Multipurpose Internet Mail Extensions (MIME) 互联网多用途邮件扩展 和选择的字符集编码到 7 位格式。(参见 表 11.2 “编码值和用法的列表”)。

标准的邮件存储格式是 mbox，它是依据 RFC2822 (由 RFC822 更新) 来的格式. 参见 mbox(5) (由 `mutt` 软件包提供).

对于欧洲语言,由于没有什么 8 位字符，"`Content-Transfer-Encoding: quoted-printable`" 加 ISO-8859-1 字符集通常被用于邮件。如果欧洲文本是被编码为 UTF-8,由于几乎全是 7 位数据，使用 "`Content-Transfer-Encoding: quoted-printable`" 也是合适的。

对于日语，传统的 "`Content-Type: text/plain; charset=ISO-2022-JP`" 通常被用于邮件来保持文本在 7 位。但是老的微软系统会在没有声明的情况下使用 Shift-JIS 来发送邮件。如果日语文本是用 UTF-8 编码, 由于含有许多 8 位数据，使用 Base64 是合适的。其它亚洲语言也是类似情形。

| 注意
如果你的非 Unix 邮件数据可以通过一个具备和 IMAP4 服务通讯的非 Debian 客户端访问，你可以通过运行你的 IMAP4 服务来将邮件数据移出。

| 注意
如果你使用其它邮件存储格式，第一步把它们移动到 mbox 格式比较好。像 mutt(1) 这样多功能的客户端程序可以便捷的完成这类操作。

你可以使用 procmail(1) 和 formail(1) 把邮箱内容分开成每一封邮件.

每一封邮件能够使用来自 `mpack` 软件包的 munpack(1) 命令（或其它特异的工具）来获得 MIME 编码内容。

## 11.6. 图形数据工具

虽然像 gimp(1) 这样的图形界面程序是非常强大的，但像 imagemagick(1) 这样的命令行工具在用脚本自动化处理图像时是很有用的。

实际上的数码相机的图像是可交换的图像文件格式(EXIF)，这种格式是在 JPEG 图像文件格式上添加一些元数据标签。它能够保存诸如日期、时间和相机设置的信息。

Lempel-Ziv-Welch (LZW)无损数据压缩专利已经过期了。使用 LZW 压缩方式的 图形交互格式（GIF）工具现在可以在 Debian 系统上自由使用了。

| 提示
任何带有可移动记录介质的数码相机或扫描仪都可以在 Linux 上通过 USB 存储读取器来工作，因为它遵循相机文件系统设计规则并且使用 FAT 文件系统，参考第 10.1.7 节 “可移动存储设备”。

### 11.6.1. 图形数据工具（元软件包）

下列元软件包是用 aptitude(8) 搜索图像数据工具的一个好的起点。“Debian 图像工具维护团队的软件包概览” 能够作为另外一个起点。

表 11.17. 图形数据工具列表（元软件包）

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`education-graphics` | I:0.35 | 25 | svg，jpeg，…… | 用于图像教学和图片艺术的元软件包。
`open-font-design-toolkit` | I:0.04 | 9 | ttf, ps, … | 用于开放字体设计的元软件包

| 提示
在 aptitude(8) （参考第 2.2.6 节 “aptitude 搜索方式选项”）中用正则表达式 "`~Gworks-with::image`" 来查找更多的图像工具。

### 11.6.2. 图形数据工具（GUI 图形用户界面）

下列 GUI（图形用户界面）的图形数据转换、编辑和管理工具的软件包捕获了我的眼球。

表 11.18. 图形数据工具（GUI 图形用户界面）列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`gimp` | V:44, I:216 | 32791 | 图形(位图） | GNU 图形处理程序
`xsane` | V:9, I:129 | 1512 | 图形(位图） | 用于 SANE 的基于 GTK 的前端图形界面 (现在访问扫描仪就很简单了)
`scribus` | V:1, I:13 | 32423 | ps/pdf/SVG/… | Scribus DTP 编辑器
`libreoffice-draw` | V:82, I:418 | 10995 | 图形（矢量） | LibreOffice 办公套件-绘画
`inkscape` | V:12, I:78 | 112538 | 图形（矢量） | SVG（可升级矢量图形)编辑器
`dia` | V:1, I:17 | 3802 | 图形（矢量） | 图表编辑器（Gtk）
`xfig` | V:0.6, I:8.9 | 7951 | 图形（矢量） | 在图形界面下，交互式的生成图像变得方便
`gocr` | V:0.5, I:3.9 | 549 | image→text | 免费 OCR 软件
`eog` | V:26, I:143 | 10524 | 图像(Exif) | Eye of GNOME 图像浏览程序
`gthumb` | V:3, I:12 | 5162 | 图像(Exif) | 图像浏览器（GNOME）
`geeqie` | V:3, I:11 | 2903 | 图像(Exif) | 基于 GTK 的图像浏览器
`shotwell` | V:14, I:246 | 6334 | 图像(Exif) | 数码相片管理器（GNOME）
`gwenview` | V:40, I:115 | 6000 | 图像(Exif) | 图片浏览器（KDE）
`kamera` | I:114 | 992 | 图像(Exif) | KDE 上的支持数码相机的应用软件
`digikam` | V:1.5, I:8.3 | 324 | 图像(Exif) | 用于 KDE 桌面环境的数字照片管理应用
`darktable` | V:4, I:11 | 35876 | 图像(Exif) | 摄影师的虚拟灯台和暗房
`hugin` | V:0.5, I:5.6 | 6476 | 图像(Exif) | 全景图片合成器
`librecad` | V:1, I:14 | 9164 | DXF，…… | 2D CAD 数据编辑器
`freecad` | V:1, I:21 | 112 | DXF，…… | 3D CAD 数据编辑器
`blender` | V:2, I:20 | 92911 | blend, TIFF, VRML, … | 用于动画的 3D 编辑器
`mm3d` | V:0.02, I:0.21 | 4123 | ms3d, obj, dxf, … | 基于 OpenGL 的 3D 模型编辑器
`fontforge` | V:0.6, I:5.6 | 4054 | ttf, ps, … | 用于 PS，TrueType 和 OpenType 的字体编辑器
`xgridfit` | V:0.01, I:0.08 | 878 | ttf | 用于TrueType 字体的 网格拟合和小字还原技术 的程序

### 11.6.3. 图形数据工具 (CLI 命令行)

下列 CLI（命令行）的图形数据转换、编辑和管理工具的软件包捕获了我的眼球。

表 11.19. 图形数据工具(CLI 命令行)列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`imagemagick` | V:9, I:278 | 79 | 图形(位图） | 图形处理程序
`graphicsmagick` | V:1.0, I:8.6 | 5816 | 图形(位图） | 图像处理程序（`imagemagick`派生出来的)
`netpbm` | V:27, I:288 | 8435 | 图形(位图） | 图形界面的转换工具
`libheif-examples` | V:0.3, I:3.5 | 438 | heif→jpeg(bitmap) | 转化 高性能图像文件格式(HEIF) 到 JPEG、PNG 或 Y4M 格式，用 heif-convert(1)命令
`icoutils` | V:3, I:34 | 221 | png↔ico(bitmap) | MS Windows 符号和光标转化为 PNG 格式，或者从 PNG 格式转化为位图格式 (favicon.ico)
`pstoedit` | V:2, I:39 | 1075 | ps/pdf→image(矢量) | PostScript 和 PDF 文件到可编辑的矢量图形的转换器（SVG）
`libwmf-bin` | V:5, I:83 | 149 | Windows/image(矢量) | Windows 元文件 (矢量图形数据) 转换工具
`fig2sxd` | V:0.03, I:0.18 | 158 | fig→sxd(矢量) | 转换 XFig 文件为 OpenOffice.org 绘画格式
`unpaper` | V:2, I:16 | 417 | image→image | 后处理 OCR 扫描页面的工具
`tesseract-ocr` | V:8, I:33 | 2209 | image→text | 基于惠普的商业 OCR 引擎的免费 OCR 软件
`tesseract-ocr-eng` | V:8, I:33 | 4032 | image→text | OCR 引擎数据：用于英文文本的 tesseract-ocr 语言文件
`ocrad` | V:0.3, I:2.4 | 608 | image→text | 免费 OCR 软件
`exif` | V:3, I:51 | 335 | 图像(Exif) | 显示 JPEG 文件中的 EXIF 信息的命令行工具
`exiv2` | V:2, I:19 | 429 | 图像(Exif) | EXIF/IPTC 元数据处理工具
`exiftran` | V:1, I:11 | 81 | 图像(Exif) | 改变数码照相机的 jpeg 图像格式
`exiftags` | V:0.3, I:2.7 | 309 | 图像(Exif) | 从数码相机的 JPEG 文件读取 Exif 标签的实用工具
`exifprobe` | V:0.2, I:2.1 | 506 | 图像(Exif) | 从数码图片中读取元数据
`dcraw` | V:0.8, I:7.3 | 428 | image(原始的)→ppm | 解码原始的数码相机图片
`findimagedupes` | V:0.1, I:1.1 | 75 | image→fingerprint | 找到相似或重复的图像
`ale` | V:0.02, I:0.16 | 850 | image→image | 合并图像来增加保真度或者用于创建马赛克
`imageindex` | V:0.2, I:1.2 | 143 | image(Exif)→html | 从图形中创建静态 HTML 图库
`outguess` | V:0.11, I:0.99 | 230 | jpeg,png | 通用的 Steganographic 工具
`jpegoptim` | V:0.6, I:6.0 | 59 | jpeg | 优化 JPEG 文件
`optipng` | V:2, I:40 | 187 | png | 优化 PNG 文件，无损压缩
`pngquant` | V:1, I:10 | 62 | png | 优化 PNG 文件，有损压缩

## 11.7. 不同种类的数据转换工具

这里有许多其他用于数据转换的工具。在 aptitude(8)（参考 第 2.2.6 节 “aptitude 搜索方式选项”） 里用正则表达式 "`~Guse::converting"`" 来查找如下的软件包。

表 11.20. 不同种类的数据转换工具列表

软件包 | 流行度 | 大小 | 关键词 | 说明
--- | --- | --- | --- | ---
`alien` | V:1, I:13 | 150 | rpm/tgz→deb | 把外来的软件包转换为 Debian 软件包
`freepwing` | V:0.00, I:0.02 | 447 | EB→EPWING | 把 "电子书" (在日本流行) 变成单一的 JIS X 4081 格式 (EPWING V1 的子集）
`calibre` | V:7, I:24 | 65193 | any→EPUB | 电子书转换器和库管理

你能够通过如下的命令从 RPM 格式的包中提取数据。

    $ rpm2cpio file.src.rpm | cpio --extract

第 10 章 数据管理 |  | 第 12 章 编程