←前へ 目次↑ 次へ→

4.5. HTML/XMLの処理

4.5.1. ドキュメントの判別

Copper PDFはドキュメントがHTMLかXMLであるかを、以下の情報をもとに判別します。

  1. プログラマが指定したドキュメントのMIMEタイプ
  2. HTTPのContent-Typeヘッダ

1の情報は、2より優先されます。 上記の情報以外によりCopper PDFがドキュメントの型を判別することはありません。 HTMLとして判別されたドキュメントは、<?xml~で開始していても、HTMLとして認識します。 ただし、HTMLと認識されても、XMLやXHTMLがサポートしている名前空間は認識されます。

HTMLと認識された文書は、ゆるやかに解釈されるため、文法ミスが許容されます。

一方、XMLと認識された文書は厳密に解釈されます。 XHTMLを記述する場合、全ての要素名と属性名は小文字で記述してください。 文法エラーがあった場合、処理が停止します。

キャラクタ・エンコーディング

Copper PDFが認識出来るキャラクタ・エンコーディングはJava実行環境に依存します。 エンコーディング名のリストは Java実行環境の「サポートされているエンコーディング」ドキュメント を参照してください。

XMLドキュメントのキャラクタ・エンコーディングは、次の順に判別します。

  1. プログラマが指定したドキュメントのキャラクタ・エンコーディング
  2. XML宣言のencoding属性

デフォルトのエンコーディングは、XMLの仕様に従い、UTF-8またはUTF-16が自動判別されます。

HTMLドキュメントのキャラクタ・エンコーディングは、次の順に判別します。

  1. プログラマが指定したドキュメントのキャラクタ・エンコーディング
  2. <meta http-equiv="Content-Type" content="text/html; charset=エンコーディング名">
  3. input.default-encodingによるエンコーディング

input.default-encodingはデフォルトではJISAutoDetect(ISO-2022-JP, Shift_JIS, EUC_JPの自動判別)です。

4.5.2. 文書情報

Copper PDFはHTMLのmeta要素から取得した情報を、PDFの文書情報として使用します。 文書情報はHTMLの<meta name="名前" content="値">要素によって設定することが出来ます。 ただし、TITLEはHTMLのtitle要素の内容も使われます。

meta要素による文書情報の設定
名前 PDFの属性名 説明
TITLE Title/タイトル 文書の表題。
DESCRIPTION
SUBJECT
Subject/サブタイトル 文書に内容についての簡潔な説明。
KEYWORDS Keywords/キーワード スペースまたはカンマ区切りで羅列した、文書の内容に関連するキーワード。
AUTHOR Author/作成者 文書の作成者。
PRODUCER Producer/PDF変換 PDFを生成したプログラム。 省略した場合はCopper PDFの名前とバージョンが入ります。
GENERATOR
CREATOR
Creator/アプリケーション HTML文書を生成したプログラム、エディタ、オーサリングツールなど。

なお、meta要素のname属性は大文字小文字を区別しません。 <meta name="AUTHOR" content="作者名">としても、
<meta name="Author" content="作者名">としても、
PDF文書に作者名が設定されます。

文書情報は、入出力プロパティによっても設定することが出来ます 2.0.3

により、名前と値を設定することが出来ます。 nは0から始まる連番で、複数の文書情報を設定することが出来ます。 この設定は、前記のmeta要素で上書きされます。

4.5.3. 見出し

HTMLのh1~h6要素は、見出しとして特別な意味を持ちます。 h1~h6要素の数字は見出しのレベルとして認識され、 数字が大きいものほど深い階層にあるものとして処理されます。

また、任意の要素にhtml:header="レベル"という属性を付与することで、 任意の要素をHTMLのh1~h6要素と同様の意味を持たせることが出来ます。

ブックマーク

output.pdf.bookmarks をtrueにすると、PDFのブックマーク(しおり)が生成されます。 ブックマークは、見出しのレベルによって自動的に階層化されます。

現在ページのセクション

ページの内容として出力済みの見出しを、content プロパティ内で-cssj-heading関数によって生成することが出来ます。

content: -cssj-heading(1) ' - ' -cssj-heading(2);

上の例はレベル1とレベル2の見出しを表示します。 すなわち、ドキュメントの先頭から、前ページの最後までの間で、 一番最後のh1とh2の内容を表示します。

-cssj-heading関数を -cssj-page-content が設定されたページで使用すると、ドキュメントの先頭から現在のページの最後までの間で、 一番最後の見出しを表示することが出来ます。 これは、ノンブルに見出しを表示する場合に便利です。

4.5.4. 目次の生成

見出しは、目次の生成に利用することが出来ます。 目次を生成するためには、Copper PDFが文書全体の見出しと、 見出しのあるページ番号を収集している必要があります。

<cssj:make-toc xmlns:cssj="http://www.cssj.jp/ns/cssjml"
               counter="page-number" type="decimal"/>

ドキュメントの末尾に目次を生成する場合は、目次の生成の開始時点で本文が全て処理されていますが、 ドキュメントの先頭や途中に目次を生成する場合は、2パス以上の処理が必要です。

counter属性はページ番号を振るために使用するページカウンタの名前です。 typeは、ページ番号のタイプです。CSSのlist-style-type で使われるのと同じタイプ名が利用可能です。

生成される目次は、次のようなリストの形式をしています。

  <ul class="cssj-toc">
    <li><a href="#cssj-heading-1"><span class="cssj-title">1. タイトル1</span><span class="cssj-page">1</span></a></li>
    <li><a href="#cssj-heading-2"><span class="cssj-title">2. タイトル2</span><span class="cssj-page">5</span></a></li>
    <li><a href="#cssj-heading-3"><span class="cssj-title">3. タイトル3</span><span class="cssj-page">8</span></a></li>
    <ul>
      <li><a href="#cssj-heading-4"><span class="cssj-title">3.1. タイトル4</span><span class="cssj-page">8</span></a></li>
      <li><a href="#cssj-heading-5"><span class="cssj-title">3.2. タイトル5</span><span class="cssj-page">9</span></a></li>
    </ul>
  </ul>

例として、以下のようなスタイルシートを使うことで目次を整形してください。

ul.cssj-toc, ul.cssj-toc ul {
  list-style: none;
}
ul.cssj-toc {
  margin: 0;
}
ul.cssj-toc ul {
  margin: 1em;
}
ul.cssj-toc li {
  margin: 1em 1em 1.5em 0;
  font-family: sans-serif;
  height: 0.5em;
  border-bottom: 1pt dotted;
}
ul.cssj-toc ul li {
  margin: 0 0 0.5em 1em;
  font-family: serif;
}
ul.cssj-toc span {
  background-color: White;
  padding: 0 0.5em;
}
ul.cssj-toc span.cssj-page {
  position: absolute;
  right: 0;
}

フラグメント識別子によるリンク

output.pdf.hyperlinks をtrueに設定すると、文書内のハイパーリンクがPDFに反映されます。

デフォルトでは、ハイパーリンクは文書のURIに対する相対アドレスに変換されます。 ハイパーリンクのベースとなるURIを文書のURI以外にする場合は、 output.pdf.hyperlinks.base にURIを設定することで、変更することが出来ます。 これらの場合、PDFファイルの位置が適切でないと、リンクは意味を持ちません。

output.pdf.hyperlinks.href にabsoluteを指定すると、文書内リンクを除いて、全て絶対リンクになります。 この場合、PDFファイルの配置場所を変えてもリンクが切れることはありません。

output.pdf.hyperlinks.fragment をtrueに設定すると、ドキュメントの一部に対してフラグメント識別子によるリンクが可能になります。 フラグメントの作成方法は通常のHTMLと同じで、任意の要素のid属性と、a要素のname属性をサポートしています。

-cssj-page-ref関数

Copper PDFは、フラグメントが存在するページを表示するために、 content内で使用出来る-cssj-page-ref関数を用意しています。

@page {
	counter-increment: page;
}
span:before {
	content: 'p' -cssj-page-ref(frag, page, decimal, ', p') ' ';
}
a:after {
	content: ' (' -cssj-page-ref(attr(href), page, decimal, ', ') 'ページ)';
}

-cssj-page-ref関数の最初の引数は、参照するフラグメント識別子です。 2番目の引数はページ番号の表示に使うページカウンタです。 3番目の引数は数字のスタイルで、 list-style-typeで使われるのと同じスタイル名です。 3番目の引数を省略するとdecimalスタイルで表示されます。 4番目の引数(Copper PDF 2.0.2以降)は同じ名前のフラグメントが複数存在する場合、 複数のページ番号を表示するための区切り記号です。 4番目の引数を省略すると、最初のフラグメントのページ番号だけが表示されます。

フラグメント識別子の部分はattr関数を使うことが出来ます。 上の例のように、HTMLのa要素でhref属性の値を使うと、 フラグメントへリンクすると同時に、フラグメントが存在知るページの番号を表示することが出来ます。 なお、フラグメント識別子の最初の'#'はあってもなくても構いません。

-cssj-page-ref関数を使うためには、一般的に2パス以上の処理の処理が必要です。 ドキュメント全体の処理が一度終わらないと、ドキュメントの後の方にあるフラグメントのページが分からないためです。

4.5.6. Internet Explorerとの互換モード

完全ではありませんが、Copper PDFはWindows Internet Explorerに近いレイアウトを再現します。 このモードを有効にするには、 output.compatible_mode にtrueを設定してください。 ただし、次のいずれかのpublic idを持つDOCTYPE宣言がある場合は、通常のモードでレイアウトします。

4.5.7. XSLTスタイルシートの適用

XSLTスタイルシートはCSS同様にxml-stylesheet処理命令により適用されます。 xml-stylesheet処理命令についての詳細はCSSのxml-stylesheet処理命令の節を参照してください。

CSS同様に、デフォルトのXSLTスタイルシートを設定することが出来ます。 input.xslt.default-stylesheetにより指定されたスタイルシートが最初に適用されます。

input.xslt.default-stylesheetまたはxml-stylesheet処理命令によって、 ドキュメントに複数のXSLTスタイルシートが指定されているとき、実際に適用するのは最初に指定されたスタイルシートです。 他のスタイルシートは無視されます。

4.5.8. 注釈

cssj:annot属性は、Copper PDFを利用するアプリケーションに、メッセージを送るものです。 例えば、日付順に内容が並んでいる文書を処理する場合に、cssj:annot属性に日付を入れることで、 ドキュメント中でCopper PDFが現在処理中の部分をアプリケーションが知ることが出来ます。

4.5.9. XML中でHTMLの要素と属性を使用する

名前空間 http://www.w3.org/1999/xhtml を使用することで、 画像(img要素)、テーブルセルの結合(colspan, rowspan属性)といった HTMLの一部の要素や属性はXML内でも使用することが出来ます。

利用可能な要素や属性のリストは資料集のXMLの拡張の章を参照してください。


←前へ 目次↑ 次へ→
Copper PDF ©2008-2009 GNN & Co.,Ltd. All rights reserved.