Pārlūkot izejas kodu

adds support for type 1 fonts by Jeremias Maerki <jeremias.maerki@outline.ch>

based on work by Alain Fagot


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193740 13f79535-47bb-0310-9956-ffa450edef68
pull/32/head
fotis pirms 23 gadiem
vecāks
revīzija
82903c1a38
37 mainītis faili ar 2480 papildinājumiem un 380 dzēšanām
  1. 12
    0
      build.xml
  2. 1
    0
      docs/xml-docs/fop.xml
  3. 94
    0
      docs/xml-docs/fop/fonts.xml
  4. 1
    0
      docs/xml-docs/xml2xml.xsl
  5. 2
    0
      src/codegen/Courier-Bold.xml
  6. 2
    0
      src/codegen/Courier-BoldOblique.xml
  7. 2
    0
      src/codegen/Courier-Oblique.xml
  8. 2
    0
      src/codegen/Courier.xml
  9. 2
    0
      src/codegen/Helvetica-Bold.xml
  10. 2
    0
      src/codegen/Helvetica-BoldOblique.xml
  11. 2
    0
      src/codegen/Helvetica-Oblique.xml
  12. 2
    0
      src/codegen/Helvetica.xml
  13. 2
    0
      src/codegen/Symbol.xml
  14. 2
    0
      src/codegen/Times-Bold.xml
  15. 2
    0
      src/codegen/Times-BoldItalic.xml
  16. 2
    0
      src/codegen/Times-Italic.xml
  17. 2
    0
      src/codegen/Times-Roman.xml
  18. 2
    0
      src/codegen/ZapfDingbats.xml
  19. 190
    196
      src/codegen/charlist.xml
  20. 16
    0
      src/codegen/font-file.xsl
  21. 7
    0
      src/org/apache/fop/dom/NodeImpl.java
  22. 381
    0
      src/org/apache/fop/fonts/PFMFile.java
  23. 132
    0
      src/org/apache/fop/fonts/PFMInputStream.java
  24. 27
    0
      src/org/apache/fop/fonts/apps/FontPostProcess.xsl
  25. 20
    0
      src/org/apache/fop/fonts/apps/FontPostProcessSort.xsl
  26. 358
    0
      src/org/apache/fop/fonts/apps/PFMReader.java
  27. 69
    0
      src/org/apache/fop/layout/FontDescriptor.java
  28. 9
    4
      src/org/apache/fop/layout/FontMetric.java
  29. 90
    0
      src/org/apache/fop/pdf/PDFArray.java
  30. 73
    11
      src/org/apache/fop/pdf/PDFDocument.java
  31. 152
    0
      src/org/apache/fop/pdf/PDFEncoding.java
  32. 161
    37
      src/org/apache/fop/pdf/PDFFont.java
  33. 203
    0
      src/org/apache/fop/pdf/PDFFontDescriptor.java
  34. 124
    0
      src/org/apache/fop/pdf/PDFFontNonBase14.java
  35. 81
    0
      src/org/apache/fop/pdf/PDFFontType1.java
  36. 103
    0
      src/org/apache/fop/pdf/PDFRectangle.java
  37. 148
    132
      src/org/apache/fop/render/pdf/FontSetup.java

+ 12
- 0
build.xml Parādīt failu

@@ -171,6 +171,7 @@ Sometimes ant gives out this warnings, but the build is finished without any pro
<property name="charlist.xml" value="${build.codegen}/charlist.xml"/>
<property name="charlist.xsl" value="${build.codegen}/code-point-mapping.xsl"/>
<property name="fontfile.xsl" value="${build.codegen}/font-file.xsl"/>
<property name="t1fontfile.xsl" value="${build.codegen}/t1font-file.xsl"/>
<property name="Courier.xml" value="${build.codegen}/Courier.xml"/>
<property name="Courier-Oblique.xml" value="${build.codegen}/Courier-Oblique.xml"/>
<property name="Courier-Bold.xml" value="${build.codegen}/Courier-Bold.xml"/>
@@ -186,6 +187,11 @@ Sometimes ant gives out this warnings, but the build is finished without any pro
<property name="ZapfDingbats.xml" value="${build.codegen}/ZapfDingbats.xml"/>
<property name="Symbol.xml" value="${build.codegen}/Symbol.xml"/>

<!-- insert custom font information here (step 1 of 2) -->
<!-- use this as a template
<property name="myfont.xml" value="${build.codegen}/myfont.xml"/>
-->

<taskdef name="xslt" classname="Xslt"/>
<available property="xt.present" classname="com.jclark.xsl.sax.XSLProcessor"/>
<available property="jimi.present" classname="com.sun.jimi.core.Jimi"/>
@@ -306,6 +312,12 @@ Sometimes ant gives out this warnings, but the build is finished without any pro
<xslt infile="${Symbol.xml}" xsltfile="${fontfile.xsl}"
outfile="${build.src}/${replacestring}/render/pdf/fonts/Symbol.java" smart="yes"/>

<!-- custom fonts (Use t1fontfile.xsl instead of fontfile.xsl for Type 1 fonts!) step 2/2 -->
<!-- use this as a template
<xslt infile="${myfont.xml}" xsltfile="${t1fontfile.xsl}"
outfile="${build.src}/${replacestring}/render/pdf/fonts/myfont.java" smart="yes"/>
-->


</target>


+ 1
- 0
docs/xml-docs/fop.xml Parādīt failu

@@ -11,6 +11,7 @@
<document id="limitations" label="Limitations" source="fop/limitations.xml" />
<document id="bugs" label="Bugs" source="fop/bugs.xml" />
<document id="examples" label="Examples" source="fop/examples.xml" />
<document id="fonts" label="Fonts" source="fop/fonts.xml" />
<separator/>
<document id="compiling" label="Compiling" source="fop/compiling.xml" />
<document id="embedding" label="Embedding" source="fop/embedding.xml" />

+ 94
- 0
docs/xml-docs/fop/fonts.xml Parādīt failu

@@ -0,0 +1,94 @@
<?xml version="1.0" standalone="no"?>
<!-- Font Support -->
<!-- Author: jeremias.maerki@outline.ch -->
<s1 title="Font Support ">
<s2 title="Status">
<p>FOP (building PDF files) normally supports only the base 14 font package defined in the Adobe PDF specification.
That includes the following fonts: Helvetica, Times, Courier, Symbol and ZapfDingbats.
</p>
<p>Font support in FOP can be extended by the addition of font metric files (written in XML) created from Adobe
Type 1 fonts. No other font types (TrueType, Type 0, Type 3, etc.) are supported at this time. The current method
of adding fonts to FOP requires the package to be recompiled.
</p>
</s2>
<s2 title="Adding additional Type 1 fonts">
<p>As mentioned above you need an XML file containing font metrics to be able to use an additional font. FOP
contains a tool that can generate such a font metrics file from a PFM file.
</p>
<s3 title="Generating a font metrics file">
<p> Run the class org.apache.fop.fonts.apps.PFMReader to generate the XML file. Important: The tool does two
XSL transformations, one of which uses charlist.xml. At the moment in order for the tool to work correctly you
have to copy charlist.xml temporarily to the local directory from where you intend to start the tool.
(If anyone has an improvement on this...)
</p>
<p>
<code>java -cp fop.jar;xerces.jar;xalan.jar;w3c.jar</code>
</p>
<p>
<code>org.apache.fop.fonts.apps.PFMReader pfm-file xml-file</code>
</p>
<p>Put the resulting XML file into the src/codegen directory.
</p>
<p>Note: The tool will construct some values (FontBBox, StemV and ItalicAngle) based on assumptions and
calculations which are only an approximation to the real values. FontBBox and Italic Angle can be found in
the human-readable part of the PFB file. The PFMReader tool does not yet interpret PFB files, so if you want
to be correct, you may have to adjust the values in the XML file manually. The constructed values however
appear to have no visible influence.
</p>
</s3>
<s3 title="Register the fonts within FOP">
<p>Open the class org.apache.fop.render.pdf.FontSetup and add entries to the ones present according to
the following example:
</p>
<p>
<code>fontInfo.addMetrics("F14", new ZapfDingbats());</code>
</p>
<p>
<code>fontInfo.addMetrics("F15", new BauerBodoniRoman()); //This is the new entry.</code>
</p>
<p>
<code>...</code>
</p>
<p>
<code>fontInfo.addFontProperties("F14", "ZapfDingbats", "normal", "normal");</code>
</p>
<p>
<code>fontInfo.addFontProperties("F15", "BauerBodoni", "normal", "normal"); //This is the new entry.</code>
</p>
<p>Note: The class name to use is visible in the &lt;class-name&gt; element of the font metrics file.
</p>
</s3>
<s3 title="Adjusting build.xml">
<p>In the src/codegen directory you find the font metrics files for the base 14 fonts. The are being transformed
during build into Java classes and then compiled. The newly generated font metrics file must be included in this
process. To do that open build.xml and add entries according to the following example:
</p>
<p>
<code>&lt;property name="ZapfDingbats.xml" value="${build.codegen}/ZapfDingbats.xml"/&gt;</code>
</p>
<p>
<code>&lt;property name="BauerBodoni.xml" value="${build.codegen}/BauerBodoni.xml"/&gt;</code>
</p>
<p>
<code>...</code>
</p>
<p>
<code>&lt;xslt infile="${ZapfDingbats.xml}" xsltfile="${fontfile.xsl}"</code>
</p>
<p>
<code>outfile="${build.src}/${replacestring}/render/pdf/fonts/ZapfDingbats.java" smart="yes"/&gt;</code>
</p>
<p>
<code>&lt;xslt infile="${BauerBodoni.xml}" xsltfile="${t1fontfile.xsl}"</code>
</p>
<p>
<code>outfile="${build.src}/${replacestring}/render/pdf/fonts/BauerBodoniRoman.java" smart="yes"/&gt;</code>
</p>
<p>Rebuild FOP!
</p>
<p>Note: Be sure to use ${t1fontfile.xsl} instead of ${fontfile.xsl}. This is neccessary because of the additional metrics
information needed for non base 14 fonts.
</p>
</s3>
</s2>
</s1>

+ 1
- 0
docs/xml-docs/xml2xml.xsl Parādīt failu

@@ -9,6 +9,7 @@
<xsl:copy-of select="document('fop/running.xml')"/>
<xsl:copy-of select="document('fop/implemented.xml')"/>
<xsl:copy-of select="document('fop/limitations.xml')"/>
<xsl:copy-of select="document('fop/fonts.xml')"/>
<xsl:copy-of select="document('fop/bugs.xml')"/>
<xsl:copy-of select="document('fop/examples.xml')"/>
<xsl:copy-of select="document('fop/compiling.xml')"/>

+ 2
- 0
src/codegen/Courier-Bold.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>439</x-height>
<ascender>626</ascender>
<descender>-142</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="600"/>
<char name="AE" width="600"/>

+ 2
- 0
src/codegen/Courier-BoldOblique.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>439</x-height>
<ascender>626</ascender>
<descender>-142</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="600"/>
<char name="AE" width="600"/>

+ 2
- 0
src/codegen/Courier-Oblique.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>426</x-height>
<ascender>629</ascender>
<descender>-157</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="600"/>
<char name="AE" width="600"/>

+ 2
- 0
src/codegen/Courier.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>426</x-height>
<ascender>629</ascender>
<descender>-157</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="600"/>
<char name="AE" width="600"/>

+ 2
- 0
src/codegen/Helvetica-Bold.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>532</x-height>
<ascender>718</ascender>
<descender>-207</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="722"/>
<char name="AE" width="1000"/>

+ 2
- 0
src/codegen/Helvetica-BoldOblique.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>532</x-height>
<ascender>718</ascender>
<descender>-207</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="722"/>
<char name="AE" width="1000"/>

+ 2
- 0
src/codegen/Helvetica-Oblique.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>523</x-height>
<ascender>718</ascender>
<descender>-207</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="667"/>
<char name="AE" width="1000"/>

+ 2
- 0
src/codegen/Helvetica.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>523</x-height>
<ascender>718</ascender>
<descender>-207</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="667"/>
<char name="AE" width="1000"/>

+ 2
- 0
src/codegen/Symbol.xml Parādīt failu

@@ -6,6 +6,8 @@
<x-height>520</x-height>
<ascender>1010</ascender>
<descender>-293</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="space" width="250"/>
<char name="exclam" width="333"/>

+ 2
- 0
src/codegen/Times-Bold.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>461</x-height>
<ascender>676</ascender>
<descender>-205</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="722"/>
<char name="AE" width="1000"/>

+ 2
- 0
src/codegen/Times-BoldItalic.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>462</x-height>
<ascender>699</ascender>
<descender>-205</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="667"/>
<char name="AE" width="944"/>

+ 2
- 0
src/codegen/Times-Italic.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>441</x-height>
<ascender>683</ascender>
<descender>-205</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="611"/>
<char name="AE" width="889"/>

+ 2
- 0
src/codegen/Times-Roman.xml Parādīt failu

@@ -7,6 +7,8 @@
<x-height>450</x-height>
<ascender>683</ascender>
<descender>-217</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="A" width="722"/>
<char name="AE" width="889"/>

+ 2
- 0
src/codegen/ZapfDingbats.xml Parādīt failu

@@ -6,6 +6,8 @@
<x-height>426</x-height>
<ascender>820</ascender>
<descender>-143</descender>
<first-char>32</first-char>
<last-char>255</last-char>
<widths>
<char name="space" width="278"/>
<char name="a1" width="974"/>

+ 190
- 196
src/codegen/charlist.xml Parādīt failu

@@ -18,9 +18,10 @@
<map adobe-name="Edieresis" win-ansi="0x00CB" unicode="0x00CB"/>
<map adobe-name="Egrave" win-ansi="0x00C8" unicode="0x00C8"/>
<map adobe-name="Eth" win-ansi="0x00D0" unicode="0x00D0"/>
<map adobe-name="Euro" win-ansi="0x0080" unicode="0x20AC"/>
<map adobe-name="F" win-ansi="0x0046" unicode="0x0046"/>
<map adobe-name="G" win-ansi="0x0047" unicode="0x0047"/>
<map adobe-name="Gcaron" win-ansi="-1" unicode="0x01E6"/>
<map adobe-name="Gcaron" win-ansi="-1" unicode="0x01E6"/>
<map adobe-name="H" win-ansi="0x0048" unicode="0x0048"/>
<map adobe-name="I" win-ansi="0x0049" unicode="0x0049"/>
<map adobe-name="Iacute" win-ansi="0x00CD" unicode="0x00CD"/>
@@ -74,11 +75,11 @@
<map adobe-name="agrave" win-ansi="0x00E0" unicode="0x00E0"/>
<map adobe-name="ampersand" win-ansi="0x0026" unicode="0x0026"/>
<map adobe-name="aring" win-ansi="0x00E5" unicode="0x00E5"/>
<!-- fj <map adobe-name="arrowboth" win-ansi="-1" unicode="0x2195"/>-->
<!-- fj <map adobe-name="arrowdown" win-ansi="-1" unicode="0x2193"/>-->
<!-- fj <map adobe-name="arrowleft" win-ansi="-1" unicode="0x2194"/>-->
<!-- fj <map adobe-name="arrowright" win-ansi="-1" unicode="0x2192"/>-->
<!-- fj <map adobe-name="arrowup" win-ansi="-1" unicode="0x2191"/>-->
<!-- fj <map adobe-name="arrowboth" win-ansi="-1" unicode="0x2195"/>-->
<!-- fj <map adobe-name="arrowdown" win-ansi="-1" unicode="0x2193"/>-->
<!-- fj <map adobe-name="arrowleft" win-ansi="-1" unicode="0x2194"/>-->
<!-- fj <map adobe-name="arrowright" win-ansi="-1" unicode="0x2192"/>-->
<!-- fj <map adobe-name="arrowup" win-ansi="-1" unicode="0x2191"/>-->
<map adobe-name="asciicircum" win-ansi="0x005E" unicode="0x005E"/>
<map adobe-name="asciitilde" win-ansi="0x007E" unicode="0x007E"/>
<map adobe-name="asterisk" win-ansi="0x002A" unicode="0x002A"/>
@@ -132,7 +133,7 @@
<map adobe-name="fl" win-ansi="-1" unicode="-1"/>
<map adobe-name="florin" win-ansi="0x0083" unicode="0x0083"/>
<map adobe-name="four" win-ansi="0x0034" unicode="0x0034"/>
<!-- fj <map adobe-name="fraction" win-ansi="-1" unicode="0x2044"/> -->
<!-- fj <map adobe-name="fraction" win-ansi="-1" unicode="0x2044"/> -->
<map adobe-name="g" win-ansi="0x0067" unicode="0x0067"/>
<map adobe-name="gcaron" win-ansi="-1" unicode="0x01E7"/>
<map adobe-name="germandbls" win-ansi="0x00DF" unicode="0x00DF"/>
@@ -155,16 +156,16 @@
<map adobe-name="k" win-ansi="0x006B" unicode="0x006B"/>
<map adobe-name="l" win-ansi="0x006C" unicode="0x006C"/>
<map adobe-name="less" win-ansi="0x003C" unicode="0x003C"/>
<map adobe-name="lira" win-ansi="-1" unicode="0x20A4"/>
<map adobe-name="lira" win-ansi="-1" unicode="0x20A4"/>
<map adobe-name="logicalnot" win-ansi="0x00AC" unicode="0x00AC"/>
<map adobe-name="lslash" win-ansi="-1" unicode="0x0142"/>
<map adobe-name="m" win-ansi="0x006D" unicode="0x006D"/>
<map adobe-name="macron" win-ansi="0x00AF" unicode="0x00AF"/>
<!-- fj <map adobe-name="minus" win-ansi="-1" unicode="0x2212"/>-->
<!-- fj <map adobe-name="minus" win-ansi="-1" unicode="0x2212"/>-->
<map adobe-name="mu" win-ansi="0x00B5" unicode="0x00B5"/>
<map adobe-name="multiply" win-ansi="0x00D7" unicode="0x00D7"/>
<map adobe-name="n" win-ansi="0x006E" unicode="0x006E"/>
<!-- JKT: the following is not actually an adobe named character -->
<!-- JKT: the following is not actually an adobe named character -->
<map adobe-name="nbsp" win-ansi="0x00A0" unicode="0x00A0"/>
<map adobe-name="nine" win-ansi="0x0039" unicode="0x0039"/>
<map adobe-name="ntilde" win-ansi="0x00F1" unicode="0x00F1"/>
@@ -243,10 +244,7 @@
<map adobe-name="z" win-ansi="0x007A" unicode="0x007A"/>
<map adobe-name="zcaron" win-ansi="-1" unicode="0x017E"/>
<map adobe-name="zero" win-ansi="0x0030" unicode="0x0030"/>


<!-- the following mappings are used for the font zapfdingbats -->

<map adobe-name="a1" win-ansi="0x0021" unicode="0x2701" unicodeName="UPPER BLADE SCISSORS"/>
<map adobe-name="a2" win-ansi="0x0022" unicode="0x2702" unicodeName="BLACK SCISSORS"/>
<map adobe-name="a202" win-ansi="0x0023" unicode="0x2703" unicodeName="LOWER BLADE SCISSORS"/>
@@ -448,191 +446,187 @@
<map adobe-name="a189" win-ansi="0x00FC" unicode="0x27BC" unicodeName="WEDGE-TAILED RIGHTWARDS ARROW"/>
<map adobe-name="a190" win-ansi="0x00FD" unicode="0x27BD" unicodeName="HEAVY WEDGE-TAILED RIGHTWARDS ARROW"/>
<map adobe-name="a191" win-ansi="0x00FE" unicode="0x27BE" unicodeName="OPEN-OUTLINED RIGHTWARDS ARROW"/>

<!-- the following mappings are used for the Symbol font
TBD: remove doublettes -->
<map adobe-name="universal" win-ansi="0x22" unicode="0x2200"/>
<map adobe-name="numbersign" win-ansi="0x23" unicode="0x0023"/>
<map adobe-name="existential" win-ansi="0x24" unicode="0x2203"/>
<map adobe-name="percent" win-ansi="0x25" unicode="0x0025"/>
<map adobe-name="ampersand" win-ansi="0x26" unicode="0x0026"/>
<map adobe-name="suchthat" win-ansi="0x27" unicode="0x220B"/>
<map adobe-name="parenleft" win-ansi="0x28" unicode="0x0028"/>
<map adobe-name="parenright" win-ansi="0x29" unicode="0x0029"/>
<map adobe-name="asteriskmath" win-ansi="0x2A" unicode="0x2217"/>
<map adobe-name="plus" win-ansi="0x2B" unicode="0x002B"/>
<map adobe-name="comma" win-ansi="0x2C" unicode="0x002C"/>
<map adobe-name="minus" win-ansi="0x2D" unicode="0x2212"/>
<map adobe-name="period" win-ansi="0x2E" unicode="0x002E"/>
<map adobe-name="slash" win-ansi="0x2F" unicode="0x002F"/>
<map adobe-name="colon" win-ansi="0x3A" unicode="0x003A"/>
<map adobe-name="semicolon" win-ansi="0x3B" unicode="0x003B"/>
<map adobe-name="less" win-ansi="0x3C" unicode="0x003C"/>
<map adobe-name="equal" win-ansi="0x3D" unicode="0x003D"/>
<map adobe-name="greater" win-ansi="0x3E" unicode="0x003E"/>
<map adobe-name="question" win-ansi="0x3F" unicode="0x003F"/>
<map adobe-name="congruent" win-ansi="0x40" unicode="0x2245"/>
<map adobe-name="Alpha" win-ansi="0x41" unicode="0x0391"/>
<map adobe-name="Beta" win-ansi="0x42" unicode="0x0392"/>
<map adobe-name="Chi" win-ansi="0x43" unicode="0x03A7"/>
<map adobe-name="Delta" win-ansi="0x44" unicode="0x2206"/>
<map adobe-name="Epsilon" win-ansi="0x45" unicode="0x0395"/>
<map adobe-name="Phi" win-ansi="0x46" unicode="0x03A6"/>
<map adobe-name="Gamma" win-ansi="0x47" unicode="0x0393"/>
<map adobe-name="Eta" win-ansi="0x48" unicode="0x0397"/>
<map adobe-name="Iota" win-ansi="0x49" unicode="0x0399"/>
<map adobe-name="theta1" win-ansi="0x4A" unicode="0x03D1"/>
<map adobe-name="Kappa" win-ansi="0x4B" unicode="0x039A"/>
<map adobe-name="Lambda" win-ansi="0x4C" unicode="0x039B"/>
<map adobe-name="Mu" win-ansi="0x4D" unicode="0x039C"/>
<map adobe-name="Nu" win-ansi="0x4E" unicode="0x039D"/>
<map adobe-name="Omicron" win-ansi="0x4F" unicode="0x039F"/>
<map adobe-name="Pi" win-ansi="0x50" unicode="0x03A0"/>
<map adobe-name="Theta" win-ansi="0x51" unicode="0x0398"/>
<map adobe-name="Rho" win-ansi="0x52" unicode="0x03A1"/>
<map adobe-name="Sigma" win-ansi="0x53" unicode="0x03A3"/>
<map adobe-name="Tau" win-ansi="0x54" unicode="0x03A4"/>
<map adobe-name="Upsilon" win-ansi="0x55" unicode="0x03A5"/>
<map adobe-name="sigma1" win-ansi="0x56" unicode="0x03C2"/>
<map adobe-name="Omega" win-ansi="0x57" unicode="0x2126"/>
<map adobe-name="Xi" win-ansi="0x58" unicode="0x039E"/>
<map adobe-name="Psi" win-ansi="0x59" unicode="0x03A8"/>
<map adobe-name="Zeta" win-ansi="0x5A" unicode="0x0396"/>
<map adobe-name="bracketleft" win-ansi="0x5B" unicode="0x005B"/>
<map adobe-name="therefore" win-ansi="0x5C" unicode="0x2234"/>
<map adobe-name="bracketright" win-ansi="0x5D" unicode="0x005D"/>
<map adobe-name="perpendicular" win-ansi="0x5E" unicode="0x22A5"/>
<map adobe-name="underscore" win-ansi="0x5F" unicode="0x005F"/>
<map adobe-name="radicalex" win-ansi="0x60" unicode="0xF8E5"/>
<map adobe-name="alpha" win-ansi="0x61" unicode="0x03B1"/>
<map adobe-name="beta" win-ansi="0x62" unicode="0x03B2"/>
<map adobe-name="chi" win-ansi="0x63" unicode="0x03C7"/>
<map adobe-name="delta" win-ansi="0x64" unicode="0x03B4"/>
<map adobe-name="epsilon" win-ansi="0x65" unicode="0x03B5"/>
<map adobe-name="phi" win-ansi="0x66" unicode="0x03C6"/>
<map adobe-name="gamma" win-ansi="0x67" unicode="0x03B3"/>
<map adobe-name="eta" win-ansi="0x68" unicode="0x03B7"/>
<map adobe-name="iota" win-ansi="0x69" unicode="0x03B9"/>
<map adobe-name="phi1" win-ansi="0x6A" unicode="0x03D5"/>
<map adobe-name="kappa" win-ansi="0x6B" unicode="0x03BA"/>
<map adobe-name="lambda" win-ansi="0x6C" unicode="0x03BB"/>
<map adobe-name="mu" win-ansi="0x6D" unicode="0x00B5"/>
<map adobe-name="nu" win-ansi="0x6E" unicode="0x03BD"/>
<map adobe-name="omicron" win-ansi="0x6F" unicode="0x03BF"/>
<map adobe-name="pi" win-ansi="0x70" unicode="0x03C0"/>
<map adobe-name="theta" win-ansi="0x71" unicode="0x03B8"/>
<map adobe-name="rho" win-ansi="0x72" unicode="0x03C1"/>
<map adobe-name="sigma" win-ansi="0x73" unicode="0x03C3"/>
<map adobe-name="tau" win-ansi="0x74" unicode="0x03C4"/>
<map adobe-name="upsilon" win-ansi="0x75" unicode="0x03C5"/>
<map adobe-name="omega1" win-ansi="0x76" unicode="0x03D6"/>
<map adobe-name="omega" win-ansi="0x77" unicode="0x03C9"/>
<map adobe-name="xi" win-ansi="0x78" unicode="0x03BE"/>
<map adobe-name="psi" win-ansi="0x79" unicode="0x03C8"/>
<map adobe-name="zeta" win-ansi="0x7A" unicode="0x03B6"/>
<map adobe-name="braceleft" win-ansi="0x7B" unicode="0x007B"/>
<map adobe-name="bar" win-ansi="0x7C" unicode="0x007C"/>
<map adobe-name="braceright" win-ansi="0x7D" unicode="0x007D"/>
<map adobe-name="similar" win-ansi="0x7E" unicode="0x223C"/>
<map adobe-name="Upsilon1" win-ansi="0xA1" unicode="0x03D2"/>
<map adobe-name="minute" win-ansi="0xA2" unicode="0x2032"/>
<map adobe-name="lessequal" win-ansi="0xA3" unicode="0x2264"/>
<map adobe-name="fraction" win-ansi="0xA4" unicode="0x2044"/>
<map adobe-name="infinity" win-ansi="0xA5" unicode="0x221E"/>
<map adobe-name="florin" win-ansi="0xA6" unicode="0x0192"/>
<map adobe-name="club" win-ansi="0xA7" unicode="0x2663"/>
<map adobe-name="diamond" win-ansi="0xA8" unicode="0x2666"/>
<map adobe-name="heart" win-ansi="0xA9" unicode="0x2665"/>
<map adobe-name="spade" win-ansi="0xAA" unicode="0x2660"/>
<map adobe-name="arrowboth" win-ansi="0xAB" unicode="0x2194"/>
<map adobe-name="arrowleft" win-ansi="0xAC" unicode="0x2190"/>
<map adobe-name="arrowup" win-ansi="0xAD" unicode="0x2191"/>
<map adobe-name="arrowright" win-ansi="0xAE" unicode="0x2192"/>
<map adobe-name="arrowdown" win-ansi="0xAF" unicode="0x2193"/>
<map adobe-name="degree" win-ansi="0xB0" unicode="0x00B0"/>
<map adobe-name="plusminus" win-ansi="0xB1" unicode="0x00B1"/>
<map adobe-name="second" win-ansi="0xB2" unicode="0x2033"/>
<map adobe-name="greaterequal" win-ansi="0xB3" unicode="0x2265"/>
<map adobe-name="multiply" win-ansi="0xB4" unicode="0x00D7"/>
<map adobe-name="proportional" win-ansi="0xB5" unicode="0x221D"/>
<map adobe-name="partialdiff" win-ansi="0xB6" unicode="0x2202"/>
<map adobe-name="bullet" win-ansi="0xB7" unicode="0x2022"/>
<map adobe-name="divide" win-ansi="0xB8" unicode="0x00F7"/>
<map adobe-name="notequal" win-ansi="0xB9" unicode="0x2260"/>
<map adobe-name="equivalence" win-ansi="0xBA" unicode="0x2261"/>
<map adobe-name="approxequal" win-ansi="0xBB" unicode="0x2248"/>
<map adobe-name="ellipsis" win-ansi="0xBC" unicode="0x2026"/>
<map adobe-name="arrowvertex" win-ansi="0xBD" unicode="0xF8E6"/>
<map adobe-name="arrowhorizex" win-ansi="0xBE" unicode="0xF8E7"/>
<map adobe-name="carriagereturn" win-ansi="0xBF" unicode="0x21B5"/>
<map adobe-name="aleph" win-ansi="0xC0" unicode="0x2135"/>
<map adobe-name="Ifraktur" win-ansi="0xC1" unicode="0x2111"/>
<map adobe-name="Rfraktur" win-ansi="0xC2" unicode="0x211C"/>
<map adobe-name="weierstrass" win-ansi="0xC3" unicode="0x2118"/>
<map adobe-name="circlemultiply" win-ansi="0xC4" unicode="0x2297"/>
<map adobe-name="circleplus" win-ansi="0xC5" unicode="0x2295"/>
<map adobe-name="emptyset" win-ansi="0xC6" unicode="0x2205"/>
<map adobe-name="intersection" win-ansi="0xC7" unicode="0x2229"/>
<map adobe-name="union" win-ansi="0xC8" unicode="0x222A"/>
<map adobe-name="propersuperset" win-ansi="0xC9" unicode="0x2283"/>
<map adobe-name="reflexsuperset" win-ansi="0xCA" unicode="0x2287"/>
<map adobe-name="notsubset" win-ansi="0xCB" unicode="0x2284"/>
<map adobe-name="propersubset" win-ansi="0xCC" unicode="0x2282"/>
<map adobe-name="reflexsubset" win-ansi="0xCD" unicode="0x2286"/>
<map adobe-name="element" win-ansi="0xCE" unicode="0x2208"/>
<map adobe-name="notelement" win-ansi="0xCF" unicode="0x2209"/>
<map adobe-name="angle" win-ansi="0xD0" unicode="0x2220"/>
<map adobe-name="gradient" win-ansi="0xD1" unicode="0x2207"/>
<map adobe-name="registerserif" win-ansi="0xD2" unicode="0xF6DA"/>
<map adobe-name="copyrightserif" win-ansi="0xD3" unicode="0xF6D9"/>
<map adobe-name="trademarkserif" win-ansi="0xD4" unicode="0xF6DB"/>
<map adobe-name="product" win-ansi="0xD5" unicode="0x220F"/>
<map adobe-name="radical" win-ansi="0xD6" unicode="0x221A"/>
<map adobe-name="dotmath" win-ansi="0xD7" unicode="0x22C5"/>
<map adobe-name="logicalnot" win-ansi="0xD8" unicode="0x00AC"/>
<map adobe-name="logicaland" win-ansi="0xD9" unicode="0x2227"/>
<map adobe-name="logicalor" win-ansi="0xDA" unicode="0x2228"/>
<map adobe-name="arrowdblboth" win-ansi="0xDB" unicode="0x21D4"/>
<map adobe-name="arrowdblleft" win-ansi="0xDC" unicode="0x21D0"/>
<map adobe-name="arrowdblup" win-ansi="0xDD" unicode="0x21D1"/>
<map adobe-name="arrowdblright" win-ansi="0xDE" unicode="0x21D2"/>
<map adobe-name="arrowdbldown" win-ansi="0xDF" unicode="0x21D3"/>
<map adobe-name="lozenge" win-ansi="0xE0" unicode="0x25CA"/>
<map adobe-name="angleleft" win-ansi="0xE1" unicode="0x2329"/>
<map adobe-name="registersans" win-ansi="0xE2" unicode="0xF8E8"/>
<map adobe-name="copyrightsans" win-ansi="0xE3" unicode="0xF8E9"/>
<map adobe-name="trademarksans" win-ansi="0xE4" unicode="0xF8EA"/>
<map adobe-name="summation" win-ansi="0xE5" unicode="0x2211"/>
<map adobe-name="parenlefttp" win-ansi="0xE6" unicode="0xF8EB"/>
<map adobe-name="parenleftex" win-ansi="0xE7" unicode="0xF8EC"/>
<map adobe-name="parenleftbt" win-ansi="0xE8" unicode="0xF8ED"/>
<map adobe-name="bracketlefttp" win-ansi="0xE9" unicode="0xF8EE"/>
<map adobe-name="bracketleftex" win-ansi="0xEA" unicode="0xF8EF"/>
<map adobe-name="bracketleftbt" win-ansi="0xEB" unicode="0xF8F0"/>
<map adobe-name="bracelefttp" win-ansi="0xEC" unicode="0xF8F1"/>
<map adobe-name="braceleftmid" win-ansi="0xED" unicode="0xF8F2"/>
<map adobe-name="braceleftbt" win-ansi="0xEE" unicode="0xF8F3"/>
<map adobe-name="braceex" win-ansi="0xEF" unicode="0xF8F4"/>
<map adobe-name="angleright" win-ansi="0xF1" unicode="0x232A"/>
<map adobe-name="integral" win-ansi="0xF2" unicode="0x222B"/>
<map adobe-name="integraltp" win-ansi="0xF3" unicode="0x2320"/>
<map adobe-name="integralex" win-ansi="0xF4" unicode="0xF8F5"/>
<map adobe-name="integralbt" win-ansi="0xF5" unicode="0x2321"/>
<map adobe-name="parenrighttp" win-ansi="0xF6" unicode="0xF8F6"/>
<map adobe-name="parenrightex" win-ansi="0xF7" unicode="0xF8F7"/>
<map adobe-name="parenrightbt" win-ansi="0xF8" unicode="0xF8F8"/>
<map adobe-name="bracketrighttp" win-ansi="0xF9" unicode="0xF8F9"/>
<map adobe-name="bracketrightex" win-ansi="0xFA" unicode="0xF8FA"/>
<map adobe-name="bracketrightbt" win-ansi="0xFB" unicode="0xF8FB"/>
<map adobe-name="bracerighttp" win-ansi="0xFC" unicode="0xF8FC"/>
<map adobe-name="bracerightmid" win-ansi="0xFD" unicode="0xF8FD"/>
<map adobe-name="bracerightbt" win-ansi="0xFE" unicode="0xF8FE"/>
<map adobe-name="apple" win-ansi="-1" unicode="0xF8FE"/>

TBD: remove doublettes -->
<map adobe-name="universal" win-ansi="0x22" unicode="0x2200"/>
<map adobe-name="numbersign" win-ansi="0x23" unicode="0x0023"/>
<map adobe-name="existential" win-ansi="0x24" unicode="0x2203"/>
<map adobe-name="percent" win-ansi="0x25" unicode="0x0025"/>
<map adobe-name="ampersand" win-ansi="0x26" unicode="0x0026"/>
<map adobe-name="suchthat" win-ansi="0x27" unicode="0x220B"/>
<map adobe-name="parenleft" win-ansi="0x28" unicode="0x0028"/>
<map adobe-name="parenright" win-ansi="0x29" unicode="0x0029"/>
<map adobe-name="asteriskmath" win-ansi="0x2A" unicode="0x2217"/>
<map adobe-name="plus" win-ansi="0x2B" unicode="0x002B"/>
<map adobe-name="comma" win-ansi="0x2C" unicode="0x002C"/>
<map adobe-name="minus" win-ansi="0x2D" unicode="0x2212"/>
<map adobe-name="period" win-ansi="0x2E" unicode="0x002E"/>
<map adobe-name="slash" win-ansi="0x2F" unicode="0x002F"/>
<map adobe-name="colon" win-ansi="0x3A" unicode="0x003A"/>
<map adobe-name="semicolon" win-ansi="0x3B" unicode="0x003B"/>
<map adobe-name="less" win-ansi="0x3C" unicode="0x003C"/>
<map adobe-name="equal" win-ansi="0x3D" unicode="0x003D"/>
<map adobe-name="greater" win-ansi="0x3E" unicode="0x003E"/>
<map adobe-name="question" win-ansi="0x3F" unicode="0x003F"/>
<map adobe-name="congruent" win-ansi="0x40" unicode="0x2245"/>
<map adobe-name="Alpha" win-ansi="0x41" unicode="0x0391"/>
<map adobe-name="Beta" win-ansi="0x42" unicode="0x0392"/>
<map adobe-name="Chi" win-ansi="0x43" unicode="0x03A7"/>
<map adobe-name="Delta" win-ansi="0x44" unicode="0x2206"/>
<map adobe-name="Epsilon" win-ansi="0x45" unicode="0x0395"/>
<map adobe-name="Phi" win-ansi="0x46" unicode="0x03A6"/>
<map adobe-name="Gamma" win-ansi="0x47" unicode="0x0393"/>
<map adobe-name="Eta" win-ansi="0x48" unicode="0x0397"/>
<map adobe-name="Iota" win-ansi="0x49" unicode="0x0399"/>
<map adobe-name="theta1" win-ansi="0x4A" unicode="0x03D1"/>
<map adobe-name="Kappa" win-ansi="0x4B" unicode="0x039A"/>
<map adobe-name="Lambda" win-ansi="0x4C" unicode="0x039B"/>
<map adobe-name="Mu" win-ansi="0x4D" unicode="0x039C"/>
<map adobe-name="Nu" win-ansi="0x4E" unicode="0x039D"/>
<map adobe-name="Omicron" win-ansi="0x4F" unicode="0x039F"/>
<map adobe-name="Pi" win-ansi="0x50" unicode="0x03A0"/>
<map adobe-name="Theta" win-ansi="0x51" unicode="0x0398"/>
<map adobe-name="Rho" win-ansi="0x52" unicode="0x03A1"/>
<map adobe-name="Sigma" win-ansi="0x53" unicode="0x03A3"/>
<map adobe-name="Tau" win-ansi="0x54" unicode="0x03A4"/>
<map adobe-name="Upsilon" win-ansi="0x55" unicode="0x03A5"/>
<map adobe-name="sigma1" win-ansi="0x56" unicode="0x03C2"/>
<map adobe-name="Omega" win-ansi="0x57" unicode="0x2126"/>
<map adobe-name="Xi" win-ansi="0x58" unicode="0x039E"/>
<map adobe-name="Psi" win-ansi="0x59" unicode="0x03A8"/>
<map adobe-name="Zeta" win-ansi="0x5A" unicode="0x0396"/>
<map adobe-name="bracketleft" win-ansi="0x5B" unicode="0x005B"/>
<map adobe-name="therefore" win-ansi="0x5C" unicode="0x2234"/>
<map adobe-name="bracketright" win-ansi="0x5D" unicode="0x005D"/>
<map adobe-name="perpendicular" win-ansi="0x5E" unicode="0x22A5"/>
<map adobe-name="underscore" win-ansi="0x5F" unicode="0x005F"/>
<map adobe-name="radicalex" win-ansi="0x60" unicode="0xF8E5"/>
<map adobe-name="alpha" win-ansi="0x61" unicode="0x03B1"/>
<map adobe-name="beta" win-ansi="0x62" unicode="0x03B2"/>
<map adobe-name="chi" win-ansi="0x63" unicode="0x03C7"/>
<map adobe-name="delta" win-ansi="0x64" unicode="0x03B4"/>
<map adobe-name="epsilon" win-ansi="0x65" unicode="0x03B5"/>
<map adobe-name="phi" win-ansi="0x66" unicode="0x03C6"/>
<map adobe-name="gamma" win-ansi="0x67" unicode="0x03B3"/>
<map adobe-name="eta" win-ansi="0x68" unicode="0x03B7"/>
<map adobe-name="iota" win-ansi="0x69" unicode="0x03B9"/>
<map adobe-name="phi1" win-ansi="0x6A" unicode="0x03D5"/>
<map adobe-name="kappa" win-ansi="0x6B" unicode="0x03BA"/>
<map adobe-name="lambda" win-ansi="0x6C" unicode="0x03BB"/>
<map adobe-name="mu" win-ansi="0x6D" unicode="0x00B5"/>
<map adobe-name="nu" win-ansi="0x6E" unicode="0x03BD"/>
<map adobe-name="omicron" win-ansi="0x6F" unicode="0x03BF"/>
<map adobe-name="pi" win-ansi="0x70" unicode="0x03C0"/>
<map adobe-name="theta" win-ansi="0x71" unicode="0x03B8"/>
<map adobe-name="rho" win-ansi="0x72" unicode="0x03C1"/>
<map adobe-name="sigma" win-ansi="0x73" unicode="0x03C3"/>
<map adobe-name="tau" win-ansi="0x74" unicode="0x03C4"/>
<map adobe-name="upsilon" win-ansi="0x75" unicode="0x03C5"/>
<map adobe-name="omega1" win-ansi="0x76" unicode="0x03D6"/>
<map adobe-name="omega" win-ansi="0x77" unicode="0x03C9"/>
<map adobe-name="xi" win-ansi="0x78" unicode="0x03BE"/>
<map adobe-name="psi" win-ansi="0x79" unicode="0x03C8"/>
<map adobe-name="zeta" win-ansi="0x7A" unicode="0x03B6"/>
<map adobe-name="braceleft" win-ansi="0x7B" unicode="0x007B"/>
<map adobe-name="bar" win-ansi="0x7C" unicode="0x007C"/>
<map adobe-name="braceright" win-ansi="0x7D" unicode="0x007D"/>
<map adobe-name="similar" win-ansi="0x7E" unicode="0x223C"/>
<map adobe-name="Upsilon1" win-ansi="0xA1" unicode="0x03D2"/>
<map adobe-name="minute" win-ansi="0xA2" unicode="0x2032"/>
<map adobe-name="lessequal" win-ansi="0xA3" unicode="0x2264"/>
<map adobe-name="fraction" win-ansi="0xA4" unicode="0x2044"/>
<map adobe-name="infinity" win-ansi="0xA5" unicode="0x221E"/>
<map adobe-name="florin" win-ansi="0xA6" unicode="0x0192"/>
<map adobe-name="club" win-ansi="0xA7" unicode="0x2663"/>
<map adobe-name="diamond" win-ansi="0xA8" unicode="0x2666"/>
<map adobe-name="heart" win-ansi="0xA9" unicode="0x2665"/>
<map adobe-name="spade" win-ansi="0xAA" unicode="0x2660"/>
<map adobe-name="arrowboth" win-ansi="0xAB" unicode="0x2194"/>
<map adobe-name="arrowleft" win-ansi="0xAC" unicode="0x2190"/>
<map adobe-name="arrowup" win-ansi="0xAD" unicode="0x2191"/>
<map adobe-name="arrowright" win-ansi="0xAE" unicode="0x2192"/>
<map adobe-name="arrowdown" win-ansi="0xAF" unicode="0x2193"/>
<map adobe-name="degree" win-ansi="0xB0" unicode="0x00B0"/>
<map adobe-name="plusminus" win-ansi="0xB1" unicode="0x00B1"/>
<map adobe-name="second" win-ansi="0xB2" unicode="0x2033"/>
<map adobe-name="greaterequal" win-ansi="0xB3" unicode="0x2265"/>
<map adobe-name="multiply" win-ansi="0xB4" unicode="0x00D7"/>
<map adobe-name="proportional" win-ansi="0xB5" unicode="0x221D"/>
<map adobe-name="partialdiff" win-ansi="0xB6" unicode="0x2202"/>
<map adobe-name="bullet" win-ansi="0xB7" unicode="0x2022"/>
<map adobe-name="divide" win-ansi="0xB8" unicode="0x00F7"/>
<map adobe-name="notequal" win-ansi="0xB9" unicode="0x2260"/>
<map adobe-name="equivalence" win-ansi="0xBA" unicode="0x2261"/>
<map adobe-name="approxequal" win-ansi="0xBB" unicode="0x2248"/>
<map adobe-name="ellipsis" win-ansi="0xBC" unicode="0x2026"/>
<map adobe-name="arrowvertex" win-ansi="0xBD" unicode="0xF8E6"/>
<map adobe-name="arrowhorizex" win-ansi="0xBE" unicode="0xF8E7"/>
<map adobe-name="carriagereturn" win-ansi="0xBF" unicode="0x21B5"/>
<map adobe-name="aleph" win-ansi="0xC0" unicode="0x2135"/>
<map adobe-name="Ifraktur" win-ansi="0xC1" unicode="0x2111"/>
<map adobe-name="Rfraktur" win-ansi="0xC2" unicode="0x211C"/>
<map adobe-name="weierstrass" win-ansi="0xC3" unicode="0x2118"/>
<map adobe-name="circlemultiply" win-ansi="0xC4" unicode="0x2297"/>
<map adobe-name="circleplus" win-ansi="0xC5" unicode="0x2295"/>
<map adobe-name="emptyset" win-ansi="0xC6" unicode="0x2205"/>
<map adobe-name="intersection" win-ansi="0xC7" unicode="0x2229"/>
<map adobe-name="union" win-ansi="0xC8" unicode="0x222A"/>
<map adobe-name="propersuperset" win-ansi="0xC9" unicode="0x2283"/>
<map adobe-name="reflexsuperset" win-ansi="0xCA" unicode="0x2287"/>
<map adobe-name="notsubset" win-ansi="0xCB" unicode="0x2284"/>
<map adobe-name="propersubset" win-ansi="0xCC" unicode="0x2282"/>
<map adobe-name="reflexsubset" win-ansi="0xCD" unicode="0x2286"/>
<map adobe-name="element" win-ansi="0xCE" unicode="0x2208"/>
<map adobe-name="notelement" win-ansi="0xCF" unicode="0x2209"/>
<map adobe-name="angle" win-ansi="0xD0" unicode="0x2220"/>
<map adobe-name="gradient" win-ansi="0xD1" unicode="0x2207"/>
<map adobe-name="registerserif" win-ansi="0xD2" unicode="0xF6DA"/>
<map adobe-name="copyrightserif" win-ansi="0xD3" unicode="0xF6D9"/>
<map adobe-name="trademarkserif" win-ansi="0xD4" unicode="0xF6DB"/>
<map adobe-name="product" win-ansi="0xD5" unicode="0x220F"/>
<map adobe-name="radical" win-ansi="0xD6" unicode="0x221A"/>
<map adobe-name="dotmath" win-ansi="0xD7" unicode="0x22C5"/>
<map adobe-name="logicalnot" win-ansi="0xD8" unicode="0x00AC"/>
<map adobe-name="logicaland" win-ansi="0xD9" unicode="0x2227"/>
<map adobe-name="logicalor" win-ansi="0xDA" unicode="0x2228"/>
<map adobe-name="arrowdblboth" win-ansi="0xDB" unicode="0x21D4"/>
<map adobe-name="arrowdblleft" win-ansi="0xDC" unicode="0x21D0"/>
<map adobe-name="arrowdblup" win-ansi="0xDD" unicode="0x21D1"/>
<map adobe-name="arrowdblright" win-ansi="0xDE" unicode="0x21D2"/>
<map adobe-name="arrowdbldown" win-ansi="0xDF" unicode="0x21D3"/>
<map adobe-name="lozenge" win-ansi="0xE0" unicode="0x25CA"/>
<map adobe-name="angleleft" win-ansi="0xE1" unicode="0x2329"/>
<map adobe-name="registersans" win-ansi="0xE2" unicode="0xF8E8"/>
<map adobe-name="copyrightsans" win-ansi="0xE3" unicode="0xF8E9"/>
<map adobe-name="trademarksans" win-ansi="0xE4" unicode="0xF8EA"/>
<map adobe-name="summation" win-ansi="0xE5" unicode="0x2211"/>
<map adobe-name="parenlefttp" win-ansi="0xE6" unicode="0xF8EB"/>
<map adobe-name="parenleftex" win-ansi="0xE7" unicode="0xF8EC"/>
<map adobe-name="parenleftbt" win-ansi="0xE8" unicode="0xF8ED"/>
<map adobe-name="bracketlefttp" win-ansi="0xE9" unicode="0xF8EE"/>
<map adobe-name="bracketleftex" win-ansi="0xEA" unicode="0xF8EF"/>
<map adobe-name="bracketleftbt" win-ansi="0xEB" unicode="0xF8F0"/>
<map adobe-name="bracelefttp" win-ansi="0xEC" unicode="0xF8F1"/>
<map adobe-name="braceleftmid" win-ansi="0xED" unicode="0xF8F2"/>
<map adobe-name="braceleftbt" win-ansi="0xEE" unicode="0xF8F3"/>
<map adobe-name="braceex" win-ansi="0xEF" unicode="0xF8F4"/>
<map adobe-name="angleright" win-ansi="0xF1" unicode="0x232A"/>
<map adobe-name="integral" win-ansi="0xF2" unicode="0x222B"/>
<map adobe-name="integraltp" win-ansi="0xF3" unicode="0x2320"/>
<map adobe-name="integralex" win-ansi="0xF4" unicode="0xF8F5"/>
<map adobe-name="integralbt" win-ansi="0xF5" unicode="0x2321"/>
<map adobe-name="parenrighttp" win-ansi="0xF6" unicode="0xF8F6"/>
<map adobe-name="parenrightex" win-ansi="0xF7" unicode="0xF8F7"/>
<map adobe-name="parenrightbt" win-ansi="0xF8" unicode="0xF8F8"/>
<map adobe-name="bracketrighttp" win-ansi="0xF9" unicode="0xF8F9"/>
<map adobe-name="bracketrightex" win-ansi="0xFA" unicode="0xF8FA"/>
<map adobe-name="bracketrightbt" win-ansi="0xFB" unicode="0xF8FB"/>
<map adobe-name="bracerighttp" win-ansi="0xFC" unicode="0xF8FC"/>
<map adobe-name="bracerightmid" win-ansi="0xFD" unicode="0xF8FD"/>
<map adobe-name="bracerightbt" win-ansi="0xFE" unicode="0xF8FE"/>
<map adobe-name="apple" win-ansi="-1" unicode="0xF8FE"/>
</font-mappings>

<!-- I couldn't find the following characters in the unicode tables -->

<!--
<map adobe-name="center" win-ansi="-1" unicode=""/>
<map adobe-name="dectab" win-ansi="-1" unicode=""/>
@@ -655,4 +649,4 @@
<map adobe-name="up" win-ansi="-1" unicode=""/>
<map adobe-name="zer" win-ansi="-1" unicode=""/>

-->
-->

+ 16
- 0
src/codegen/font-file.xsl Parādīt failu

@@ -28,6 +28,8 @@ public class <xsl:value-of select="class-name"/> extends Font {
private final static int xHeight = <xsl:value-of select="x-height"/>;
private final static int ascender = <xsl:value-of select="ascender"/>;
private final static int descender = <xsl:value-of select="descender"/>;
private final static int firstChar = <xsl:value-of select="first-char"/>;
private final static int lastChar = <xsl:value-of select="last-char"/>;
private final static int[] width;

static {
@@ -60,9 +62,23 @@ public class <xsl:value-of select="class-name"/> extends Font {
return xHeight;
}

public int getFirstChar() {
return firstChar;
}

public int getLastChar() {
return lastChar;
}

public int width(int i) {
return width[i];
}

public int[] getWidths() {
int[] arr = new int[getLastChar()-getFirstChar()+1];
System.arraycopy(width, getFirstChar(), arr, 0, getLastChar()-getFirstChar()+1);
return arr;
}
}
<!--</redirect:write>-->
</xsl:template>

+ 7
- 0
src/org/apache/fop/dom/NodeImpl.java Parādīt failu

@@ -191,6 +191,13 @@ public class NodeImpl implements Node {
return false;
}

public boolean isSupported(String feature,
String version)
{
return false;
}


public String getNamespaceURI()
{
return "";

+ 381
- 0
src/org/apache/fop/fonts/PFMFile.java Parādīt failu

@@ -0,0 +1,381 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.fonts;

import java.io.*;

/**
* This class represents a PFM file (or parts of it) as a Java object.
*
* @author jeremias.maerki@outline.ch
*/
public class PFMFile {

//Header stuff
private String windowsName;
private String postscriptName;
private short dfItalic;
private int dfWeight;
private short dfCharSet;
private short dfPitchAndFamily;
private int dfAvgWidth;
private int dfMaxWidth;
private int dfMinWidth;
private short dfFirstChar;
private short dfLastChar;

//Extension stuff
//---

//Extend Text Metrics
private int etmCapHeight;
private int etmXHeight;
private int etmLowerCaseAscent;
private int etmLowerCaseDescent;

//Extent table
private int[] extentTable;

public PFMFile() {
}

/**
* Parses a PFM file
*
* @param inStream The stream from which to read the PFM file.
*/
public void load(InputStream inStream) throws IOException {
InputStream bufin = new BufferedInputStream(inStream, 1024);
bufin.mark(1024);
PFMInputStream in = new PFMInputStream(bufin);
int version = in.readShort();
long filesize = in.readInt();
bufin.reset();

byte[] buf = new byte[(int)filesize];
bufin.read(buf, 0, (int)filesize);

bufin = new ByteArrayInputStream(buf);
in = new PFMInputStream(bufin);
loadHeader(in);
loadExtension(in);
}

/**
* Parses the header of the PFM file.
*
* @param inStream The stream from which to read the PFM file.
*/
private void loadHeader(PFMInputStream inStream) throws IOException {
inStream.skip(80);
dfItalic = inStream.readByte();
inStream.skip(2);
dfWeight = inStream.readShort();
dfCharSet = inStream.readByte();
inStream.skip(4);
dfPitchAndFamily = inStream.readByte();
dfAvgWidth = inStream.readShort();
dfMaxWidth = inStream.readShort();
dfFirstChar = inStream.readByte();
dfLastChar = inStream.readByte();
inStream.skip(8);
long faceOffset = inStream.readInt();

inStream.reset();
inStream.skip(faceOffset);
windowsName = inStream.readString();

inStream.reset();
inStream.skip(117);
}

/**
* Parses the extension part of the PFM file.
*
* @param inStream The stream from which to read the PFM file.
*/
private void loadExtension(PFMInputStream inStream) throws IOException {
int size = inStream.readShort();
long extMetricsOffset = inStream.readInt();
long extentTableOffset = inStream.readInt();
inStream.skip(12);
long driverInfoOffset = inStream.readInt();
inStream.reset();
inStream.skip(driverInfoOffset);
postscriptName = inStream.readString();

if (extMetricsOffset != 0) {
inStream.reset();
inStream.skip(extMetricsOffset);
loadExtMetrics(inStream);
}
if (extentTableOffset != 0) {
inStream.reset();
inStream.skip(extentTableOffset);
loadExtentTable(inStream);
}

}

/**
* Parses the extended metrics part of the PFM file.
*
* @param inStream The stream from which to read the PFM file.
*/
private void loadExtMetrics(PFMInputStream inStream) throws IOException {
int size = inStream.readShort();
inStream.skip(12);
etmCapHeight = inStream.readShort();
etmXHeight = inStream.readShort();
etmLowerCaseAscent = inStream.readShort();
etmLowerCaseDescent = inStream.readShort();
}

/**
* Parses the extent table of the PFM file.
*
* @param inStream The stream from which to read the PFM file.
*/
private void loadExtentTable(PFMInputStream inStream) throws IOException {
extentTable = new int[dfLastChar-dfFirstChar];
dfMinWidth = dfMaxWidth;
for (short i = dfFirstChar; i < dfLastChar; i++) {
extentTable[i-dfFirstChar] = inStream.readShort();
if (extentTable[i-dfFirstChar] < dfMinWidth) {
dfMinWidth = extentTable[i-dfFirstChar];
}
}
}

/**
* Returns the Windows name of the font.
*
* @return The Windows name.
*/
public String getWindowsName() {
return windowsName;
}

/**
* Returns the Postscript name of the font.
*
* @return The Postscript name.
*/
public String getPostscriptName() {
return postscriptName;
}

/**
* Returns the charset used for the font.
*
* @return The charset (0=WinAnsi).
*/
public short getCharSet() {
return dfCharSet;
}

/**
* Returns the charset of the font as a string.
*
* @return The name of the charset.
*/
public String getCharSetName() {
switch (dfCharSet) {
case 0: return "WinAnsi";
case 128: return "Shift-JIS (Japanese)";
default: return "Unknown";
}
}

/**
* Returns the number of the character that defines
* the first entry in the widths list.
*
* @return The number of the first character.
*/
public short getFirstChar() {
return dfFirstChar;
}

/**
* Returns the number of the character that defines
* the last entry in the widths list.
*
* @return The number of the last character.
*/
public short getLastChar() {
return dfLastChar;
}

/**
* Returns the CapHeight parameter for the font (height of uppercase H).
*
* @return The CapHeight parameter.
*/
public int getCapHeight() {
return etmCapHeight;
}

/**
* Returns the XHeight parameter for the font (height of lowercase x).
*
* @return The CapHeight parameter.
*/
public int getXHeight() {
return etmXHeight;
}

/**
* Returns the LowerCaseAscent parameter for the font (height of lowercase d).
*
* @return The LowerCaseAscent parameter.
*/
public int getLowerCaseAscent() {
return etmLowerCaseAscent;
}

/**
* Returns the LowerCaseDescent parameter for the font (height of lowercase p).
*
* @return The LowerCaseDescent parameter.
*/
public int getLowerCaseDescent() {
return etmLowerCaseDescent;
}

/**
* Tells whether the font has proportional character spacing.
*
* @return ex. true for Times, false for Courier.
*/
public boolean getIsProportional() {
return ((dfPitchAndFamily & 1) == 1);
}

/**
* Returns the bounding box for the font.
* Note: this value is just an approximation,
* it does not really exist in the PFM file.
*
* @return The calculated Font BBox.
*/
public int[] getFontBBox() {
int[] bbox = new int[4];

//Just guessing....
if (!getIsProportional() && (dfAvgWidth == dfMaxWidth)) {
bbox[0] = -20;
} else {
bbox[0] = -100;
}
bbox[1] = -(getLowerCaseDescent() + 5);
bbox[2] = dfMaxWidth + 10;
bbox[3] = getLowerCaseAscent() + 5;
return bbox;
}

/**
* Returns the characteristics flags for the font as
* needed for a PDF font descriptor (See PDF specs).
*
* @return The characteristics flags.
*/
public int getFlags() {
int flags = 0;
if (!getIsProportional()) { flags |= 1; }
if ((dfPitchAndFamily & 16) == 16) { flags |= 2; }
if ((dfPitchAndFamily & 64) == 64) { flags |= 4; }
if (dfCharSet == 0) { flags |= 6; }
if (dfItalic != 0) { flags |= 7; }
return flags;
}

/**
* Returns the width of the dominant vertical stems of the font.
* Note: this value is just an approximation,
* it does not really exist in the PFM file.
*
* @return The vertical stem width.
*/
public int getStemV() {
//Just guessing....
if (dfItalic != 0) {
return (int)Math.round(dfMinWidth * 0.25);
} else {
return (int)Math.round(dfMinWidth * 0.6);
}
}

/**
* Returns the italic angle of the font.
* Note: this value is just an approximation,
* it does not really exist in the PFM file.
*
* @return The italic angle.
*/
public int getItalicAngle() {
if (dfItalic != 0) {
return -16; //Just guessing....
} else {
return 0;
}
}

/**
* Returns the width of a character
*
* @param which The number of the character for which the width is requested.
* @return The width of a character.
*/
public int getCharWidth(short which) {
return extentTable[which-dfFirstChar];
}
}

+ 132
- 0
src/org/apache/fop/fonts/PFMInputStream.java Parādīt failu

@@ -0,0 +1,132 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.fonts;

import java.io.*;

/**
* This is a helper class for reading PFM files. It defines functions for
* extracting specific values out of the stream.
*
* @author jeremias.maerki@outline.ch
*/
public class PFMInputStream extends java.io.FilterInputStream {

DataInputStream inStream;

/**
* Constructs a PFMInputStream based on an InputStream representing the PFM file.
*
* @param inStream The stream from which to read the PFM file.
*/
public PFMInputStream(InputStream in) {
super(in);
inStream = new DataInputStream(in);
}

/**
* Parses a one byte value out of the stream.
*
* @return The value extracted.
*/
public short readByte() throws IOException {
short s = inStream.readByte();
//Now, we've got to trick Java into forgetting the sign
int s1 = (((s & 0xF0) >>> 4) << 4) + (s & 0x0F);
return (short)s1;
}

/**
* Parses a two byte value out of the stream.
*
* @return The value extracted.
*/
public int readShort() throws IOException {
int i = inStream.readShort();

//Change byte order
int high = (i & 0xFF00) >>> 8;
int low = (i & 0x00FF) << 8;
return low + high;
}

/**
* Parses a four byte value out of the stream.
*
* @return The value extracted.
*/
public long readInt() throws IOException {
int i = inStream.readInt();

//Change byte order
int i1 = (i & 0xFF000000) >>> 24;
int i2 = (i & 0x00FF0000) >>> 8;
int i3 = (i & 0x0000FF00) << 8;
int i4 = (i & 0x000000FF) << 24;
return i1 + i2 + i3 + i4;
}

/**
* Parses a zero-terminated string out of the stream.
*
* @return The value extracted.
*/
public String readString() throws IOException {
InputStreamReader reader = new InputStreamReader(in, "ISO-8859-1");
StringBuffer buf = new StringBuffer();
int ch = reader.read();
while (ch != 0) {
buf.append((char) ch);
ch = reader.read();
}
return buf.toString();
}
}

+ 27
- 0
src/org/apache/fop/fonts/apps/FontPostProcess.xsl Parādīt failu

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- xslt stylesheets belonging to the pfmreader -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="widths">
<xsl:element name="widths">
<xsl:for-each select="char">
<xsl:variable name="char-num" select="@ansichar"/>
<xsl:variable name="char-name" select="document('charlist.xml')/font-mappings/map[@win-ansi=$char-num]/@adobe-name"/>
<xsl:if test="$char-name!=''">
<xsl:element name="char">
<xsl:attribute name="name"><xsl:value-of select="$char-name"/></xsl:attribute>
<xsl:attribute name="width"><xsl:value-of select="@width"/></xsl:attribute>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:template>

</xsl:stylesheet>

+ 20
- 0
src/org/apache/fop/fonts/apps/FontPostProcessSort.xsl Parādīt failu

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="widths">
<xsl:copy>
<xsl:apply-templates select="char">
<xsl:sort select="@name" case-order="upper-first"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>


</xsl:stylesheet>

+ 358
- 0
src/org/apache/fop/fonts/apps/PFMReader.java Parādīt failu

@@ -0,0 +1,358 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.fonts.apps;

import java.io.*;
import org.w3c.dom.*;
import org.apache.xerces.dom.*;
import org.apache.xml.serialize.*;
import org.apache.xalan.xslt.*;
import org.apache.fop.fonts.*;

/**
* A tool which reads PFM files from Adobe Type 1 fonts and creates
* XML font metrics file for use in FOP.
*
* @author jeremias.maerki@outline.ch
*/
public class PFMReader {

static private final String XSL_POSTPROCESS = "FontPostProcess.xsl";
static private final String XSL_SORT = "FontPostProcessSort.xsl";

private boolean invokedStandalone = false;

public PFMReader() {
}

/**
* The main method for the PFM reader tool.
*
* @param args Command-line arguments: [pfm-file] {[xml-file]}
* If [xml-file] is not provided, then just a little preview of
* the PFM ist displayed.
*/
public static void main(String[] args) {
PFMReader app = new PFMReader();
app.invokedStandalone = true;

System.out.println("PFM Reader v1.0");
System.out.println();

if (args.length > 0) {
PFMFile pfm = app.loadPFM(args[0]);
if (pfm != null) {
app.preview(pfm);

if (args.length > 1) {
org.w3c.dom.Document doc = app.constructFontXML(pfm);
doc = app.postProcessXML(doc);
if (doc != null) {
app.writeFontXML(doc, args[1]);
}
}
}
} else {
System.out.println("Arguments: <source> [<target>]");
System.out.println("Example: COM_____.pfm COM_____.xml");
}
}

/**
* Read a PFM file and returns it as an object.
*
* @param filename The filename of the PFM file.
* @return The PFM as an object.
*/
public PFMFile loadPFM(String filename) {
try {
System.out.println("Reading " + filename + "...");
System.out.println();
FileInputStream in = new FileInputStream(filename);
PFMFile pfm = new PFMFile();
pfm.load(in);
return pfm;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

/**
* Displays a preview of the PFM file on the console.
*
* @param pfm The PFM file to preview.
*/
public void preview(PFMFile pfm) {
PrintStream out = System.out;

out.print("Font: ");
out.println(pfm.getWindowsName());
out.print("Name: ");
out.println(pfm.getPostscriptName());
out.print("CharSet: ");
out.println(pfm.getCharSetName());
out.print("CapHeight: ");
out.println(pfm.getCapHeight());
out.print("XHeight: ");
out.println(pfm.getXHeight());
out.print("LowerCaseAscent: ");
out.println(pfm.getLowerCaseAscent());
out.print("LowerCaseDescent: ");
out.println(pfm.getLowerCaseDescent());
out.print("Having widths for ");
out.print(pfm.getLastChar()-pfm.getFirstChar());
out.print(" characters (");
out.print(pfm.getFirstChar());
out.print("-");
out.print(pfm.getLastChar());
out.println(").");
out.print("for example: Char ");
out.print(pfm.getFirstChar());
out.print(" has a width of ");
out.println(pfm.getCharWidth(pfm.getFirstChar()));
out.println();
}

/**
* Writes the generated DOM Document to a file.
*
* @param doc The DOM Document to save.
* @param target The target filename for the XML file.
*/
public void writeFontXML(org.w3c.dom.Document doc, String target) {
System.out.println("Writing xml font file " + target + "...");
System.out.println();

try {
OutputFormat format = new OutputFormat(doc); //Serialize DOM
FileWriter out = new FileWriter(target); //Writer will be a String
XMLSerializer serial = new XMLSerializer(out, format);
serial.asDOMSerializer(); // As a DOM Serializer

serial.serialize(doc.getDocumentElement());
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Generates the font metrics file from the PFM file.
*
* @param pfm The PFM file to generate the font metrics from.
* @return The DOM document representing the font metrics file.
*/
public org.w3c.dom.Document constructFontXML(PFMFile pfm) {
System.out.println("Creating xml font file...");
System.out.println();

Document doc = new DocumentImpl();
Element root = doc.createElement("font-metrics");
doc.appendChild(root);

Element el = doc.createElement("font-name");
root.appendChild(el);
el.appendChild(doc.createTextNode(pfm.getPostscriptName()));

String s = pfm.getPostscriptName();
int pos = s.indexOf("-");
if (pos >= 0) {
StringBuffer sb = new StringBuffer(s);
sb.deleteCharAt(pos);
s = sb.toString();
}

el = doc.createElement("class-name");
root.appendChild(el);
el.appendChild(doc.createTextNode(s));

el = doc.createElement("subtype");
root.appendChild(el);
el.appendChild(doc.createTextNode("Type1"));

el = doc.createElement("encoding");
root.appendChild(el);
el.appendChild(doc.createTextNode(pfm.getCharSetName()+"Encoding"));

el = doc.createElement("cap-height");
root.appendChild(el);
Integer value = new Integer(pfm.getCapHeight());
el.appendChild(doc.createTextNode(value.toString()));

el = doc.createElement("x-height");
root.appendChild(el);
value = new Integer(pfm.getXHeight());
el.appendChild(doc.createTextNode(value.toString()));

el = doc.createElement("ascender");
root.appendChild(el);
value = new Integer(pfm.getLowerCaseAscent());
el.appendChild(doc.createTextNode(value.toString()));

el = doc.createElement("descender");
root.appendChild(el);
value = new Integer(-pfm.getLowerCaseDescent());
el.appendChild(doc.createTextNode(value.toString()));

Element bbox = doc.createElement("bbox");
root.appendChild(bbox);
int[] bb = pfm.getFontBBox();
String[] names = {"left","bottom","right","top"};
for (int i=0; i<4; i++) {
el = doc.createElement(names[i]);
bbox.appendChild(el);
value = new Integer(bb[i]);
el.appendChild(doc.createTextNode(value.toString()));
}

el = doc.createElement("flags");
root.appendChild(el);
value = new Integer(pfm.getFlags());
el.appendChild(doc.createTextNode(value.toString()));

el = doc.createElement("stemv");
root.appendChild(el);
value = new Integer(pfm.getStemV());
el.appendChild(doc.createTextNode(value.toString()));

el = doc.createElement("italicangle");
root.appendChild(el);
value = new Integer(pfm.getItalicAngle());
el.appendChild(doc.createTextNode(value.toString()));

el = doc.createElement("first-char");
root.appendChild(el);
value = new Integer(pfm.getFirstChar());
el.appendChild(doc.createTextNode(value.toString()));

el = doc.createElement("last-char");
root.appendChild(el);
value = new Integer(pfm.getLastChar());
el.appendChild(doc.createTextNode(value.toString()));

Element widths = doc.createElement("widths");
root.appendChild(widths);

for (short i = pfm.getFirstChar(); i < pfm.getLastChar(); i++) {
el = doc.createElement("char");
widths.appendChild(el);
el.setAttribute("ansichar", "0x00" + Integer.toHexString(i).toUpperCase());
el.setAttribute("width", new Integer(pfm.getCharWidth(i)).toString());
}

return doc;
}

/**
* Modifies the generated font metrics file. First, it processes the
* character mmappings, then it sorts them.
*
* @param doc The DOM document representing the font metrics file.
* @return A DOM document representing the processed font metrics file.
*/
public org.w3c.dom.Document postProcessXML(org.w3c.dom.Document doc) {
try {

System.out.println("Postprocessing...");
System.out.println();

// Create the 3 objects the XSLTProcessor needs to perform the transformation.
org.apache.xalan.xslt.XSLTInputSource xmlSource =
new org.apache.xalan.xslt.XSLTInputSource(doc);

InputStream xsl = this.getClass().getResourceAsStream(XSL_POSTPROCESS);
if (xsl == null) {
throw new Exception("Resource " + XSL_POSTPROCESS + " not found");
}
org.apache.xalan.xslt.XSLTInputSource xslSheet =
new org.apache.xalan.xslt.XSLTInputSource(xsl);

Document targetDoc = new DocumentImpl();
org.apache.xalan.xslt.XSLTResultTarget xmlResult =
new org.apache.xalan.xslt.XSLTResultTarget(targetDoc);

// Use XSLTProcessorFactory to instantiate an XSLTProcessor.
org.apache.xalan.xslt.XSLTProcessor processor =
org.apache.xalan.xslt.XSLTProcessorFactory.getProcessor(
new org.apache.xalan.xpath.xdom.XercesLiaison());

// Perform the transformation.
processor.process(xmlSource, xslSheet, xmlResult);


System.out.println("Sorting...");
System.out.println();

// Sort the whole thing
xmlSource.setNode(targetDoc);

xsl = this.getClass().getResourceAsStream(XSL_SORT);
if (xsl == null) {
throw new Exception("Resource " + XSL_SORT + " not found");
}
xslSheet = new org.apache.xalan.xslt.XSLTInputSource(xsl);

org.w3c.dom.Document targetDocSorted = new DocumentImpl();
xmlResult =
new org.apache.xalan.xslt.XSLTResultTarget(targetDocSorted);

// Perform the transformation (sort).
processor.process(xmlSource, xslSheet, xmlResult);

return targetDocSorted;

} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

+ 69
- 0
src/org/apache/fop/layout/FontDescriptor.java Parādīt failu

@@ -0,0 +1,69 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.layout;


public interface FontDescriptor {

//Required
public int getAscender(); //Ascent in pdf spec
public int getCapHeight();
public int getDescender(); //Descent in pdf spec
public int getFlags();
public int[] getFontBBox();
public String fontName(); //should be getFontName(). not?
public int getItalicAngle();
public int getStemV();

//Optional
//public int getXHeight();

}

+ 9
- 4
src/org/apache/fop/layout/FontMetric.java Parādīt failu

@@ -54,14 +54,19 @@ package org.apache.fop.layout;
* interface for font metric classes
*/
public interface FontMetric {
int getAscender();
int getCapHeight();
int getDescender();
int getXHeight();

public int getAscender();
public int getCapHeight();
public int getDescender();
public int getXHeight();

public int getFirstChar();
public int getLastChar();

/**
* return width (in 1/1000ths of point size) of character at
* code point i
*/
public int width(int i);
public int[] getWidths();
}

+ 90
- 0
src/org/apache/fop/pdf/PDFArray.java Parādīt failu

@@ -0,0 +1,90 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.pdf;

/**
* class representing an array object
*/
public class PDFArray extends PDFObject {

protected int[] values;

/**
* create the array object
*
* @param number the object's number
* @param values the actual array wrapped by this object
*/
public PDFArray(int number, int[] values) {

/* generic creation of PDF object */
super(number);

/* set fields using paramaters */
this.values = values;
}

/**
* produce the PDF representation for the object
*
* @return the PDF
*/
public String toPDF() {
StringBuffer p = new StringBuffer();
p.append(this.number + " " + this.generation + " obj\n[");
for (int i = 0; i < values.length; i++) {
p.append(" ");
p.append(values[i]);
}
p.append("]\nendobj\n");
return p.toString();
}
}

+ 73
- 11
src/org/apache/fop/pdf/PDFDocument.java Parādīt failu

@@ -1,4 +1,4 @@
/*-- $Id$ --
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
@@ -41,15 +41,16 @@
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/

/* image support modified from work of BoBoGi */
/* font support based on work by Takayuki Takeuchi */

package org.apache.fop.pdf;

@@ -62,6 +63,8 @@ import org.apache.fop.datatypes.ColorSpace;

import org.apache.fop.datatypes.IDReferences;
import org.apache.fop.layout.Page;
import org.apache.fop.layout.FontMetric;
import org.apache.fop.layout.FontDescriptor;
// Java
import java.io.IOException;
import java.io.PrintWriter;
@@ -71,7 +74,7 @@ import java.util.Enumeration;
import java.awt.Rectangle;

/**
* class representing a PDF document.
* class representing a PDF document.
*
* The document is built up by calling various methods and then finally
* output to given filehandle using output method.
@@ -716,25 +719,84 @@ public class PDFDocument {
}


/**
* make a /Encoding object
*
* @param encodingName character encoding scheme name
* @return the created /Encoding object
*/
public PDFEncoding makeEncoding(String encodingName) {

/* create a PDFEncoding with the next object number and add to the
list of objects */
PDFEncoding encoding = new PDFEncoding(++this.objectcount, encodingName);
this.objects.addElement(encoding);
return encoding;
}


/**
* make a Type1 /Font object
*
*
* @param fontname internal name to use for this font (eg "F1")
* @param basefont name of the base font (eg "Helvetica")
* @param encoding character encoding scheme used by the font
* @param metrics additional information about the font
* @param descriptor additional information about the font
* @return the created /Font object
*/
public PDFFont makeFont(String fontname, String basefont,
String encoding) {
String encoding, FontMetric metrics, FontDescriptor descriptor) {

/* create a PDFFont with the next object number and add to the
list of objects */
PDFFont font = new PDFFont(++this.objectcount, fontname,
basefont, encoding);
this.objects.addElement(font);
return font;
if (descriptor == null) {
PDFFont font = new PDFFont(++this.objectcount, fontname, PDFFont.TYPE1,
basefont, encoding);
this.objects.addElement(font);
return font;
} else {
PDFFontNonBase14 font = (PDFFontNonBase14)PDFFont.createFont(
++this.objectcount, fontname,
PDFFont.TYPE1, basefont, encoding);
this.objects.addElement(font);
PDFFontDescriptor pdfdesc = makeFontDescriptor(descriptor);
font.setDescriptor(pdfdesc);
font.setWidthMetrics(metrics.getFirstChar(), metrics.getLastChar(),
makeArray(metrics.getWidths()));
return font;
}
}


/**
* make a /FontDescriptor object for a CID font
*/
public PDFFontDescriptor makeFontDescriptor(FontDescriptor desc) {

/* create a PDFFontDescriptor with the next object number and add to
the list of objects */
PDFFontDescriptor font = new PDFFontDescriptor(++this.objectcount,
desc.fontName(), desc.getAscender(), desc.getDescender(),
desc.getCapHeight(), desc.getFlags(),
new PDFRectangle(desc.getFontBBox()), desc.getStemV(),
desc.getItalicAngle());
this.objects.addElement(font);
return font;
}


/**
* make an Array object (ex. Widths array for a font)
*/
public PDFArray makeArray(int[] values) {

PDFArray array = new PDFArray(++this.objectcount, values);
this.objects.addElement(array);
return array;
}


public int addImage(FopImage img) {
// check if already created
String url = img.getURL();

+ 152
- 0
src/org/apache/fop/pdf/PDFEncoding.java Parādīt failu

@@ -0,0 +1,152 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.pdf;

// Java
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

/**
* class representing an /Encoding object.
*
* A small object expressing the base encoding name and
* the differences from the base encoding.
*
* The three base encodings are given by their name.
*
* Encodings are specified on page 213 and onwards of the PDF 1.3 spec.
*/
public class PDFEncoding extends PDFObject {

/** the name for the standard encoding scheme */
public static final String MacRomanEncoding = "MacRomanEncoding";
/** the name for the standard encoding scheme */
public static final String MacExpertEncoding = "MacExpertEncoding";
/** the name for the standard encoding scheme */
public static final String WinAnsiEncoding = "WinAnsiEncoding";

/**
* the name for the base encoding.
* One of the three base encoding scheme names or
* the default font's base encoding if null.
*/
protected String basename;

/** the differences from the base encoding */
protected Hashtable differences;

/**
* create the /Encoding object
*
* @param number the object's number
* @param basename the name of the character encoding schema
*/
public PDFEncoding(int number, String basename) {

/* generic creation of PDF object */
super(number);

/* set fields using paramaters */
this.basename = basename;
this.differences = new Hashtable();
}

/**
* add differences to the encoding
*
* @param code the first index of the sequence to be changed
* @param sequence the sequence of glyph names (as String)
*/
public void addDifferences(int code, Vector sequence) {
differences.put(new Integer(code), sequence);
}

/**
* produce the PDF representation for the object
*
* @return the PDF
*/
public String toPDF() {
StringBuffer p = new StringBuffer();
p.append(this.number + " " + this.generation
+ " obj\n<< /Type /Encoding");
if ((basename != null) && (!basename.equals(""))) {
p.append("\n/BaseEncoding /" + this.basename);
}
if (!differences.isEmpty()) {
p.append("\n/Differences [ ");
Object code;
Enumeration codes = differences.keys();
while (codes.hasMoreElements()) {
code = codes.nextElement();
p.append(" "); p.append(code);
Vector sequence = (Vector)differences.get(code);
for (int i = 0; i < sequence.size(); i++) {
p.append(" /"); p.append((String)sequence.elementAt(i));
}
}
p.append(" ]");
}
p.append(" >>\nendobj\n");
return p.toString();
}
/* example (p. 214)
25 0 obj
<<
/Type /Encoding
/Differences [39 /quotesingle 96 /grave 128
/Adieresis /Aring /Ccedilla /Eacute /Ntilde
/Odieresis /Udieresis /aacute /agrave]
>>
endobj
*/
}

+ 161
- 37
src/org/apache/fop/pdf/PDFFont.java Parādīt failu

@@ -1,36 +1,36 @@
/*-- $Id$ --
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
@@ -41,56 +41,158 @@
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.pdf;

// Java
import java.io.IOException;
import java.io.PrintWriter;

/**
* class representing a /Font object.
*
* A small object expressing the base font name and encoding of a
* Type 1 font along with an internal name for the font used within
* streams of content
* A more complete object expressing the base font name and encoding of a
* font along with an internal name for the font used within
* streams of content.
*
* Fonts are specified on page 198 and onwards of the PDF 1.3 spec.
*/
public class PDFFont extends PDFObject {

/** font subtype to be used as parameter to createFont() */
public static final byte TYPE0 = 0;
/** font subtype to be used as parameter to createFont() */
public static final byte TYPE1 = 1;
/** font subtype to be used as parameter to createFont() */
public static final byte MMTYPE1 = 2;
/** font subtype to be used as parameter to createFont() */
public static final byte TYPE3 = 3;
/** font subtype to be used as parameter to createFont() */
public static final byte TRUETYPE = 4;

/** font subtype names as output in the PDF */
protected static final String[] TYPE_NAMES = new String[] // take care of the order
{"Type0", "Type1", "MMType1", "Type3", "TrueType"};

/** the internal name for the font (eg "F1") */
protected String fontname;

/**
* the font's subtype
* (as defined by the constants TYPE0, TYPE1, MMTYPE1, TYPE3, TRUETYPE)
*/
protected byte subtype;

/** the base font name (eg "Helvetica") */
protected String basefont;

/** the character encoding scheme used by the font (eg
"WinAnsiEncoding") */
protected String encoding;
/**
* the character encoding scheme used by the font.
* It can be a String for standard encodings, or
* a PDFEncoding for a more complex scheme, or
* a PDFStream containing a CMap in a Type0 font.
* If <code>null</code> then not written out in the PDF.
*/
protected Object encoding;

/** the Unicode mapping mechanism */
//protected PDFToUnicode mapping;

/**
* create the /Font object
*
* @param the object's number
* @param number the object's number
* @param fontname the internal name for the font
* @param subtype the font's subtype
* @param basefont the base font name
* @param encoding the character encoding schema used by the font
* @param mapping the Unicode mapping mechanism
*/
public PDFFont(int number, String fontname, String basefont,
String encoding) {
public PDFFont(int number, String fontname, byte subtype, String basefont,
Object encoding/*, PDFToUnicode mapping*/) {

/* generic creation of PDF object */
super(number);
/* generic creation of PDF object */
super(number);

/* set fields using paramaters */
this.fontname = fontname;
this.basefont = basefont;
this.encoding = encoding;
/* set fields using paramaters */
this.fontname = fontname;
this.subtype = subtype;
this.basefont = basefont;
this.encoding = encoding;
//this.mapping = mapping;
}

/**
* factory method with the basic parameters
*
* @param number the object's number
* @param fontname the internal name for the font
* @param subtype the font's subtype
* @param basefont the base font name
* @param encoding the character encoding schema used by the font
*/
public static PDFFont createFont(int number, String fontname,
byte subtype, String basefont, Object encoding) {
switch (subtype) {
/*
case TYPE0 :
return new PDFFontType0(number, fontname, subtype, basefont, encoding);
*/
case TYPE1 :
case MMTYPE1 :
return new PDFFontType1(number, fontname, subtype, basefont, encoding);
/*
case TYPE3 :
return new PDFFontType3(number, fontname, subtype, basefont, encoding);
case TRUETYPE :
return new PDFFontTrueType(number, fontname, subtype, basefont, encoding);
*/
}
return null; // should not happend
}

/**
* factory method with the extended parameters
* for Type1, MMType1 and TrueType
*
* @param number the object's number
* @param fontname the internal name for the font
* @param subtype the font's subtype
* @param basefont the base font name
* @param encoding the character encoding schema used by the font
* @param firstChar the first character code in the font
* @param lastChar the last character code in the font
* @param widths an array of size (lastChar - firstChar +1)
* @param descriptor the descriptor for other font's metrics
*/
public static PDFFont createFont(int number, String fontname,
byte subtype, String basefont, Object encoding,
int firstChar, int lastChar, PDFArray widths,
PDFFontDescriptor descriptor) {

PDFFontNonBase14 font;
switch (subtype) {
case TYPE0 :
return null; // should not happend
case TYPE1 :
case MMTYPE1 :
font = new PDFFontType1(number, fontname, subtype, basefont, encoding);
font.setWidthMetrics(firstChar, lastChar, widths);
font.setDescriptor(descriptor);
return font;
case TYPE3 :
return null; // should not happend
/*
case TRUETYPE :
font = new PDFFontTrueType(number, fontname, subtype, basefont, encoding);
font.setWidthMetrics(firstChar, lastChar, widths);
font.setDescriptor(descriptor);
return font;
*/
}
return null; // should not happend
}

/**
@@ -99,7 +201,7 @@ public class PDFFont extends PDFObject {
* @return the internal name
*/
public String getName() {
return this.fontname;
return this.fontname;
}

/**
@@ -108,10 +210,32 @@ public class PDFFont extends PDFObject {
* @return the PDF
*/
public String toPDF() {
String p = this.number + " " + this.generation
+ " obj\n<< /Type /Font\n/Subtype /Type1\n/Name /"
+ this.fontname + "\n/BaseFont /" + this.basefont
+ "\n/Encoding /"+ this.encoding + " >>\nendobj\n";
return p;
StringBuffer p = new StringBuffer();
p.append(this.number + " " + this.generation
+ " obj\n<< /Type /Font\n/Subtype /" + TYPE_NAMES[this.subtype]
+ "\n/Name /" + this.fontname + "\n/BaseFont /" + this.basefont);
if (encoding != null) {
p.append("\n/Encoding ");
if (encoding instanceof PDFEncoding) {
p.append(((PDFEncoding)this.encoding).referencePDF());
} else if (encoding instanceof PDFStream) {
p.append(((PDFStream)this.encoding).referencePDF());
} else {
p.append("/").append((String)encoding);
}
}
fillInPDF(p);
p.append(" >>\nendobj\n");
return p.toString();
}

/**
* fill in the specifics for the font's subtype.
*
* the given buffer already contains the fields common to all font types.
*
* @param begin the buffer to be completed with the type specific fields
*/
protected void fillInPDF(StringBuffer begin) {
}
}

+ 203
- 0
src/org/apache/fop/pdf/PDFFontDescriptor.java Parādīt failu

@@ -0,0 +1,203 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.pdf;

/**
* class representing a font descriptor.
*
* Font descriptors are specified on page 222 and onwards of the PDF 1.3 spec.
*/
public class PDFFontDescriptor extends PDFObject {

// Required fields
protected int ascent;
protected int capHeight;
protected int descent;
protected int flags;
protected PDFRectangle fontBBox;
protected String basefont; //PDF-spec: FontName
protected int italicAngle;
protected int stemV;
// Optional fields
protected int stemH = 0;
protected int xHeight = 0;
protected int leading = 0;
protected int avgWidth = 0;
protected int maxWidth = 0;
protected int missingWidth = 0;
protected PDFStream fontfile;
//protected String charSet = null;

protected byte subtype;

/**
* create the /FontDescriptor object
*
* @param number the object's number
* @param ascent the maximum height above the baseline
* @param descent the maximum depth below the baseline
* @param capHeight height of the capital letters
* @param flags various characteristics of the font
* @param fontBBox the bounding box for the described font
* @param basefont the base font name
* @param italicAngle the angle of the vertical dominant strokes
* @param stemV the width of the dominant vertical stems of glyphs
*/
public PDFFontDescriptor(int number, String basefont, int ascent,
int descent, int capHeight, int flags, PDFRectangle fontBBox,
int italicAngle, int stemV) {

/* generic creation of PDF object */
super(number);

/* set fields using paramaters */
this.basefont = basefont;
this.ascent = ascent;
this.descent = descent;
this.capHeight = capHeight;
this.flags = flags;
this.fontBBox = fontBBox;
this.italicAngle = italicAngle;
this.stemV = stemV;
}

/**
* set the optional metrics
*/
public void setMetrics(int avgWidth, int maxWidth, int missingWidth, int leading, int stemH, int xHeight) {
this.avgWidth = avgWidth;
this.maxWidth = maxWidth;
this.missingWidth = missingWidth;
this.leading = leading;
this.stemH = stemH;
this.xHeight = xHeight;
}

/**
* set the optional font file stream
*
* @param subtype the font type defined in the font stream
* @param fontfile the stream containing an embedded font
*/
public void setFontFile(byte subtype, PDFStream fontfile) {
this.subtype = subtype;
this.fontfile = fontfile;
}

//public void setCharSet(){}//for subset fonts

/**
* produce the PDF representation for the object
*
* @return the PDF
*/
public String toPDF() {
StringBuffer p = new StringBuffer(
this.number + " " + this.generation
+ " obj\n<< /Type /FontDescriptor"
+ "\n/FontName /" + this.basefont);

p.append("\n/FontBBox "); p.append(fontBBox.toPDF());
p.append("\n/Flags "); p.append(flags);
p.append("\n/CapHeight "); p.append(capHeight);
p.append("\n/Ascent "); p.append(ascent);
p.append("\n/Descent "); p.append(descent);
p.append("\n/ItalicAngle "); p.append(italicAngle);
p.append("\n/StemV "); p.append(stemV);
// optional fields
if (stemH != 0) {
p.append("\n/StemH "); p.append(stemH);
}
if (xHeight != 0) {
p.append("\n/XHeight "); p.append(xHeight);
}
if (avgWidth != 0) {
p.append("\n/AvgWidth "); p.append(avgWidth);
}
if (maxWidth != 0) {
p.append("\n/MaxWidth "); p.append(maxWidth);
}
if (missingWidth != 0) {
p.append("\n/MissingWidth "); p.append(missingWidth);
}
if (leading != 0) {
p.append("\n/Leading "); p.append(leading);
}
if (fontfile != null) {
switch (subtype) {
case PDFFont.TYPE1:
p.append("\n/FontFile ");
break;
case PDFFont.TRUETYPE:
p.append("\n/FontFile2 ");
break;
default:
p.append("\n/FontFile3 ");
}
p.append(fontfile.referencePDF());
}
// charSet for subset fonts // not yet implemented
// CID optional field
fillInPDF(p);
p.append("\n >>\nendobj\n");
return p.toString();
}

/**
* fill in the specifics for the font's descriptor.
*
* the given buffer already contains the fields common to all descriptors.
*
* @param begin the buffer to be completed with the specific fields
*/
protected void fillInPDF(StringBuffer begin) {
}
}

+ 124
- 0
src/org/apache/fop/pdf/PDFFontNonBase14.java Parādīt failu

@@ -0,0 +1,124 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.pdf;

// Java

/**
* A common ancestor for Type1, TrueType, MMType1 and Type3 fonts
* (all except base 14 fonts).
*/
public abstract class PDFFontNonBase14 extends PDFFont {

/** first character code in the font */
protected int firstChar;
/** last character code in the font */
protected int lastChar;
/** widths of characters from firstChar to lastChar */
protected PDFArray widths;
/** descriptor of font metrics */
protected PDFFontDescriptor descriptor;

/**
* create the /Font object
*
* @param number the object's number
* @param fontname the internal name for the font
* @param subtype the font's subtype
* @param basefont the base font name
* @param encoding the character encoding schema used by the font
* @param mapping the Unicode mapping mechanism
*/
public PDFFontNonBase14(int number, String fontname, byte subtype,
String basefont, Object encoding/*, PDFToUnicode mapping*/) {

/* generic creation of PDF object */
super(number, fontname, subtype, basefont, encoding);

this.descriptor = null;
}

/**
* set the width metrics for the font
*
* @param firstChar the first character code in the font
* @param lastChar the last character code in the font
* @param widths an array of size (lastChar - firstChar +1)
*/
public void setWidthMetrics(int firstChar, int lastChar, PDFArray widths) {
/* set fields using paramaters */
this.firstChar = firstChar;
this.lastChar = lastChar;
this.widths = widths;
}

/**
* set the font descriptor (unused for the Type3 fonts)
*
* @param descriptor the descriptor for other font's metrics
*/
public void setDescriptor(PDFFontDescriptor descriptor) {
this.descriptor = descriptor;
}

/**
* fill in the specifics for the font's subtype
*/
protected void fillInPDF(StringBuffer p) {
p.append("\n/FirstChar "); p.append(firstChar);
p.append("\n/LastChar "); p.append(lastChar);
p.append("\n/Widths "); p.append(this.widths.referencePDF());
if (descriptor != null) {
p.append("\n/FontDescriptor ");
p.append(this.descriptor.referencePDF());
}
}
}

+ 81
- 0
src/org/apache/fop/pdf/PDFFontType1.java Parādīt failu

@@ -0,0 +1,81 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.pdf;

/**
* class representing a Type1 or MMType1 font (not necessary for the base 14).
*
* Type1 fonts are specified on page 201 and onwards of the PDF 1.3 spec.
* MMType1 fonts are specified on page 205 and onwards of the PDF 1.3 spec.
*
* In fact everything already done in the superclass.
* Must only define the not default constructor.
*/
public class PDFFontType1 extends PDFFontNonBase14 {

/**
* create the /Font object
*
* @param number the object's number
* @param fontname the internal name for the font
* @param subtype the font's subtype (PDFFont.TYPE1 or PDFFont.MMTYPE1)
* @param basefont the base font name
* @param encoding the character encoding schema used by the font
* @param mapping the Unicode mapping mechanism
*/
public PDFFontType1(int number, String fontname, byte subtype,
String basefont, Object encoding/*, PDFToUnicode mapping*/) {

/* generic creation of PDF object */
super(number, fontname, subtype, basefont, encoding);
}

}

+ 103
- 0
src/org/apache/fop/pdf/PDFRectangle.java Parādīt failu

@@ -0,0 +1,103 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "Fop" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.fop.pdf;

/**
* class representing a rectangle
*
* Rectangles are specified on page 183 of the PDF 1.3 spec.
*/
public class PDFRectangle {
/** lower left x coordinate */
protected int llx;
/** lower left y coordinate */
protected int lly;
/** upper right x coordinate */
protected int urx;
/** upper right y coordinate */
protected int ury;

/**
* create a rectangle giving the four separate values
*
* @param llx lower left x coordinate
* @param lly lower left y coordinate
* @param urx upper right x coordinate
* @param ury upper right y coordinate
*/
public PDFRectangle(int llx, int lly, int urx, int ury) {
this.llx = llx;
this.lly = lly;
this.urx = urx;
this.ury = ury;
}

/**
* create a rectangle giving an array of four values
*
* @param array values in the order llx, lly, urx, ury
*/
public PDFRectangle(int[] array) {
this.llx = array[0];
this.lly = array[1];
this.urx = array[2];
this.ury = array[3];
}

/**
* produce the PDF representation for the object
*
* @return the PDF
*/
public String toPDF() {
return " [" + llx + " " + lly + " " + urx + " " + ury + "] ";
}
}

+ 148
- 132
src/org/apache/fop/render/pdf/FontSetup.java Parādīt failu

@@ -54,6 +54,7 @@ package org.apache.fop.render.pdf;
import org.apache.fop.render.pdf.fonts.*;
import org.apache.fop.messaging.MessageHandler;
import org.apache.fop.layout.FontInfo;
import org.apache.fop.layout.FontDescriptor;
import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFResources;

@@ -78,126 +79,136 @@ public class FontSetup {
* @param fontInfo the font info object to set up
*/
public static void setup(FontInfo fontInfo) {
MessageHandler.logln("setting up fonts");
fontInfo.addMetrics("F1", new Helvetica());
fontInfo.addMetrics("F2", new HelveticaOblique());
fontInfo.addMetrics("F3", new HelveticaBold());
fontInfo.addMetrics("F4", new HelveticaBoldOblique());
fontInfo.addMetrics("F5", new TimesRoman());
fontInfo.addMetrics("F6", new TimesItalic());
fontInfo.addMetrics("F7", new TimesBold());
fontInfo.addMetrics("F8", new TimesBoldItalic());
fontInfo.addMetrics("F9", new Courier());
fontInfo.addMetrics("F10", new CourierOblique());
fontInfo.addMetrics("F11", new CourierBold());
fontInfo.addMetrics("F12", new CourierBoldOblique());
fontInfo.addMetrics("F13", new Symbol());
fontInfo.addMetrics("F14", new ZapfDingbats());
/* any is treated as serif */
fontInfo.addFontProperties("F5", "any", "normal", "normal");
fontInfo.addFontProperties("F6", "any", "italic", "normal");
fontInfo.addFontProperties("F6", "any", "oblique", "normal");
fontInfo.addFontProperties("F7", "any", "normal", "bold");
fontInfo.addFontProperties("F8", "any", "italic", "bold");
fontInfo.addFontProperties("F8", "any", "oblique", "bold");
fontInfo.addFontProperties("F1", "sans-serif", "normal",
"normal");
fontInfo.addFontProperties("F2", "sans-serif", "oblique",
"normal");
fontInfo.addFontProperties("F2", "sans-serif", "italic",
"normal");
fontInfo.addFontProperties("F3", "sans-serif", "normal",
"bold");
fontInfo.addFontProperties("F4", "sans-serif", "oblique",
"bold");
fontInfo.addFontProperties("F4", "sans-serif", "italic",
"bold");
fontInfo.addFontProperties("F5", "serif", "normal", "normal");
fontInfo.addFontProperties("F6", "serif", "oblique",
"normal");
fontInfo.addFontProperties("F6", "serif", "italic", "normal");
fontInfo.addFontProperties("F7", "serif", "normal", "bold");
fontInfo.addFontProperties("F8", "serif", "oblique", "bold");
fontInfo.addFontProperties("F8", "serif", "italic", "bold");
fontInfo.addFontProperties("F9", "monospace", "normal",
"normal");
fontInfo.addFontProperties("F10", "monospace", "oblique",
"normal");
fontInfo.addFontProperties("F10", "monospace", "italic",
"normal");
fontInfo.addFontProperties("F11", "monospace", "normal",
"bold");
fontInfo.addFontProperties("F12", "monospace", "oblique",
"bold");
fontInfo.addFontProperties("F12", "monospace", "italic",
"bold");
fontInfo.addFontProperties("F1", "Helvetica", "normal",
"normal");
fontInfo.addFontProperties("F2", "Helvetica", "oblique",
"normal");
fontInfo.addFontProperties("F2", "Helvetica", "italic",
"normal");
fontInfo.addFontProperties("F3", "Helvetica", "normal",
"bold");
fontInfo.addFontProperties("F4", "Helvetica", "oblique",
"bold");
fontInfo.addFontProperties("F4", "Helvetica", "italic",
"bold");
fontInfo.addFontProperties("F5", "Times", "normal", "normal");
fontInfo.addFontProperties("F6", "Times", "oblique",
"normal");
fontInfo.addFontProperties("F6", "Times", "italic", "normal");
fontInfo.addFontProperties("F7", "Times", "normal", "bold");
fontInfo.addFontProperties("F8", "Times", "oblique", "bold");
fontInfo.addFontProperties("F8", "Times", "italic", "bold");
fontInfo.addFontProperties("F9", "Courier", "normal",
"normal");
fontInfo.addFontProperties("F10", "Courier", "oblique",
"normal");
fontInfo.addFontProperties("F10", "Courier", "italic",
"normal");
fontInfo.addFontProperties("F11", "Courier", "normal",
"bold");
fontInfo.addFontProperties("F12", "Courier", "oblique",
"bold");
fontInfo.addFontProperties("F12", "Courier", "italic",
"bold");
fontInfo.addFontProperties("F13", "Symbol", "normal",
"normal");
fontInfo.addFontProperties("F14", "ZapfDingbats", "normal",
"normal");
MessageHandler.logln("setting up fonts");
fontInfo.addMetrics("F1", new Helvetica());
fontInfo.addMetrics("F2", new HelveticaOblique());
fontInfo.addMetrics("F3", new HelveticaBold());
fontInfo.addMetrics("F4", new HelveticaBoldOblique());
fontInfo.addMetrics("F5", new TimesRoman());
fontInfo.addMetrics("F6", new TimesItalic());
fontInfo.addMetrics("F7", new TimesBold());
fontInfo.addMetrics("F8", new TimesBoldItalic());
fontInfo.addMetrics("F9", new Courier());
fontInfo.addMetrics("F10", new CourierOblique());
fontInfo.addMetrics("F11", new CourierBold());
fontInfo.addMetrics("F12", new CourierBoldOblique());
fontInfo.addMetrics("F13", new Symbol());
fontInfo.addMetrics("F14", new ZapfDingbats());
fontInfo.addMetrics("F15", new URWPalladioLRoma());
// fontInfo.addMetrics("F15", new OMEP());
// fontInfo.addMetrics("F16", new GaramondLightCondensed());
// fontInfo.addMetrics("F17", new BauerBodoniBoldItalic());

/* for compatibility with PassiveTex */
fontInfo.addFontProperties("F5", "Times-Roman", "normal",
"normal");
fontInfo.addFontProperties("F6", "Times-Roman", "oblique",
"normal");
fontInfo.addFontProperties("F6", "Times-Roman", "italic",
"normal");
fontInfo.addFontProperties("F7", "Times-Roman", "normal",
"bold");
fontInfo.addFontProperties("F8", "Times-Roman", "oblique",
"bold");
fontInfo.addFontProperties("F8", "Times-Roman", "italic",
"bold");
fontInfo.addFontProperties("F5", "Times Roman", "normal",
"normal");
fontInfo.addFontProperties("F6", "Times Roman", "oblique",
"normal");
fontInfo.addFontProperties("F6", "Times Roman", "italic",
"normal");
fontInfo.addFontProperties("F7", "Times Roman", "normal",
"bold");
fontInfo.addFontProperties("F8", "Times Roman", "oblique",
"bold");
fontInfo.addFontProperties("F8", "Times Roman", "italic",
"bold");
fontInfo.addFontProperties("F9", "Computer-Modern-Typewriter",
"normal", "normal");
/* any is treated as serif */
fontInfo.addFontProperties("F5", "any", "normal", "normal");
fontInfo.addFontProperties("F6", "any", "italic", "normal");
fontInfo.addFontProperties("F6", "any", "oblique", "normal");
fontInfo.addFontProperties("F7", "any", "normal", "bold");
fontInfo.addFontProperties("F8", "any", "italic", "bold");
fontInfo.addFontProperties("F8", "any", "oblique", "bold");

fontInfo.addFontProperties("F1", "sans-serif", "normal",
"normal");
fontInfo.addFontProperties("F2", "sans-serif", "oblique",
"normal");
fontInfo.addFontProperties("F2", "sans-serif", "italic",
"normal");
fontInfo.addFontProperties("F3", "sans-serif", "normal",
"bold");
fontInfo.addFontProperties("F4", "sans-serif", "oblique",
"bold");
fontInfo.addFontProperties("F4", "sans-serif", "italic",
"bold");
fontInfo.addFontProperties("F5", "serif", "normal", "normal");
fontInfo.addFontProperties("F6", "serif", "oblique",
"normal");
fontInfo.addFontProperties("F6", "serif", "italic", "normal");
fontInfo.addFontProperties("F7", "serif", "normal", "bold");
fontInfo.addFontProperties("F8", "serif", "oblique", "bold");
fontInfo.addFontProperties("F8", "serif", "italic", "bold");
fontInfo.addFontProperties("F9", "monospace", "normal",
"normal");
fontInfo.addFontProperties("F10", "monospace", "oblique",
"normal");
fontInfo.addFontProperties("F10", "monospace", "italic",
"normal");
fontInfo.addFontProperties("F11", "monospace", "normal",
"bold");
fontInfo.addFontProperties("F12", "monospace", "oblique",
"bold");
fontInfo.addFontProperties("F12", "monospace", "italic",
"bold");

fontInfo.addFontProperties("F1", "Helvetica", "normal",
"normal");
fontInfo.addFontProperties("F2", "Helvetica", "oblique",
"normal");
fontInfo.addFontProperties("F2", "Helvetica", "italic",
"normal");
fontInfo.addFontProperties("F3", "Helvetica", "normal",
"bold");
fontInfo.addFontProperties("F4", "Helvetica", "oblique",
"bold");
fontInfo.addFontProperties("F4", "Helvetica", "italic",
"bold");
fontInfo.addFontProperties("F5", "Times", "normal", "normal");
fontInfo.addFontProperties("F6", "Times", "oblique",
"normal");
fontInfo.addFontProperties("F6", "Times", "italic", "normal");
fontInfo.addFontProperties("F7", "Times", "normal", "bold");
fontInfo.addFontProperties("F8", "Times", "oblique", "bold");
fontInfo.addFontProperties("F8", "Times", "italic", "bold");
fontInfo.addFontProperties("F9", "Courier", "normal",
"normal");
fontInfo.addFontProperties("F10", "Courier", "oblique",
"normal");
fontInfo.addFontProperties("F10", "Courier", "italic",
"normal");
fontInfo.addFontProperties("F11", "Courier", "normal",
"bold");
fontInfo.addFontProperties("F12", "Courier", "oblique",
"bold");
fontInfo.addFontProperties("F12", "Courier", "italic",
"bold");
fontInfo.addFontProperties("F13", "Symbol", "normal",
"normal");
fontInfo.addFontProperties("F14", "ZapfDingbats", "normal",
"normal");

fontInfo.addFontProperties("F15", "URWPalladioLRoma", "normal", "normal");
//Custom type 1 fonts
// fontInfo.addFontProperties("F15", "OMEP", "normal", "normal");
// fontInfo.addFontProperties("F16", "Garamond-LightCondensed", "normal", "normal");
// fontInfo.addFontProperties("F17", "BauerBodoni", "italic", "bold");

/* for compatibility with PassiveTex */
fontInfo.addFontProperties("F5", "Times-Roman", "normal",
"normal");
fontInfo.addFontProperties("F6", "Times-Roman", "oblique",
"normal");
fontInfo.addFontProperties("F6", "Times-Roman", "italic",
"normal");
fontInfo.addFontProperties("F7", "Times-Roman", "normal",
"bold");
fontInfo.addFontProperties("F8", "Times-Roman", "oblique",
"bold");
fontInfo.addFontProperties("F8", "Times-Roman", "italic",
"bold");
fontInfo.addFontProperties("F5", "Times Roman", "normal",
"normal");
fontInfo.addFontProperties("F6", "Times Roman", "oblique",
"normal");
fontInfo.addFontProperties("F6", "Times Roman", "italic",
"normal");
fontInfo.addFontProperties("F7", "Times Roman", "normal",
"bold");
fontInfo.addFontProperties("F8", "Times Roman", "oblique",
"bold");
fontInfo.addFontProperties("F8", "Times Roman", "italic",
"bold");
fontInfo.addFontProperties("F9", "Computer-Modern-Typewriter",
"normal", "normal");
}

/**
@@ -207,18 +218,23 @@ public class FontSetup {
* @param fontInfo font info object to get font information from
*/
public static void addToResources(PDFDocument doc, FontInfo fontInfo) {
Hashtable fonts = fontInfo.getFonts();
Enumeration e = fonts.keys();
PDFResources resources = doc.getResources();
while (e.hasMoreElements()) {
String f = (String) e.nextElement();
resources.addFont(doc.makeFont(f,
((Font)
fonts.get(f)).fontName(),
((Font)
fonts.get(f)).encoding()
)
);
}
Hashtable fonts = fontInfo.getFonts();
Enumeration e = fonts.keys();
PDFResources resources = doc.getResources();
while (e.hasMoreElements()) {
String f = (String) e.nextElement();
Font font = (Font)fonts.get(f);
FontDescriptor desc = null;
if (font instanceof FontDescriptor) {
desc = (FontDescriptor)font;
}
resources.addFont(doc.makeFont(f,
font.fontName(),
font.encoding(),
font,
desc
)
);
}
}
}

Notiek ielāde…
Atcelt
Saglabāt