As a quick note today, I’ve been trying to build my own Amazon Kindle eBook using HTML and CSS, and yesterday I learned that I also need an OPF file as part of the process of creating both the eBook and the Table of Contents (TOC).
This morning I found that Amazon has a collection of sample books that you can use with Kindlegen, and the “Guide” project specifically includes the following example OPF file, which is well-documented.
An example Kindle OPF file
As mentioned, this example Kindle OPF file is well-documented, and comes with Amazon’s eBook samples, as part of their Kindlegen documentation. I include it here because it was the only way I was able to create an OPF file for my own Kindle eBook:
<?xml version="1.0" encoding="utf-8"?>
<!--
The unique identifier in <package unique-identifier=”XYZ”> is a reference to
the identifier specified in <metadata> as <dc:Identifier id=”XYZ”>.
-->
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
<!--
Metadata:
The required metadata element is used to provide information about the publication
as a whole.
For detailed info visit: http://www.idpf.org/2007/opf/OPF_2.0_final_spec.html#Section2.2
-->
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
<!-- Title [mandatory]: The title of the publication. This is the title that will appear on the "Home" screen. -->
<dc:title>Kindle User's Guide</dc:title>
<!-- Language [mandatory]: the language of the publication. The language codes used are the same as in XML
and HTML. The full list can be found here: http://www.w3.org/International/articles/language-tags/
Some common language strings are:
"en" English
"en-us" English - USA
"en-gb" English - United Kingdom
"fr" French
"fr-ca" French - Canada
"de" German
"es" Spanish
-->
<dc:language>en-us</dc:language>
<!-- Cover [mandatory]. The cover image must be specified in <manifest> and referenced from
this <meta> element with a name="cover" attribute.
-->
<meta name="cover" content="My_Cover" />
<!-- The ISBN of your book goes here -->
<dc:identifier id="BookId" opf:scheme="ISBN">9781375890815</dc:identifier>
<!-- The author of the book. For multiple authors, use multiple <dc:Creator> tags.
Additional contributors whose contributions are secondary to those listed in
creator elements should be named in contributor elements.
-->
<dc:creator>Amazon.com</dc:creator>
<!-- Publisher: An entity responsible for making the resource available -->
<dc:publisher>Amazon.com</dc:publisher>
<!-- Subject: A topic of the content of the resource. Typically, Subject will be
expressed as keywords, key phrases or classification codes that describe a topic
of the resource. The BASICCode attribute should contain the subject code
according to the BISG specification:
http://www.bisg.org/what-we-do-20-73-bisac-subject-headings-2008-edition.php
-->
<dc:subject>Reference</dc:subject>
<!-- Date: Date of publication in YYYY-MM-DD format. (Days and month can be omitted).
Standard to follow: http://www.w3.org/TR/NOTE-datetime
-->
<dc:date>2009-11-17</dc:date>
<!-- Description: A short description of the publication's content. -->
<dc:description>An overview of all the Amazon Kindle features and how to use them. 3rd Edition.</dc:description>
</metadata>
<!--
Manifest:
The required manifest must provide a list of all the files that are part of the
publication (e.g. Content Documents, NCX table of contents, image files, CSS style sheets).
Kindlegen however does not require CSS and images to be specified in the manifest if they
are referenced from the content HTML.
The manifest element must contain one or more item elements with the following media-type attributes:
text/x-oeb1-document HTML content files
application/x-dtbncx+xml NCX table of contents
image/jpeg JPEG image
image/GIF GIF image
For detailed info visit: http://www.idpf.org/2007/opf/OPF_2.0_final_spec.html#Section2.3
-->
<manifest>
<!-- HTML content files [mandatory] -->
<item id="item3" media-type="application/xhtml+xml" href="UG-C2.html"></item>
<item id="item4" media-type="application/xhtml+xml" href="UG-C3.html"></item>
<item id="item5" media-type="application/xhtml+xml" href="UG-C4.html"></item>
<item id="item6" media-type="application/xhtml+xml" href="UG-C5.html"></item>
<item id="item8" media-type="application/xhtml+xml" href="UG-C7.html"></item>
<item id="item1" media-type="application/xhtml+xml" href="UG-C1.html"></item>
<item id="item14" media-type="application/xhtml+xml" href="toc.html"></item>
<item id="item15" media-type="application/xhtml+xml" href="UG-C6.html"></item>
<item id="item13" media-type="application/xhtml+xml" href="Welcome.html"></item>
<item id="item16" media-type="application/xhtml+xml" href="UG-C8.html"></item>
<item id="item18" media-type="application/xhtml+xml" href="UG-C9.html"></item>
<item id="item19" media-type="application/xhtml+xml" href="UG-C10.html"></item>
<item id="item20" media-type="application/xhtml+xml" href="Specifications.html"></item>
<item id="GraphicsC5_C5Screen-rating" media-type="image/gif" href="GraphicsC5/C5Screen-rating.gif"/>
<item id="GraphicsC5_C5Screen-Storefront" media-type="image/gif" href="GraphicsC5/C5Screen-Storefront.gif"/>
<item id="GraphicsC5_C5Screen-Details" media-type="image/gif" href="GraphicsC5/C5Screen-Details.gif"/>
note from Al: these items go on for about 85 lines ...
<item id="GraphicsC3_C3Screen-blognextarticle" media-type="image/gif" href="GraphicsC3/C3Screen-blognextarticle.gif"/>
<item id="GraphicsC3_C3Screen-newspaper" media-type="image/gif" href="GraphicsC3/C3Screen-newspaper.gif"/>
<item id="GraphicsC3_C3Screen-readermenu" media-type="image/gif" href="GraphicsC3/C3Screen-readermenu.gif"/>
<!-- table of contents [mandatory] -->
<item id="My_Table_of_Contents" media-type="application/x-dtbncx+xml" href="KUG.ncx"/>
<!-- cover image [mandatory] -->
<item id="My_Cover" media-type="image/gif" href="GraphicsWelcome/WImage-cover.gif"/>
</manifest>
<!--
Spine:
Following manifest, there must be one and only one spine element, which contains one
or more itemref elements. Each itemref references an document designated
in the manifest. The order of the itemref elements organizes the associated content
files into the linear reading order of the publication.
The toc attribute refers to the id ref of the NCX file specified in the manifest.
For detailed info visit:
http://www.idpf.org/2007/opf/OPF_2.0_final_spec.html#Section2.4
http://www.niso.org/workrooms/daisy/Z39-86-2005.html#NCX
-->
<spine toc="My_Table_of_Contents">
<!-- the spine defines the linear reading order of the book -->
<itemref idref="item14"/>
<itemref idref="item13"/>
<itemref idref="item1"/>
<itemref idref="item3"/>
<itemref idref="item4"/>
<itemref idref="item5"/>
<itemref idref="item6"/>
<itemref idref="item15"/>
<itemref idref="item8"/>
<itemref idref="item16"/>
<itemref idref="item18"/>
<itemref idref="item19"/>
<itemref idref="item20"/>
</spine>
<!--
Guide:
Within the package there may be one guide element, containing one or more reference elements.
The guide element identifies fundamental structural components of the publication, to enable
Reading Systems to provide convenient access to them.
For detailed info visit: http://www.idpf.org/2007/opf/OPF_2.0_final_spec.html#Section2.6
The Kindle reading system support two special guide items which are both mandatory.
type="toc" [mandatory]: a link to the HTML table of contents
type="text" [mandatory]: a link to where the content of the book starts (typically after the front matter)
Kindle reading platforms need both thede guid items to provide a consistent user enxperience to the user.
It is good practice to include both a logical table of contents (NCX) and an HTML table of contents
(made of hyperlinks). The NCX enables various advanced navigation features but the HTML table of
contents can easily be discovered by the user by paging through the book. Both are useful.
-->
<guide>
<reference type="toc" title="Table of Contents" href="toc.html"></reference>
<reference type="text" title="Welcome" href="Welcome.html"></reference>
</guide>
</package>
Discussion
Amazon also has their Kindle Publishing Guidelines PDF document, but seeing this sort of OPF file example was the only way I was able to piece together what should go in an OPF file when you’re creating a Kindle eBook from your own HTML and CSS. The documentation in this file is priceless if you’re trying this process on your own.