1

Hi all i have some code below that allows me to print the text i have already written into the app (mText) however instead of just having what is written in the program i want to be able to select a .txt file and print that out instead, how can i modify the code below in order to achieve this ?

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.text.*;
/**
 * The PrintText application expands on the
 * PrintExample application in that it images
 * text on to the single page printed.
 */
public class PrintText implements Printable {
    /**
     * The text to be printed.
     */
    private static final String mText = 
        "Four score and seven years ago our fathers brought forth on this "
        + "continent a new nation, conceived in liberty and dedicated to the "
        + "proposition that all men are created equal. Now we are engaged in "
        + "a great civil war, testing whether that nation or any nation so "
        + "conceived and so dedicated can long endure. We are met on a great "
        + "battlefield of that war. We have come to dedicate a portion of "
        + "that field as a final resting-place for those who here gave their "
        + "lives that that nation might live. It is altogether fitting and "
        + "proper that we should do this. But in a larger sense, we cannot "
        + "dedicate, we cannot consecrate, we cannot hallow this ground." 
        + "The brave men, living and dead who struggled here have consecrated "
        + "it far above our poor power to add or detract. The world will "
        + "little note nor long remember what we say here, but it can never "
        + "forget what they did here. It is for us the living rather to be "
        + "dedicated here to the unfinished work which they who fought here "
        + "have thus far so nobly advanced. It is rather for us to be here "
        + "dedicated to the great task remaining before us--that from these "
        + "honored dead we take increased devotion to that cause for which "
        + "they gave the last full measure of devotion--that we here highly "
        + "resolve that these dead shall not have died in vain, that this "
        + "nation under God shall have a new birth of freedom, and that "
        + "government of the people, by the people, for the people shall "
        + "not perish from the earth.";
    /**
     * Our text in a form for which we can obtain a
     * AttributedCharacterIterator.
     */
    private static final AttributedString mStyledText = new AttributedString(mText);
    /**
     * Print a single page containing some sample text.
     */
    static public void main(String args[]) {
        /* Get the representation of the current printer and 
         * the current print job.
         */
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        /* Build a book containing pairs of page painters (Printables)
         * and PageFormats. This example has a single page containing
         * text.
         */
        Book book = new Book();
        book.append(new PrintText(), new PageFormat());
        /* Set the object to be printed (the Book) into the PrinterJob.
         * Doing this before bringing up the print dialog allows the
         * print dialog to correctly display the page range to be printed
         * and to dissallow any print settings not appropriate for the
         * pages to be printed.
         */
        printerJob.setPageable(book);
        /* Show the print dialog to the user. This is an optional step
         * and need not be done if the application wants to perform
         * 'quiet' printing. If the user cancels the print dialog then false
         * is returned. If true is returned we go ahead and print.
         */
        boolean doPrint = printerJob.printDialog();
        if (doPrint) {
            try {
                printerJob.print();
            } catch (PrinterException exception) {
                System.err.println("Printing error: " + exception);
            }
        }
    }

    /**
     * Print a page of text.
     */
    public int print(Graphics g, PageFormat format, int pageIndex) {
        /* We'll assume that Jav2D is available.
         */
        Graphics2D g2d = (Graphics2D) g;
        /* Move the origin from the corner of the Paper to the corner
         * of the imageable area.
         */
        g2d.translate(format.getImageableX(), format.getImageableY());
        /* Set the text color.
         */
        g2d.setPaint(Color.black);
        /* Use a LineBreakMeasurer instance to break our text into
         * lines that fit the imageable area of the page.
         */
        Point2D.Float pen = new Point2D.Float();
        AttributedCharacterIterator charIterator = mStyledText.getIterator();
        LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
        float wrappingWidth = (float) format.getImageableWidth();
        while (measurer.getPosition() < charIterator.getEndIndex()) {
            TextLayout layout = measurer.nextLayout(wrappingWidth);
            pen.y += layout.getAscent();
            float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance());
            layout.draw(g2d, pen.x + dx, pen.y);
            pen.y += layout.getDescent() + layout.getLeading();
        }
        return Printable.PAGE_EXISTS;
    }
}

i have been having a few issues with other code to print out things but the code above is successfully working just fine for me, this is why i want to modify this

my filereader :

import java.io.*; 
class FileReaderDemo { 
    public static void main(String args[]) throws Exception { 
        FileReader fr = new FileReader("D:/Documents/testDocToPrintUsingJava.txt"); 
        BufferedReader br = new BufferedReader(fr); 
        String s; 
        while((s = br.readLine()) != null) { 
            System.out.println(s); 
        } 
        fr.close(); 
    } 
}

current code below, i am confused about what way to go with this code,

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.text.*;
import java.io.*; 
import javax.swing.*;
import static java.nio.file.StandardOpenOption.*;
import java.io.FileReader;
import java.io.FileWriter; 
import java.io.BufferedWriter; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.InputStream; 
import java.io.PrintWriter; 
import java.io.IOException;
import java.io.BufferedInputStream; 
import java.io.Console;
import java.util.Arrays;
import java.io.IOException;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.lang.System;
import java.lang.String;
import java.nio.file.Files; 
import java.nio.file.Paths;
import java.nio.file.FileSystemException;
import java.nio.file.InvalidPathException;
import java.nio.file.FileSystemNotFoundException;
import java.lang.IllegalArgumentException;
import java.lang.SecurityException;
import java.nio.channels.FileChannel;
import java.nio.channels.*;
import static java.nio.file.StandardOpenOption.*;
import java.lang.Enum;
import java.nio.charset.Charset;

/**
 * The PrintText application expands on the
 * PrintExample application in that it images
 * text on to the single page printed.
 */
public class PrintText implements Printable {
    //Create a file chooser
    //final JFileChooser fc = new JFileChooser();
    /**
     * The text to be printed.
     */
    private static final String mText = 
        "test";
    /**
     * Our text in a form for which we can obtain a
     * AttributedCharacterIterator.
     */

        public static void main(String[] args) {
            JFileChooser chooser = new JFileChooser();
            chooser.showOpenDialog(null);
            File file = chooser.getSelectedFile();
            String filename = file.getName();
            System.out.println("You have selected: " + filename);
        }


    public static String readFile(String file, String csName)
    throws IOException {
        Charset cs = Charset.forName(csName);
        return readFile(file, cs);
    }

    public static String readFile(String file, Charset cs)
    throws IOException {
        // No real need to close the BufferedReader/InputStreamReader
        // as they're only wrapping the stream
        FileInputStream stream = new FileInputStream(file);
        try {
            Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
            StringBuilder builder = new StringBuilder();
            char[] buffer = new char[8192];
            int read;
            while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                builder.append(buffer, 0, read);
            }
            return builder.toString();
        } finally {
            // Potential issue here: if this throws an IOException,
            // it will mask any others. Normally I'd use a utility
            // method which would log exceptions and swallow them
            stream.close();
        }        
    }

    private static final AttributedString mStyledText = new AttributedString(mText);
    /**
     * Print a single page containing some sample text.
     */
    static public void main(String args[]) {
        /* Get the representation of the current printer and 
         * the current print job.
         */
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        /* Build a book containing pairs of page painters (Printables)
         * and PageFormats. This example has a single page containing
         * text.
         */
        Book book = new Book();
        book.append(new PrintText(), new PageFormat());
        /* Set the object to be printed (the Book) into the PrinterJob.
         * Doing this before bringing up the print dialog allows the
         * print dialog to correctly display the page range to be printed
         * and to dissallow any print settings not appropriate for the
         * pages to be printed.
         */
        printerJob.setPageable(book);
        /* Show the print dialog to the user. This is an optional step
         * and need not be done if the application wants to perform
         * 'quiet' printing. If the user cancels the print dialog then false
         * is returned. If true is returned we go ahead and print.
         */
        boolean doPrint = printerJob.printDialog();
        if (doPrint) {
            try {
                printerJob.print();
            } catch (PrinterException exception) {
                System.err.println("Printing error: " + exception);
            }
        }
    }

    /**
     * Print a page of text.
     */
    public int print(Graphics g, PageFormat format, int pageIndex) {
        /* We'll assume that Jav2D is available.
         */
        Graphics2D g2d = (Graphics2D) g;
        /* Move the origin from the corner of the Paper to the corner
         * of the imageable area.
         */
        g2d.translate(format.getImageableX(), format.getImageableY());
        /* Set the text color.
         */
        g2d.setPaint(Color.black);
        /* Use a LineBreakMeasurer instance to break our text into
         * lines that fit the imageable area of the page.
         */
        Point2D.Float pen = new Point2D.Float();
        AttributedCharacterIterator charIterator = mStyledText.getIterator();
        LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
        float wrappingWidth = (float) format.getImageableWidth();
        while (measurer.getPosition() < charIterator.getEndIndex()) {
            TextLayout layout = measurer.nextLayout(wrappingWidth);
            pen.y += layout.getAscent();
            float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance());
            layout.draw(g2d, pen.x + dx, pen.y);
            pen.y += layout.getDescent() + layout.getLeading();
        }
        return Printable.PAGE_EXISTS;
    }
}
user1892955
  • 77
  • 1
  • 4
  • 9
  • thank you i have created a quick class using file reader, i have added it above, how would i now use this to print it out ?, – user1892955 Dec 21 '12 at 23:01
  • @user1892955 Look at these two link and modify your code [Select File Location](http://www.roseindia.net/tutorial/java/core/files/filebrowse.html) and [Read File](http://www.roseindia.net/java/beginners/java-read-file-line-by-line.shtml) – Smit Dec 21 '12 at 23:02
  • thank you that is exactly what i am looking for, i am very new to this so hopefully i can do it right – user1892955 Dec 21 '12 at 23:06
  • i am trying to use the filechoser to chose the needed file but can not really understand what it is doing any advice ? – user1892955 Dec 21 '12 at 23:13
  • 1
    @user1892955 Please state your question briefly and some code where you are getting problems. – Smit Dec 21 '12 at 23:17
  • Basically how do i use the read file and select file location to be able to print out the contents, above is the code, it is very messy atm as i am just confused on what needs doing, sorry about this this is one of my first java programs i have ever done – user1892955 Dec 21 '12 at 23:31
  • @user1892955 First of all don't just copy and paste code you gathered from here and there. Try to understand those link I gave you. Those are very basic programs on file. See what they do. You also need to learn some basics about `OOPs` and `Java`.[Link for Beginners tutorials](http://www.roseindia.net/java/beginners/). First grasp concepts and then try some of your own. I will also suggest not look for advanced stuff. Try some basic first then gradually move to advance stuff as you go confident. – Smit Dec 21 '12 at 23:40

1 Answers1

0

Copy the text into a file then take a look at these. Put one of these solutions into a function called readStringFromFile. Then, replace this line with:

private static final AttributedString mStyledText = new AttributedString( readStringFromFile( "c:\\myfile.txt" );

How do I create a Java string from the contents of a file?

Really though, it sounds like to learn the most that you should run through a File IO tutorial. You don't just want the answer right? Here's a little tutorial to run through:

http://docs.oracle.com/javase/tutorial/essential/io/index.html

After running through this you will have learned enough to come up with the solution on your own.

Community
  • 1
  • 1
robert_difalco
  • 4,821
  • 4
  • 36
  • 58
  • hi there i am very confused, i have taken a look at the How to create a Java String from the contents of a file link you posted but i can not get it to work and am gernerally confused how it works, would you be able to shine some light on this for me please? – user1892955 Dec 21 '12 at 23:20