FOP(Fop-0.20.2、jpfop-0.20.2)でXMLをPDFに変換するのに以下のように実行しました。PDFは作成できたのですが開こうとすると「文書を作成するときにエラーが発生しました。修復できません」となってしまって、開くことができません。
userconfig.xmlにはMSGothicのフォントの設定をしました。
サンプルに入っているcid-fonts.foも試してみましたが、日本語の表示が##になってしまい表示ができません。
どのようにすれば、日本語がきちんと表示されるPDFが作成できるのでしょうか?
よろしくお願いします。

set XERCES=lib\xerces-1.2.3.jar
set XALAN=lib\xalan-2.0.0.jar
set FOP=build\fop-0.20.2-jp.jar
set BATIK=lib\batik.jar
set FRAMEWORK=lib\avalon-framework-4.0.jar
set LOGKIT=lib\logkit-1.0b4.jar
set JIMI=lib\jimi-1.0.jar
set USERCONFIG=conf\userconfig.xml

java -cp %FOP%;%BATIK%;%XALAN%;%XERCES%;%FRAMEWORK%;%LOGKIT%;%JIMI% org.apache.fop.apps.Fop -c %USERCONFIG% -xml book.xml -xsl book.xsl -pdf book.pdf

このQ&Aに関連する最新のQ&A

A 回答 (2件)

No.1の補足というか訂正です。



userconfig.xml(userconfig-ja.xml)で指定された相対パスは、このファイルの位置を基準とするのではなく、current directoryを基準とするようです。訂正します。
この仕組みでは扱いにくい気がするので、絶対パスで指定しておいた方が良いかもしれません。
    • good
    • 0
この回答へのお礼

msgothic.xmlの配置場所を変えてみると正しく日本語が表示されました。
ありがとうございます。

お礼日時:2002/12/03 20:31

FOPについてあまり詳しくないので、解決まで導ける自信はないのですが、確認すべき点だけでも。



おそらくは、userconfig.xmlが間違っているんだと思います。

jpfop-0.20.2\docs\examplesの中にあるuserconfig-ja.xmlを使ってみて、うまく動くかどうか試してみてください。このファイルは相対パスでmsgothic.xml(これもjpfop-0.20.2\docs\examplesにあります)を参照しているようなので、同じフォルダにmsgothic.xmlを置くか、msgothic.xmlの場所に合わせて指定を修正する必要があります。

うまく動かない場合には、jpfop-0.20.2\docs\examples\runtests.batを実行して成功するのがあるかどうか確認して下さい。それでもうまく動かない場合は、私にはよく分かりません。

とりあえず、私の環境で、日本語が表示できるPDFを作成できる場合がある(どんなファイルでもすべてうまく作成できるかどうかは分かりませんが)のは確かです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QXMLをxalanでXSL-FOに変換する

book.xmlとbook.xslでbook.foに変換にxalanで実行しました。
>java org.apache.xalan.xslt.Process -in book.xml -xsl book.xsl -out book.fo
ところが、以下のようにエラーが出ました。
Exception in thread "main" java.lang.ClassCastException: org.apache.xalan.res.XSLTErrorResources_ja
at org.apache.xalan.xslt.Process.main(Process.java:209)
何が原因なのでしょうか?xalan-j_2_4_1のxalan.jarとxercesImpl.jarにはCLASSPATH設定をしています。

<book.xml>
<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml:stylesheet type="text/xsl" href="book.xsl" ?>
<書籍管理>
<書籍情報 ID="1">
<書籍名>スタイルシート辞典 第2版</書籍名>
<著者>安川英明</著者>
<出版社>翔泳社</出版社>
<価格>1800</価格>
</書籍情報>
・・・
<書籍管理>

文字数が多くなってすべてbook.xslがかけませんでした。
テーブル形式で表示するようしたいのです。
<xsl:template match="書籍管理"><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
・・・
<fo:table>
<fo:table-column column-width="50mm"/>
・・・
<fo:table-body><fo:table-row><fo:table-cell><fo:block>書籍名</fo:block></fo:table-cell>・・・</fo:table-row>
<xsl:apply-templates/>
</fo:table-body>
</fo:table>
</fo:flow></fo:page-sequence>
</fo:root></xsl:template>
<xsl:template match="書籍情報">
<fo:table-row><xsl:apply-templates/></fo:table-row>
</xsl:template>
<xsl:template match="書籍名">
<fo:table-cell><fo:block><xsl:value-of select='.'/></fo:block></fo:table-cell>
</xsl:template>

book.xmlとbook.xslでbook.foに変換にxalanで実行しました。
>java org.apache.xalan.xslt.Process -in book.xml -xsl book.xsl -out book.fo
ところが、以下のようにエラーが出ました。
Exception in thread "main" java.lang.ClassCastException: org.apache.xalan.res.XSLTErrorResources_ja
at org.apache.xalan.xslt.Process.main(Process.java:209)
何が原因なのでしょうか?xalan-j_2_4_1のxalan.jarとxercesImpl.jarにはCLASSPATH設定をしています。

<book.xml>
<?xml version="1.0"...続きを読む

Aベストアンサー

No.2で回答した者です。
とりあえず、java.net.MalformedURLException: no protocol: book.xslとメッセージが出ているのだから、XSLTの書き方を疑うよりも、URL(つまりパス)を疑うべきだと思います。

以下の実験をしてみたところ、同じエラーが出ました。

(1) 問題なく動作するXSLTスタイルシートを用意
(2) 日本語の名前の付いたフォルダを作り、そこにファイルを入れてみる
(3) Xalanを呼び出す

日本語の名前の付いたフォルダに直接含まれていなくても、パスの途中に日本語の名前のフォルダがある(「デスクトップ」とか)とエラーになるようです。
したがって、パスの途中に日本語の名前のフォルダがないかどうか、チェックしてみて下さい。

ちなみに私は、日本語名や空白を含んだ名前のフォルダがパスに含まれない位置に、ファイルやツールをなるべく置くようにしています。コンピュータを使う場合の心がけのようなものです。

QXML → table (XSLで)

XML

<pe>
<ko>
<na> goo1 </na>
<yu> 111 </yu>
</ko>
<ko>
<na> goo2 </na>
<yu> 222 </yu>
</ko>
</pe>

のようなXMLをテーブルでXSlで

<tr>
<td>goo1 111</td>
<td>goo2 222</td>
</tr>

そして、3件の場合は、

<tr>
<td>goo1 111</td>
<td>goo2 222</td>
</tr>
<tr>
<td>goo3 333</td>
</tr>


と表したいのですが、悩んでいます…。
自分でも、いろいろ試したのですが、うまく行きません。
ご助言、宜しくお願いします…。

Aベストアンサー

私も同じ様なものを考えて次のような手を思いつきました。

Code:A
<xsl:if test="position() mod 3 = 1">
<xsl:text disable-output-escaping="yes">&lt;tr&gt;</xsl:text>
</xsl:if>

もし位置が3で割って1余るなら <tr> を出力する

Code:B
<xsl:if test="position() mod 3 = 0">
<xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
</xsl:if>

もし位置が3で割って余りが0ならば </tr> を出力する

上記の二つを <xsl:for-each select="ko"> 全ての ko について繰り返す

すべて終わったら Code:B をもう一度呼び出す。

サンプルは、次のページにあります。
http://skyandcloud.homedns.org/software/download.html

参考URL:http://skyandcloud.homedns.org/software/download.html

私も同じ様なものを考えて次のような手を思いつきました。

Code:A
<xsl:if test="position() mod 3 = 1">
<xsl:text disable-output-escaping="yes">&lt;tr&gt;</xsl:text>
</xsl:if>

もし位置が3で割って1余るなら <tr> を出力する

Code:B
<xsl:if test="position() mod 3 = 0">
<xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
</xsl:if>

もし位置が3で割って余りが0ならば </tr> を出力する

上記の二つを <xsl:for-each select="ko"> 全ての ko について繰り返す

す...続きを読む

QXML→XSL→HTML?

XMLファイルをHTMLみたいに表示したいのですが、
そのときにXalanというのはかならず必要なのでしょうか?
本にはJAXPというのをおとせとかいてあるのですが、
実際に指定されているサイトにいくとそれがありません。
それかXalan等は必要なくHTMLみたいに表示することは可能なのでしょうか?
そのへんの作り方を教えて下さい。
よろしくお願いします。

Aベストアンサー

答えは「Yes」と「No」です:)

XMLファイルをHTMLみたいに表示する、ということは、一般的には、XMLファイルを元にHTMLファイルに変換、変更するということです。 この変換の手段をXSLT(eXtensible Stylesheet Language Transformation)といいます。 ここでは、とくに"Transformation"(変換)がポイントとなります。

この「変換」を何を用いって行うかが、ご質問だと思います。 通常は、"XSLTプロセッサー"の類のソフトを使います(例:XMLをプロセスしてHTML変換する)。 Xalanはそのなかの一ソフトです。 他にもプロセッサーはありますが、コマンドライン処理でいいのか、それともプログラム言語を使っておこなうのか(Javaなど)によって、どのプロセッサーがいいのかが決まってきます(ちなみに、英語のサイトではありますが、プロセッサー一覧がリストされているサイトを参考URLにつけておきました)。

ただし、この「変換処理」は、通常2ステップで行います。 (1)XMLを読み込み、各パーツに区分けする(parsing: パーシング)、(2)読み組んだものを変換する(processor: プロセッサー)。 ですので、このパーシングする「パーサー」というソフトも必用となります。 Javaですと一般的には、Xercesというものが使われます。

最後に、JAXPの位置づけですが、今説明したとおり、パーサーもプロセッサーも何種類かあり、必ずしも同じ構文を使ってプログラムできるわけではありません(バージョンによって機能も違います)。 ただ、プログラマーとしては、パーサーが変わったから構文も変えなくてはいけないとなると、大変ですよね。 そこで、JAXPは、下のレベルで実装されているパーサー及びプロセッサーの上に「かぶさる」APIで、常に同じAPIのインターフェースをプログラマーに提供します。ようするに、プログラムを変えなくても、パーサーとプロセッサーをプラグ・アンド・プレイできるということです(対象となるソフトは、JAXPと互換性がある必用があります)。

長くなりましたが、「Xalan等は必用なくHTMLみたいに表示することは可能か」ですが、Javaなどをご利用になるのでしたら、必要ですね。

ただし、今ですと、IEの6以降は、パーサーとプロセッサー機能を組み込んでいるので、XML文にXSLを指定すれば、変換もしてくれます(IEの5くらいから一部サポートがありましたが、チョット不安定です)。 ちなみに、IEもパーサーが必要で、XML Parser 3.0というのが一緒に配布されています。


Hope that helps.
-mp

参考URL:http://www.xmlsoftware.com/xslt.html

答えは「Yes」と「No」です:)

XMLファイルをHTMLみたいに表示する、ということは、一般的には、XMLファイルを元にHTMLファイルに変換、変更するということです。 この変換の手段をXSLT(eXtensible Stylesheet Language Transformation)といいます。 ここでは、とくに"Transformation"(変換)がポイントとなります。

この「変換」を何を用いって行うかが、ご質問だと思います。 通常は、"XSLTプロセッサー"の類のソフトを使います(例:XMLをプロセスしてHTML変換する)。 Xalanはそのなかの一ソフト...続きを読む

QXMLから指定テキストのみを抜き出すXSLについて

次のようなXMLからhide属性ない箇所のテキストのみを抜き出したいのですが、
どうすればよいでしょうか?

[xml]
<data>
××××<a hide="hide">○○○○○○○○○○○○</a>・<a>◎◎◎◎◎<b hide="hide">●●●</b>▲▲▲▲</a>△△△△
</data>

[求める結果]
××××・◎◎◎◎◎▲▲▲▲△△△△

Aベストアンサー

<?xml version="1.0" encoding="UTF-8"?>
<data>
××××<a hide="hide">○○○○○<c>*****</c>○○○</a>・<a>◎◎◎◎◎<b hide="hide">●●●</b>▲▲▲▲</a>△△△△
</data>
==================================
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<test>
<xsl:apply-templates />
</test>
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="count(@hide) > 0">
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

============結果=====================
<?xml version="1.0" encoding="UTF-8"?>
<test>××××・◎◎◎◎◎▲▲▲▲△△△△</test>
=====================================
* 特に指示がなかったので、c要素のように「その要素自身にはhide属性はないが、その親にhide属性がある」ような要素は内容を表示しないことにした。特に指示がなかったので、その要素の名前空間(接頭辞がない奴)以外の「接頭辞のある属性」についてはhide属性としては扱わないものとしている。(今後指示がついてもやらないけど)

* 今考えると、xsl:apply-templatesのselect属性に指定するXPathで、hide属性のない要素だけが対象となるようにしてもよかったかも、とも思うがまぁいいや。

<?xml version="1.0" encoding="UTF-8"?>
<data>
××××<a hide="hide">○○○○○<c>*****</c>○○○</a>・<a>◎◎◎◎◎<b hide="hide">●●●</b>▲▲▲▲</a>△△△△
</data>
==================================
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<test>
<xsl:apply-templates />
</test>
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="count(@hide) > 0">
</xsl:when>
<xsl:otherwise>...続きを読む

Qxslのdocument関数は外部サイトのxmlを取得できる?

同じサイトのディレクト以下に置かれているxmlだけでしょうか?

Aベストアンサー

基本的にURI指定されたものを読み込むので外部サイトでも読込できると思います。
実際に試してみるのが早いんじゃないでしょうか


おすすめ情報