Amazon Kindle eBooks: OPF file example

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.