Impression [JAVA] - Programmation
Marsh Posté le 20-12-2001 à 14:45:03
il y a une api pour ça. Si tu veux imprimer depuis un prog java, cherche dans les projets sur open source ...
Sinon tu peux le programmer toi meme mais je te préviens, c'est hard ...
Marsh Posté le 20-12-2001 à 15:49:14
look
/*
* PrintText.java - Short Description
* Copyright (C) 1999 Scot Bellamy, ACTS, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.jext.print;
import java.util.*;
import java.awt.print.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;
import javax.swing.*;
import javax.swing.text.*;
/**
* A simple printing class to handle basic text printing.
* Accepts an array of Strings or a PlainDocument and
* prints all the lines contained there in. Each String
* in the array is assumed to be a separate line.
*/
public class PrintText
{
private int numberOfpages_ = 0; // The number of pages
private Book pages_ = new Book(); // This holds each page
private int wrapOffset_ = 0; // Used to determine where to begin a wrapped line.
private String docTitle_; // Used for document title (i.e. file name) when including the page header
private String[] text_; // Text to print.
private PrintingOptions printOptions_; // Print options (i.e. font, print header, etc.)
private boolean softTabs_ = true; // Indicates whether soft or hard tabs are used.
private int tabSize_ = 4; // Tab stop if hard tabs are used.
/**
* Constructor - Accepts a plain document and uses default font.
* No header information will be printed.
*/
public PrintText(PlainDocument document)
{
this(document, "", new PrintingOptions(), false, 4);
}
/**
* Constructor - Accepts a plain document as well as other print options,
* including font, page title, and header indicator (true if printing header, false otherwise).
*/
public PrintText(PlainDocument document, String docTitle, PrintingOptions printOptions, boolean softTabs, int tabSize)
{
printOptions_ = printOptions;
softTabs_ = softTabs;
tabSize_ = tabSize;
if (docTitle != null)
{
docTitle_ = docTitle;
} else {
// If a new doc and no title, set docTitle to "New Document"
docTitle_ = "New Document";
}
// Get Root element of the document
Element root = document.getDefaultRootElement();
//get the number of lines (i.e. child elements)
int count = root.getElementCount();
//Allocate the array
String lines[] = new String[count];
Segment segment = new Segment();
// Get each line element, get its text and put it in the string array
for (int i = 0; i < count; i++)
{
Element lineElement = (Element) root.getElement(i);
try
{
document.getText(lineElement.getStartOffset(), lineElement.getEndOffset() - lineElement.getStartOffset(),
segment);
lines[i] = segment.toString();
}
catch (BadLocationException ble)
{
} // Nothing gets added to the Array if there is a bad location
}
text_ = lines;
printTextArray();
}
/**
* Constructor - accepts an array of Strings, uses the default font, no header.
*/
PrintText(String[] text)
{
printOptions_ = new PrintingOptions();
text_ = text;
printTextArray();
}
/**
* Constructor - accepts an array of Strings and a font, no header.
*/
PrintText(String[] text, Font font)
{
printOptions_ = new PrintingOptions();
text_ = text;
printTextArray();
}
/**
* Where the print processing begins.
*/
void printTextArray()
{
PageFormat pgfmt = printOptions_.getPageFormat();
Font pageFont = printOptions_.getPageFont();
try
{
PrinterJob job = PrinterJob.getPrinterJob(); // create a printjob
// pgfmt = job.pageDialog(pgfmt); // set a page format. Comment this if you do not want this to show
// pgfmt = job.validatePage(pgfmt); // make sure the pageformat is ok
text_ = removeEOLChar();
if (printOptions_.getPrintLineNumbers() == true)
{
text_ = addLineNumbers();
}
if (printOptions_.getWrapText() == true)
{
text_ = wrapText();
}
pages_ = pageinateText(); // do the pagination
try
{
job.setPageable(pages_); // set the book pageable so the printjob knows we are printing more than one page (maybe)
if (job.printDialog())
{
job.print(); // print. This calls each Page object's print method
}
}
// catch any errors and be as ambiguous about them as possible
catch (Exception e)
{
JOptionPane.showMessageDialog(null, "Printer Error", "Error", JOptionPane.OK_OPTION);
}
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, "Printer Error", "Error", JOptionPane.OK_OPTION);
}
}
/**
* Eliminates end of line characters
*/
private String[] removeEOLChar()
{
String temp1, temp2, temp3;
int lineCount = text_.length;
String [] newText = new String[lineCount];
int offset = 0;
for (int i = 0; i < lineCount; i++)
{
if (text_[i].length() == 1)
{
newText[i] = " ";
}
else
{
temp1 = text_[i].substring(text_[i].length() - 2, text_[i].length() - 1);
temp2 = text_[i].substring(text_[i].length() - 1, text_[i].length());
if (temp1.compareTo("\r" ) == 0 || temp1.compareTo("\n" ) == 0)
{
offset = 2;
}
else if (temp2.compareTo("\r" ) == 0 || temp2.compareTo("\n" ) == 0)
{
offset = 1;
}
else
{
offset = 0;
}
temp3 = text_[i].substring(0, text_[i].length() - offset);
// Process tabs. Assume tab stops.
StringBuffer temp4 = new StringBuffer();
int length = temp3.length();
for (int j = 0; j < length; j++)
{
if ("\t".equals(temp3.substring(j, j + 1)) == true)
{
// Calcualte the numbe of spaces to the tab stop.
int numSpaces = (temp4.length()) % tabSize_;
if (numSpaces == 0)
{
numSpaces = tabSize_;
}
for (int x = 0; x < numSpaces; x++)
{
temp4.append(" " );
}
}
else
{
temp4.append(temp3.substring(j, j + 1));
}
}
newText[i] = temp4.toString();
}
}
return newText;
}
/**
* Addes line numbers to the beginning of each line.
*/
private String[] addLineNumbers()
{
int numLines = text_.length;
int totalNumSpaces = 0;
String temp;
String [] newText = new String[numLines];
// Get the total number of digits in last line number
// So that spacing and alignment can be done properly.
Integer lines = new Integer(numLines);
temp = lines.toString();
totalNumSpaces = temp.length();
// Set the wrap offset so that we can start wrapped lines in the proper place.
wrapOffset_ = totalNumSpaces + 3;
for (int i = 0; i < numLines; i++)
{
StringBuffer num = new StringBuffer();
num.append(i + 1);
int numLen = num.length();
StringBuffer lineNum = new StringBuffer();
for (int j = 0; j < (totalNumSpaces - numLen); j++)
{
lineNum.append(' ';
}
lineNum.append(num.toString());
newText[i] = lineNum.toString() + ". " + text_[i];
}
return newText;
}
/**
* Creates a new array of lines that all fit the width of the page.
*/
private String[] wrapText()
{
String currentLine = null;
String tempString = null;
Vector temp = new Vector();
int lineCount = text_.length;
int newLineCount = 0;
StringBuffer wrapSpaces = new StringBuffer("" );
int i = 0;
PageFormat pgfmt = printOptions_.getPageFormat();
Font pageFont = printOptions_.getPageFont();
double pageWidth = pgfmt.getImageableWidth();
for (i = 0; i < wrapOffset_; i++)
{
wrapSpaces.append(' ';
}
for (i = 0; i < lineCount; i++)
{
currentLine = text_[i];
while (pageFont.getStringBounds(currentLine,
new FontRenderContext(pageFont.getTransform(), false, false)).getWidth() > pageWidth)
{
int numChars = (int)(currentLine.length() * pageWidth / pageFont.getStringBounds(currentLine,
new FontRenderContext(pageFont.getTransform(), false, false)).getWidth());
temp.add(currentLine.substring(0, numChars));
currentLine = wrapSpaces.toString() + currentLine.substring(numChars, currentLine.length());
}
temp.add(currentLine);
}
newLineCount = temp.size();
String [] newText = new String[newLineCount];
for (int j = 0; j < newLineCount; j++)
{
newText[j] = (String) temp.get(j);
}
return newText;
}
/**
* The pagination method, Paginate the text onto Printable page objects
*/
private Book pageinateText()
{
Book book = new Book();
int linesPerPage = 0; // lines on one page
int currentLine = 0; // line I am currently reading
int pageNum = 0; // page #
PageFormat pgfmt = printOptions_.getPageFormat();
Font pageFont = printOptions_.getPageFont();
int height = (int) pgfmt.getImageableHeight(); // height of a page
int pages = 0; // number of pages
linesPerPage = height / (pageFont.getSize() + 2); // number of lines on a page
pages = ((int) text_.length / linesPerPage); // set number of pages
String[] pageText; // one page of text
String readString; // a temporary string to read from master string
convertUnprintables(); // method to keep out errors
if (printOptions_.getPrintHeader() == true)
{
linesPerPage = linesPerPage - 2;
}
while (pageNum <= pages)
{
pageText = new String[linesPerPage]; // create a new page
for (int x = 0; x < linesPerPage; x++)
{
try
{
readString = text_[currentLine]; // read the string
}
catch (ArrayIndexOutOfBoundsException e)
{
readString = " ";
}
pageText[x] = readString; // add to the page
currentLine++;
}
pageNum++; // increase the page number I am on
book.append(new Page(pageText, pageNum), pgfmt); // create a new page object with the text and add it to the book
}
return book; // return the completed book
}
/**
* Converts unprintable things to a space. stops some errors.
*/
private void convertUnprintables()
{
String tempString;
int i = text_.length;
while (i > 0)
{
i--;
tempString = text_[i];
if (tempString == null || "".equals(tempString))
{
text_[i] = " ";
}
}
}
/**
* An inner class that defines one page of text based
* on data about the PageFormat etc. from the book defined
* in the parent class
*/
class Page implements Printable
{
private String[] pageText_; // the text for the page
private int pageNumber_ = 0;
Page(String[] text, int pageNum)
{
this.pageText_ = text; // set the page's text
this.pageNumber_ = pageNum; // set page number.
}
/**
* Defines the Printable print method, for printing a Page
*/
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException // the printing part
{
int pos;
int posOffset = 1;
double pageWidth = pageFormat.getImageableWidth();
Font pageFont = printOptions_.getPageFont();
if (printOptions_.getPrintHeader() == true)
{
StringBuffer header = new StringBuffer();
StringBuffer pageNumText = new StringBuffer();
int i = 0;
int headerPos = 0;
int numSpaces = 0;
Calendar date = Calendar.getInstance();
header.append(date.get(Calendar.DAY_OF_MONTH));
header.append('/';
header.append(date.get(Calendar.MONTH) + 1);
header.append('/';
header.append(date.get(Calendar.YEAR));
pageNumText.append("Page " );
pageNumText.append(pageNumber_);
int xPos;
double margin = (pageFormat.getWidth() - pageFormat.getImageableWidth()) / 2;
graphics.setFont(printOptions_.getHeaderFont());
graphics.setColor(Color.black);
pos = (int) pageFormat.getImageableY() + (printOptions_.getHeaderFont().getSize() + 2);
graphics.drawString(header.toString(), (int) pageFormat.getImageableX(), pos); // draw a line of text
xPos = (int)((pageFormat.getWidth() / 2) - (graphics.getFontMetrics().stringWidth(docTitle_) / 2));
graphics.drawString(docTitle_, xPos, pos);
xPos = (int)(pageFormat.getWidth() - margin - graphics.getFontMetrics().stringWidth(pageNumText.toString()));
graphics.drawString(pageNumText.toString(), xPos, pos);
posOffset = 3;
}
graphics.setFont(pageFont); // Set the font
graphics.setColor(Color.black); // set color
for (int x = 0; x < (pageText_.length); x++)
{
pos = (int) pageFormat.getImageableY() + (pageFont.getSize() + 2) * (x + posOffset);
graphics.drawString(this.pageText_[x], (int) pageFormat.getImageableX(), pos); // draw a line of text
}
return Printable.PAGE_EXISTS; // print the page
}
}
/**
* An inner class that defines one section of printable text.
* This allows the flexability to assign different fonts to
* individual words or phrases (i.e. for headers/footers or
* Syntax highlighting (pretty print).
*/
class PrintableText
{
private Font font_;
private boolean newLine_ = true;
private String text_;
PrintableText()
{
}
PrintableText(String text, Font font, boolean newLine)
{
text_ = text;
font_ = font;
newLine_ = newLine;
}
String getText()
{
return text_;
}
void setText(String text)
{
text_ = text;
}
Font getFont()
{
return font_;
}
void setFont(Font font)
{
font_ = font;
}
boolean isNewLine()
{
return newLine_;
}
void setNewLine(boolean newLine)
{
newLine_ = newLine;
}
}
}
// End of PrintText.java
Marsh Posté le 20-12-2001 à 15:50:48
jvien d imaginé quelle taille peux bien avoir la base de donnée de ce forum
Marsh Posté le 20-12-2001 à 16:24:51
veryfree a écrit a écrit : jvien d imaginé quelle taille peux bien avoir la base de donnée de ce forum |
Marsh Posté le 21-12-2001 à 08:05:30
merci veryfree,
Mais je ne peu imprimer qu'un PlainDocument, Or j'ai des images, ...
Marsh Posté le 21-12-2001 à 17:52:07
yop a écrit a écrit : merci veryfree, Mais je ne peu imprimer qu'un PlainDocument, Or j'ai des images, ... |
t a reussi a imprimé qq chose avec ca?
pq moi j ai po essayé...
Marsh Posté le 20-12-2001 à 14:29:40
Bonjour a tous,
Je cherche un logiciel, ( de preference gratuit) qui permettrait de faire des impressions en java, telque crystal report en VB.
Si y a des connaiseurs, suis preneur.