123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- /*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- /* $Id$ */
-
- package org.apache.fop.tools.fontlist;
-
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.io.PrintStream;
- import java.net.URL;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.SortedMap;
-
- import javax.xml.transform.Transformer;
- import javax.xml.transform.TransformerConfigurationException;
- import javax.xml.transform.sax.SAXResult;
- import javax.xml.transform.sax.SAXTransformerFactory;
- import javax.xml.transform.sax.TransformerHandler;
- import javax.xml.transform.stream.StreamResult;
- import javax.xml.transform.stream.StreamSource;
-
- import org.xml.sax.ContentHandler;
- import org.xml.sax.SAXException;
-
- import org.apache.commons.io.FilenameUtils;
- import org.apache.commons.io.IOUtils;
-
- import org.apache.fop.Version;
- import org.apache.fop.apps.FOPException;
- import org.apache.fop.apps.Fop;
- import org.apache.fop.apps.FopFactory;
- import org.apache.fop.apps.MimeConstants;
- import org.apache.fop.fonts.FontEventListener;
- import org.apache.fop.fonts.FontTriplet;
- import org.apache.fop.util.GenerationHelperContentHandler;
-
- /**
- * Command-line application to list available fonts and to optionally produce sample pages
- * with those fonts.
- */
- public final class FontListMain {
-
- private static final int GENERATE_CONSOLE = 0;
- private static final int GENERATE_XML = 1;
- private static final int GENERATE_FO = 2;
- private static final int GENERATE_RENDERED = 3;
-
- private FopFactory fopFactory = FopFactory.newInstance();
-
- private File configFile;
- private File outputFile;
- private String configMime = MimeConstants.MIME_PDF;
- private String outputMime;
- private int mode = GENERATE_CONSOLE;
- private String singleFamilyFilter;
-
- private FontListMain() throws SAXException, IOException {
- }
-
- private void prepare() throws SAXException, IOException {
- if (this.configFile != null) {
- fopFactory.setUserConfig(this.configFile);
- }
- }
-
- private ContentHandler getFOPContentHandler(OutputStream out) throws FOPException {
- Fop fop = fopFactory.newFop(this.outputMime, out);
- return fop.getDefaultHandler();
- }
-
- private void generateXML(SortedMap fontFamilies, File outFile, String singleFamily)
- throws TransformerConfigurationException, SAXException, IOException {
- SAXTransformerFactory tFactory = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
- TransformerHandler handler;
- if (this.mode == GENERATE_XML) {
- handler = tFactory.newTransformerHandler();
- } else {
- URL url = getClass().getResource("fonts2fo.xsl");
- if (url == null) {
- throw new FileNotFoundException("Did not find resource: fonts2fo.xsl");
- }
- handler = tFactory.newTransformerHandler(new StreamSource(url.toExternalForm()));
- }
-
- if (singleFamily != null) {
- Transformer transformer = handler.getTransformer();
- transformer.setParameter("single-family", singleFamily);
- }
-
- OutputStream out = new java.io.FileOutputStream(outFile);
- out = new java.io.BufferedOutputStream(out);
- if (this.mode == GENERATE_RENDERED) {
- handler.setResult(new SAXResult(getFOPContentHandler(out)));
- } else {
- handler.setResult(new StreamResult(out));
- }
- try {
- GenerationHelperContentHandler helper = new GenerationHelperContentHandler(
- handler, null);
- FontListSerializer serializer = new FontListSerializer();
- serializer.generateSAX(fontFamilies, singleFamily, helper);
- } finally {
- IOUtils.closeQuietly(out);
- }
- }
-
- private void generate() throws Exception {
- prepare();
-
- FontEventListener listener = new FontEventListener() {
-
- public void fontLoadingErrorAtAutoDetection(Object source,
- String fontURL, Exception e) {
- System.err.println("Could not load " + fontURL
- + " (" + e.getLocalizedMessage() + ")");
- }
-
- public void fontSubstituted(Object source,
- FontTriplet requested, FontTriplet effective) {
- //ignore
- }
-
- public void glyphNotAvailable(Object source, char ch, String fontName) {
- //ignore
- }
-
- public void fontDirectoryNotFound(Object source, String msg) {
- //ignore
- }
-
- };
-
- FontListGenerator listGenerator = new FontListGenerator();
- SortedMap fontFamilies = listGenerator.listFonts(fopFactory, configMime, listener);
-
- if (this.mode == GENERATE_CONSOLE) {
- writeToConsole(fontFamilies);
- } else {
- writeOutput(fontFamilies);
- }
- }
-
- private void writeToConsole(SortedMap fontFamilies)
- throws TransformerConfigurationException, SAXException, IOException {
- Iterator iter = fontFamilies.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry entry = (Map.Entry)iter.next();
- String firstFamilyName = (String)entry.getKey();
- System.out.println(firstFamilyName + ":");
- List list = (List)entry.getValue();
- Iterator fonts = list.iterator();
- while (fonts.hasNext()) {
- FontSpec f = (FontSpec)fonts.next();
- System.out.println(" " + f.getKey() + " " + f.getFamilyNames());
- Iterator triplets = f.getTriplets().iterator();
- while (triplets.hasNext()) {
- FontTriplet triplet = (FontTriplet)triplets.next();
- System.out.println(" " + triplet.toString());
- }
- }
- }
- }
-
- private void writeOutput(SortedMap fontFamilies)
- throws TransformerConfigurationException, SAXException, IOException {
- if (this.outputFile.isDirectory()) {
- System.out.println("Creating one file for each family...");
- Iterator iter = fontFamilies.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry entry = (Map.Entry)iter.next();
- String familyName = (String)entry.getKey();
- System.out.println("Creating output file for " + familyName + "...");
- String filename;
- switch(this.mode) {
- case GENERATE_RENDERED:
- filename = familyName + ".pdf";
- break;
- case GENERATE_FO:
- filename = familyName + ".fo";
- break;
- case GENERATE_XML:
- filename = familyName + ".xml";
- break;
- default:
- throw new IllegalStateException("Unsupported mode");
- }
- File outFile = new File(this.outputFile, filename);
- generateXML(fontFamilies, outFile, familyName);
- }
- } else {
- System.out.println("Creating output file...");
- generateXML(fontFamilies, this.outputFile, this.singleFamilyFilter);
- }
- System.out.println(this.outputFile + " written.");
- }
-
- private static void printVersion() {
- System.out.println("Apache FOP " + Version.getVersion()
- + " - http://xmlgraphics.apache.org/fop/\n");
- }
-
- private static void printHelp() {
- printVersion();
-
- String className = FontListMain.class.getName();
- PrintStream out = System.out;
- out.println("USAGE");
- out.println(" java [vmargs] " + className
- + " [-c <config-file>] [-f <mime>] [[output-dir|output-file] [font-family]]");
- out.println();
- out.println("PARAMETERS");
- out.println(" config-file: an optional FOP configuration file");
- out.println(" mime: The MIME type of the output format for which to");
- out.println(" create the font list (defaults to application/pdf)");
- out.println(" output-dir: Creates one sample PDF per font-family");
- out.println(" output-file: writes the list as file (valid file extensions: xml, fo, pdf)");
- out.println(" font-family: filters to a single font family");
- out.println();
- out.println("EXAMPLE");
- out.println(" java [vmargs] " + className
- + " -c userconfig.xml all-fonts.pdf");
- out.println(" --> this generates a single PDF containing a sample");
- out.println(" of all configured fonts.");
- out.println(" java [vmargs] " + className
- + " -c userconfig.xml");
- out.println(" --> this prints all configured fonts to the console.");
- out.println();
- }
-
- private void parseArguments(String[] args) {
- if (args.length > 0) {
- int idx = 0;
- if ("--help".equals(args[idx]) || "-?".equals(args[idx]) || "-h".equals(args[idx])) {
- printHelp();
- System.exit(0);
- }
- if (idx < args.length - 1 && "-c".equals(args[idx])) {
- String filename = args[idx + 1];
- this.configFile = new File(filename);
- idx += 2;
- }
- if (idx < args.length - 1 && "-f".equals(args[idx])) {
- this.configMime = args[idx + 1];
- idx += 2;
- }
- if (idx < args.length) {
- String name = args[idx];
- this.outputFile = new File(name);
- if (this.outputFile.isDirectory()) {
- this.mode = GENERATE_RENDERED;
- this.outputMime = MimeConstants.MIME_PDF;
- } else if (FilenameUtils.getExtension(name).equalsIgnoreCase("pdf")) {
- this.mode = GENERATE_RENDERED;
- this.outputMime = MimeConstants.MIME_PDF;
- } else if (FilenameUtils.getExtension(name).equalsIgnoreCase("fo")) {
- this.mode = GENERATE_FO;
- } else if (FilenameUtils.getExtension(name).equalsIgnoreCase("xml")) {
- this.mode = GENERATE_XML;
- } else {
- throw new IllegalArgumentException(
- "Operating mode for the output file cannot be determined"
- + " or is unsupported: " + name);
- }
- idx++;
- }
- if (idx < args.length) {
- this.singleFamilyFilter = args[idx];
- }
- } else {
- System.out.println("use --help or -? for usage information.");
- }
- }
-
- /**
- * The command-line interface.
- * @param args the command-line arguments
- */
- public static void main(String[] args) {
- try {
- FontListMain app = new FontListMain();
- app.parseArguments(args);
- app.generate();
- } catch (Throwable t) {
- printHelp();
- t.printStackTrace();
- System.exit(-1);
- }
- }
-
- }
|