<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F2D_Graphics_GUI%2FPDF_PostScript</id>
		<title>Java/2D Graphics GUI/PDF PostScript - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F2D_Graphics_GUI%2FPDF_PostScript"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/PDF_PostScript&amp;action=history"/>
		<updated>2026-04-21T12:45:21Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/PDF_PostScript&amp;diff=8181&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/PDF_PostScript&amp;diff=8181&amp;oldid=prev"/>
				<updated>2010-06-01T06:56:05Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:56, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/PDF_PostScript&amp;diff=8180&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/PDF_PostScript&amp;diff=8180&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:46Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Output to PDF file ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
import java.io.*;&lt;br /&gt;
import java.text.*;&lt;br /&gt;
import java.util.*;&lt;br /&gt;
&lt;br /&gt;
/** A simple text test of SPDF package&lt;br /&gt;
 */&lt;br /&gt;
public class PDFDemo {&lt;br /&gt;
  public static void main(String[] argv) throws IOException {&lt;br /&gt;
    PrintWriter pout;&lt;br /&gt;
    if (argv.length == 0) {&lt;br /&gt;
      pout = new PrintWriter(System.out);&lt;br /&gt;
    } else {&lt;br /&gt;
      if (new File(argv[0]).exists()) {&lt;br /&gt;
        throw new IOException(&lt;br /&gt;
        &amp;quot;Output file &amp;quot; + argv[0] + &amp;quot; already exists&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      pout = new PrintWriter(new FileWriter(argv[0]));&lt;br /&gt;
    }&lt;br /&gt;
    PDF p = new PDF(pout);&lt;br /&gt;
    Page p1 = new Page(p);&lt;br /&gt;
    p1.add(new MoveTo(p, 100, 600));&lt;br /&gt;
    p1.add(new Text(p, &amp;quot;Hello world, live on the web.&amp;quot;));&lt;br /&gt;
    p1.add(new Text(p, &amp;quot;Hello world, line 2 on the web.&amp;quot;));&lt;br /&gt;
    p.add(p1);&lt;br /&gt;
    p.setAuthor(&amp;quot;Ian F. Darwin&amp;quot;);&lt;br /&gt;
    p.writePDF();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/** The main class for the Darwin Open Systems&lt;br /&gt;
 * {Simple,Stupid,Simplistic} PDF API.&lt;br /&gt;
 * PDF is Adobe&amp;quot;s Portable Document Format, and is probably a trademark&lt;br /&gt;
 * of Adobe Systems Inc, Mountain View, California.&lt;br /&gt;
 * The Adobe PDF Specification which they publish grants everyone&lt;br /&gt;
 * permission to write code to generate and/or process PDF files.&lt;br /&gt;
 * A PDF Object represents one PDF file.&lt;br /&gt;
 * @author Ian F. Darwin, http://www.darwinsys.ru/&lt;br /&gt;
 * @version $Id: PDF.java,v 1.6 2004/02/09 03:34:02 ian Exp $&lt;br /&gt;
 */&lt;br /&gt;
class PDF {&lt;br /&gt;
  /** The output writer */&lt;br /&gt;
  protected PrintWriter out;&lt;br /&gt;
  /** The list of pages */&lt;br /&gt;
  protected ArrayList pages;&lt;br /&gt;
  /** The list of object xrefs */&lt;br /&gt;
  protected ArrayList xrefs;&lt;br /&gt;
  /** The root object */&lt;br /&gt;
  PDFObject rootObj = new RootObject(this);&lt;br /&gt;
  /** The Info object */&lt;br /&gt;
  InfoObject infoObj = new InfoObject(this);&lt;br /&gt;
  /** The outlines (outline font) object */&lt;br /&gt;
  OutlinesObject outlinesObj = new OutlinesObject(this);&lt;br /&gt;
  /** The Pages object */&lt;br /&gt;
  PagesObject pagesObj = new PagesObject(this);&lt;br /&gt;
  /** The Font Dictionary */&lt;br /&gt;
  FontDict fontDict = new FontDict(this);&lt;br /&gt;
  /** The object number of the current object */&lt;br /&gt;
  protected int currObj = 1;&lt;br /&gt;
  /** A flag to avoid writing twice */&lt;br /&gt;
  protected boolean startedWriting = false;&lt;br /&gt;
  /** A magic number that identifies the output as a PDF file */&lt;br /&gt;
  protected final static String PDF_MAGIC = &amp;quot;%PDF-1.0&amp;quot;;&lt;br /&gt;
  /** Constructor */&lt;br /&gt;
  public PDF(PrintWriter o) {&lt;br /&gt;
    out = o;&lt;br /&gt;
    pages = new ArrayList();&lt;br /&gt;
    xrefs = new ArrayList();&lt;br /&gt;
  }&lt;br /&gt;
  public void add(Page p) {&lt;br /&gt;
    pages.add(p);&lt;br /&gt;
  }&lt;br /&gt;
  public void insertPage(int where, Page p) {&lt;br /&gt;
    pages.add(where, p);&lt;br /&gt;
  }&lt;br /&gt;
  // OUTPUT METHODS -- we provide our own print/println, so we&lt;br /&gt;
  // can keep track of file offsets (it was either that, or kludgily&lt;br /&gt;
  // use a RandomAccessFile and the getFilePointer() method).&lt;br /&gt;
  long offset = 0;&lt;br /&gt;
  /** Print a String */&lt;br /&gt;
  protected void print(String s){&lt;br /&gt;
    out.print(s);&lt;br /&gt;
    offset += s.length();&lt;br /&gt;
  }&lt;br /&gt;
  /** Println a String */&lt;br /&gt;
  protected void println(String s) {&lt;br /&gt;
    print(s);&lt;br /&gt;
    print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  /** Print an Object */&lt;br /&gt;
  protected void print(Object o) {&lt;br /&gt;
    print(o.toString());&lt;br /&gt;
  }&lt;br /&gt;
  /** Println an Object */&lt;br /&gt;
  protected void println(Object o) {&lt;br /&gt;
    println(o.toString());&lt;br /&gt;
  }&lt;br /&gt;
  /** Print an int */&lt;br /&gt;
  protected void print(int i) {&lt;br /&gt;
    String s = Integer.toString(i);&lt;br /&gt;
    print(s);&lt;br /&gt;
  }&lt;br /&gt;
  /** Println an int */&lt;br /&gt;
  protected void println(int i) {&lt;br /&gt;
    String s = Integer.toString(i);&lt;br /&gt;
    print(s);&lt;br /&gt;
  }&lt;br /&gt;
  /** Println with no args */&lt;br /&gt;
  protected void println() {&lt;br /&gt;
    print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // END OF OUTPUT METHODS &lt;br /&gt;
  /** Add an entry into the offset table */&lt;br /&gt;
  protected void addXref() {&lt;br /&gt;
    xrefs.add(new Long(offset));&lt;br /&gt;
  }&lt;br /&gt;
  /** Write the entire output */&lt;br /&gt;
  public void writePDF() {&lt;br /&gt;
    if (startedWriting) {&lt;br /&gt;
      throw new IllegalStateException(&lt;br /&gt;
        &amp;quot;writePDF() can only be called once.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    startedWriting = true;&lt;br /&gt;
    writePDFHeader();&lt;br /&gt;
    writePDFbody();&lt;br /&gt;
    writeXrefs();&lt;br /&gt;
    writePDFTrailer();&lt;br /&gt;
    out.flush();&lt;br /&gt;
    out.close();&lt;br /&gt;
  }&lt;br /&gt;
  protected void writePDFHeader() {&lt;br /&gt;
    println(PDF_MAGIC);&lt;br /&gt;
    rootObj.print();  // 1&lt;br /&gt;
    infoObj.print();  // 2&lt;br /&gt;
    outlinesObj.print(); // 3&lt;br /&gt;
    pagesObj.print();  // 4&lt;br /&gt;
  }&lt;br /&gt;
  protected void writePDFbody() {&lt;br /&gt;
    for (int i=0; i&amp;lt;pages.size(); i++) {&lt;br /&gt;
       ((Page)pages.get(i)).print();    // 5, 6&lt;br /&gt;
    }&lt;br /&gt;
    addXref();&lt;br /&gt;
    print(currObj++); println(&amp;quot; 0 obj&amp;quot;);&lt;br /&gt;
    println(&amp;quot;[/PDF /Text]&amp;quot;);&lt;br /&gt;
    println(&amp;quot;endobj&amp;quot;);&lt;br /&gt;
    fontDict.print();    // 8&lt;br /&gt;
  }&lt;br /&gt;
  DecimalFormat nf10 = new DecimalFormat(&amp;quot;0000000000&amp;quot;);&lt;br /&gt;
  DecimalFormat nf5 = new DecimalFormat(&amp;quot;00000&amp;quot;);&lt;br /&gt;
  /** Write one Xref, in the format 0000000000 65535 f */&lt;br /&gt;
  protected void printXref(long n, int where, char inUse) {&lt;br /&gt;
    println(nf10.format(n) + &amp;quot; &amp;quot; +  nf5.format(where) + &amp;quot; &amp;quot; + inUse);&lt;br /&gt;
  }&lt;br /&gt;
  long xrefStart;&lt;br /&gt;
  /** Write all the xrefs, using the format above */&lt;br /&gt;
  protected void writeXrefs() {&lt;br /&gt;
    xrefStart = offset;&lt;br /&gt;
    println(&amp;quot;xref&amp;quot;);&lt;br /&gt;
    print(0);&lt;br /&gt;
    print(&amp;quot; &amp;quot;);&lt;br /&gt;
    print(xrefs.size() + 1);&lt;br /&gt;
    println();&lt;br /&gt;
    // &amp;quot;fake&amp;quot; entry at 0, always 0, -1, f(free).&lt;br /&gt;
    printXref(0, 65535, &amp;quot;f&amp;quot;);&lt;br /&gt;
    // Remaining xref entries are for real objects.&lt;br /&gt;
    for (int i=0; i&amp;lt;xrefs.size(); i++) {&lt;br /&gt;
      Long lo = (Long)xrefs.get(i);&lt;br /&gt;
      long l = lo.longValue();&lt;br /&gt;
      printXref(l, 0, &amp;quot;n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  protected void writePDFTrailer() {&lt;br /&gt;
    println(&amp;quot;trailer&amp;quot;);&lt;br /&gt;
    println(&amp;quot;&amp;lt;&amp;lt;&amp;quot;);&lt;br /&gt;
    println(&amp;quot;/Size &amp;quot; + (xrefs.size() + 1));&lt;br /&gt;
    println(&amp;quot;/Root 1 0 R&amp;quot;);&lt;br /&gt;
    println(&amp;quot;/Info 2 0 R&amp;quot;);&lt;br /&gt;
    println(&amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    println(&amp;quot;% startxref&amp;quot;);&lt;br /&gt;
    println(&amp;quot;% &amp;quot; + xrefStart);&lt;br /&gt;
    println(&amp;quot;%%EOF&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  class RootObject extends PDFDict {&lt;br /&gt;
    protected RootObject(PDF m) {&lt;br /&gt;
      super(m);&lt;br /&gt;
      dict.put(&amp;quot;Type&amp;quot;, &amp;quot;/Catalog&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Outlines&amp;quot;, &amp;quot;3 0 R&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Pages&amp;quot;, &amp;quot;4 0 R&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  class InfoObject extends PDFDict {&lt;br /&gt;
    protected InfoObject(PDF m) {&lt;br /&gt;
      super(m);&lt;br /&gt;
      dict.put(&amp;quot;Title&amp;quot;, &amp;quot;(Sample PDF by SPDF)&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Creator&amp;quot;, &amp;quot;(Darwin Open Systems SPDF Software)&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Created&amp;quot;, &amp;quot;(D:20000516010203)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void setAuthor(String au) {&lt;br /&gt;
    infoObj.dict.put(&amp;quot;Author&amp;quot;, &amp;quot;(&amp;quot; + au + &amp;quot;)&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  class OutlinesObject extends PDFDict {&lt;br /&gt;
    protected OutlinesObject(PDF m) {&lt;br /&gt;
      super(m);&lt;br /&gt;
      dict.put(&amp;quot;Type&amp;quot;, &amp;quot;/Outlines&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Count&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  class PagesObject extends PDFDict {&lt;br /&gt;
    protected PagesObject(PDF m) {&lt;br /&gt;
      super(m);&lt;br /&gt;
      dict.put(&amp;quot;Type&amp;quot;, &amp;quot;/Pages&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Count&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Kids&amp;quot;, &amp;quot;[5 0 R]&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  class FontDict extends PDFDict {&lt;br /&gt;
    protected FontDict(PDF m) {&lt;br /&gt;
      super(m);&lt;br /&gt;
      dict.put(&amp;quot;Type&amp;quot;, &amp;quot;/Font&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Subtype&amp;quot;, &amp;quot;/Type1&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Name&amp;quot;, &amp;quot;/F1&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;BaseFont&amp;quot;, &amp;quot;/Helvetica&amp;quot;);&lt;br /&gt;
      dict.put(&amp;quot;Encoding&amp;quot;, &amp;quot;/MacRomanEncoding&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/** A PDFDict ias a PDFObject that is all, or mostly, a Dictionary.&lt;br /&gt;
 * @author Ian Darwin, http://www.darwinsys.ru/&lt;br /&gt;
 */&lt;br /&gt;
abstract class PDFDict extends PDFObject {&lt;br /&gt;
  /** The Dictionary is a HashTable. Put the keys without a &lt;br /&gt;
   * leading slash, since they always have it. Values can&lt;br /&gt;
   * be /names, (strings), or whatever.&lt;br /&gt;
   */&lt;br /&gt;
  protected Hashtable dict;&lt;br /&gt;
  PDFDict(PDF m) {&lt;br /&gt;
    super(m);&lt;br /&gt;
    dict = new Hashtable();&lt;br /&gt;
  }&lt;br /&gt;
  /** Write the object to the Output Writer. The default implementation&lt;br /&gt;
   * of this method in PDFDict just calls startObj, printDict, and endObj.&lt;br /&gt;
   */&lt;br /&gt;
  protected void print() {&lt;br /&gt;
    startObj();&lt;br /&gt;
    printDict();&lt;br /&gt;
    endObj();&lt;br /&gt;
  }&lt;br /&gt;
  protected void startObj() {&lt;br /&gt;
    // Record the starting position of this Obj in the xref table&lt;br /&gt;
    master.addXref();&lt;br /&gt;
    // Print out e.g., &amp;quot;42 0 obj&amp;quot;&lt;br /&gt;
    master.print(master.currObj++);&lt;br /&gt;
     master.print(&amp;quot; 0 obj&amp;quot;);&lt;br /&gt;
    master.println();&lt;br /&gt;
  }&lt;br /&gt;
  protected void endObj() {&lt;br /&gt;
    master.println(&amp;quot;endobj&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  protected void printDict() {&lt;br /&gt;
    master.println(&amp;quot;&amp;lt;&amp;lt;&amp;quot;);&lt;br /&gt;
    Enumeration e = dict.keys();&lt;br /&gt;
    while (e.hasMoreElements()) {&lt;br /&gt;
      master.print(&amp;quot;\t/&amp;quot;);&lt;br /&gt;
      String key = (String)e.nextElement();&lt;br /&gt;
      master.print(key);&lt;br /&gt;
      master.print(&amp;quot; &amp;quot;);&lt;br /&gt;
      master.print(dict.get(key));&lt;br /&gt;
      master.println();&lt;br /&gt;
    }&lt;br /&gt;
    master.println(&amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/** Represent one Text object in a PDF file. */&lt;br /&gt;
class Text extends PDFObject {&lt;br /&gt;
  protected int x, y;&lt;br /&gt;
  protected String text;&lt;br /&gt;
  public Text(PDF m, String s) {&lt;br /&gt;
    super(m);&lt;br /&gt;
    text = s;&lt;br /&gt;
  }&lt;br /&gt;
  public void print() {&lt;br /&gt;
    throw new IllegalStateException(&amp;quot;print() called on a Text obj&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void print(StringBuffer sb) {&lt;br /&gt;
    sb.append(&amp;quot;0 -18 Td (&amp;quot;);&lt;br /&gt;
    sb.append(text);  // TODO must substitute escaped characters&lt;br /&gt;
    sb.append(&amp;quot;) Tj\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/** A PDFObject represents one node in the tree of a PDF file.&lt;br /&gt;
 * @author Ian Darwin, http://www.darwinsys.ru/&lt;br /&gt;
 */&lt;br /&gt;
abstract class PDFObject extends java.lang.Object {&lt;br /&gt;
  /** The containing PDF file */&lt;br /&gt;
  protected PDF master;&lt;br /&gt;
  PDFObject(PDF m) {&lt;br /&gt;
    master = m;&lt;br /&gt;
  }&lt;br /&gt;
  /** Write the object to the Output Writer */&lt;br /&gt;
  protected abstract void print();&lt;br /&gt;
  protected void startObj() {&lt;br /&gt;
    // Record the starting position of this Obj in the xref table&lt;br /&gt;
    master.addXref();&lt;br /&gt;
    // Print out e.g., &amp;quot;42 0 obj&amp;quot;&lt;br /&gt;
    master.print(master.currObj++);&lt;br /&gt;
     master.print(&amp;quot; 0 obj&amp;quot;);&lt;br /&gt;
    master.println();&lt;br /&gt;
  }&lt;br /&gt;
  protected void endObj() {&lt;br /&gt;
    master.println(&amp;quot;endobj&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/** Represent one Move object (&amp;quot;moveto&amp;quot;) in a PDF file. */&lt;br /&gt;
class MoveTo extends PDFObject {&lt;br /&gt;
  protected int x, y;&lt;br /&gt;
  public MoveTo(PDF m, int x, int y) {&lt;br /&gt;
    super(m);&lt;br /&gt;
    this.x = x;&lt;br /&gt;
    this.y = y;&lt;br /&gt;
  }&lt;br /&gt;
  public void print() {&lt;br /&gt;
    throw new IllegalStateException(&amp;quot;print() called on a Text obj&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void print(StringBuffer sb) {&lt;br /&gt;
    sb.append(x);&lt;br /&gt;
    sb.append(&amp;quot; &amp;quot;);&lt;br /&gt;
    sb.append(y);&lt;br /&gt;
    sb.append(&amp;quot; Td\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/** Represent one Page of a PDF file. */&lt;br /&gt;
class Page extends PDFDict {&lt;br /&gt;
  protected ArrayList objects = new ArrayList();&lt;br /&gt;
  public Page(PDF m) {&lt;br /&gt;
    super(m);&lt;br /&gt;
    dict.put(&amp;quot;Type&amp;quot;, &amp;quot;/Page&amp;quot;);&lt;br /&gt;
    dict.put(&amp;quot;Parent&amp;quot;, &amp;quot;4 0 R&amp;quot;);&lt;br /&gt;
    dict.put(&amp;quot;Resources&amp;quot;, &amp;quot;&amp;lt;&amp;lt; /Font &amp;lt;&amp;lt; /F1 8 0 R &amp;gt;&amp;gt; /ProcSet 7 0 R &amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    dict.put(&amp;quot;MediaBox&amp;quot;, &amp;quot;[0 0 612 792]&amp;quot;);&lt;br /&gt;
    dict.put(&amp;quot;Contents&amp;quot;, &amp;quot;6 0 R&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  public void add(PDFObject po) {&lt;br /&gt;
    objects.add(po);&lt;br /&gt;
  }&lt;br /&gt;
  /** Print all the objects on the page.&lt;br /&gt;
   * For now, just print all the Text objects, as one Stream.&lt;br /&gt;
   */&lt;br /&gt;
  protected void print() {&lt;br /&gt;
    // Print the Page object&lt;br /&gt;
    super.print();&lt;br /&gt;
    // Now do the Text objects as one PDF obj&lt;br /&gt;
    master.addXref();&lt;br /&gt;
    startObj();&lt;br /&gt;
    StringBuffer sb = new StringBuffer();&lt;br /&gt;
    sb.append(&amp;quot;BT\n&amp;quot;);&lt;br /&gt;
    sb.append(&amp;quot;/F1 12 Tf\n&amp;quot;);&lt;br /&gt;
    for (int i=0; i&amp;lt;objects.size(); i++) {&lt;br /&gt;
      PDFObject po = (PDFObject)objects.get(i);&lt;br /&gt;
      if (po instanceof Text)&lt;br /&gt;
        ((Text)po).print(sb);&lt;br /&gt;
      else if (po instanceof MoveTo)&lt;br /&gt;
        ((MoveTo)po).print(sb);&lt;br /&gt;
      // else if (po instanceof Font)&lt;br /&gt;
      //  ...&lt;br /&gt;
      else&lt;br /&gt;
        System.err.println(&amp;quot;PDFPage: ignoring &amp;quot; + po);&lt;br /&gt;
    }&lt;br /&gt;
    sb.append(&amp;quot;ET\n&amp;quot;);&lt;br /&gt;
    master.println(&amp;quot;&amp;lt;&amp;lt; /Length &amp;quot; + sb.length() + &amp;quot; &amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    master.println(&amp;quot;stream&amp;quot;);&lt;br /&gt;
    master.print(sb);&lt;br /&gt;
    master.println(&amp;quot;endstream&amp;quot;);&lt;br /&gt;
    endObj();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Text to Postscript ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
import java.io.*;&lt;br /&gt;
/** Text to PS */&lt;br /&gt;
public class PSFormatter {&lt;br /&gt;
  /** The current input source */&lt;br /&gt;
  protected BufferedReader br;&lt;br /&gt;
  /** The current page number */&lt;br /&gt;
  protected int pageNum;&lt;br /&gt;
  /** The current X and Y on the page */&lt;br /&gt;
  protected int curX, curY;&lt;br /&gt;
  /** The current line number on page */&lt;br /&gt;
  protected int lineNum;&lt;br /&gt;
  /** The current tab setting */&lt;br /&gt;
  protected int tabPos = 0;&lt;br /&gt;
  public static final int INCH = 72;  // PS constant: 72 pts/inch&lt;br /&gt;
  // Page parameters&lt;br /&gt;
  /** The left margin indent */&lt;br /&gt;
  protected int leftMargin = 50;&lt;br /&gt;
  /** The top of page indent */&lt;br /&gt;
  protected int topMargin = 750;&lt;br /&gt;
  /** The bottom of page indent */&lt;br /&gt;
  protected int botMargin = 50;&lt;br /&gt;
  // FORMATTING PARAMETERS&lt;br /&gt;
  protected int points = 12;&lt;br /&gt;
  protected int leading = 14;&lt;br /&gt;
  public static void main(String[] av) throws IOException {&lt;br /&gt;
    if (av.length == 0) &lt;br /&gt;
      new PSFormatter(&lt;br /&gt;
        new InputStreamReader(System.in)).process();&lt;br /&gt;
    else for (int i = 0; i &amp;lt; av.length; i++) {&lt;br /&gt;
      new PSFormatter(av[i]).process();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public PSFormatter(String fileName) throws IOException {&lt;br /&gt;
    br = new BufferedReader(new FileReader(fileName));&lt;br /&gt;
  }&lt;br /&gt;
  public PSFormatter(Reader in) throws IOException {&lt;br /&gt;
    if (in instanceof BufferedReader)&lt;br /&gt;
      br = (BufferedReader)in;&lt;br /&gt;
    else&lt;br /&gt;
      br = new BufferedReader(in);&lt;br /&gt;
  }&lt;br /&gt;
  /** Main processing of the current input source. */&lt;br /&gt;
  protected void process() throws IOException {&lt;br /&gt;
    String line;&lt;br /&gt;
    prologue();      // emit PostScript prologue, once.&lt;br /&gt;
    startPage();    // emit top-of-page (ending previous)&lt;br /&gt;
    while ((line = br.readLine()) != null) {&lt;br /&gt;
      if (line.startsWith(&amp;quot;\f&amp;quot;) || line.trim().equals(&amp;quot;.bp&amp;quot;)) {&lt;br /&gt;
        startPage();&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      doLine(line);&lt;br /&gt;
    }&lt;br /&gt;
    // finish last page, if not already done.&lt;br /&gt;
    if (lineNum != 0)&lt;br /&gt;
      println(&amp;quot;showpage&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  /** Handle start of page details. */&lt;br /&gt;
  protected void startPage() {&lt;br /&gt;
    if (pageNum++ &amp;gt; 0)&lt;br /&gt;
      println(&amp;quot;showpage&amp;quot;);&lt;br /&gt;
    lineNum = 0;&lt;br /&gt;
    moveTo(leftMargin, topMargin);&lt;br /&gt;
  }&lt;br /&gt;
  /** Process one line from the current input */&lt;br /&gt;
  protected void doLine(String line) {&lt;br /&gt;
    tabPos = 0;&lt;br /&gt;
    // count leading (not imbedded) tabs.&lt;br /&gt;
    for (int i=0; i&amp;lt;line.length(); i++) {&lt;br /&gt;
      if (line.charAt(i)==&amp;quot;\t&amp;quot;)&lt;br /&gt;
        tabPos++;&lt;br /&gt;
      else&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
    String l = line.trim(); // removes spaces AND tabs&lt;br /&gt;
    if (l.length() == 0) {&lt;br /&gt;
      ++lineNum;&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    moveTo(leftMargin + (tabPos * INCH),&lt;br /&gt;
      topMargin-(lineNum++ * leading));&lt;br /&gt;
    println(&amp;quot;(&amp;quot; + toPSString(l)+ &amp;quot;) show&amp;quot;);&lt;br /&gt;
    // If we just hit the bottom, start a new page&lt;br /&gt;
    if (curY &amp;lt;= botMargin)&lt;br /&gt;
      startPage();&lt;br /&gt;
  }&lt;br /&gt;
  /** Overly-simplistic conversion to PS, e.g., breaks on &amp;quot;foo\)bar&amp;quot; */&lt;br /&gt;
  protected String toPSString(String o) {&lt;br /&gt;
    StringBuffer sb = new StringBuffer();&lt;br /&gt;
    for (int i=0; i&amp;lt;o.length(); i++) {&lt;br /&gt;
      char c = o.charAt(i);&lt;br /&gt;
      switch(c) {&lt;br /&gt;
        case &amp;quot;(&amp;quot;:  sb.append(&amp;quot;\\(&amp;quot;); break;&lt;br /&gt;
        case &amp;quot;)&amp;quot;:  sb.append(&amp;quot;\\)&amp;quot;); break;&lt;br /&gt;
        default:  sb.append(c); break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return sb.toString();&lt;br /&gt;
  }&lt;br /&gt;
  protected void println(String s) {&lt;br /&gt;
    System.out.println(s);&lt;br /&gt;
  }&lt;br /&gt;
  protected void moveTo(int x, int y) {&lt;br /&gt;
    curX = x;&lt;br /&gt;
    curY = y;&lt;br /&gt;
    println(x + &amp;quot; &amp;quot; + y + &amp;quot; &amp;quot; + &amp;quot;moveto&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  void prologue() {&lt;br /&gt;
    println(&amp;quot;%!PS-Adobe&amp;quot;);&lt;br /&gt;
    println(&amp;quot;/Courier findfont &amp;quot; + points + &amp;quot; scalefont setfont &amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>