📄 document.java
字号:
/*
* $Id: Document.java 2824 2007-06-03 18:10:21Z blowagie $
* $Name$
*
* Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library 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 Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
package com.lowagie.text;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
/**
* A generic Document class.
* <P>
* All kinds of Text-elements can be added to a <CODE>HTMLDocument</CODE>.
* The <CODE>Document</CODE> signals all the listeners when an element has
* been added.
* <P>
* Remark:
* <OL>
* <LI>Once a document is created you can add some meta information.
* <LI>You can also set the headers/footers.
* <LI>You have to open the document before you can write content.
* <LI>You can only write content (no more meta-formation!) once a document is
* opened.
* <LI>When you change the header/footer on a certain page, this will be
* effective starting on the next page.
* <LI>Ater closing the document, every listener (as well as its <CODE>
* OutputStream</CODE>) is closed too.
* </OL>
* Example: <BLOCKQUOTE>
*
* <PRE>// creation of the document with a certain size and certain margins
* <STRONG>Document document = new Document(PageSize.A4, 50, 50, 50, 50);
* </STRONG> try {
* // creation of the different writers
* HtmlWriter.getInstance(<STRONG>document </STRONG>, System.out);
* PdfWriter.getInstance(<STRONG>document </STRONG>, new FileOutputStream("text.pdf"));
* // we add some meta information to the document
* <STRONG>document.addAuthor("Bruno Lowagie"); </STRONG>
* <STRONG>document.addSubject("This is the result of a Test."); </STRONG>
* // we open the document for writing
* <STRONG>document.open(); </STRONG>
* <STRONG>document.add(new Paragraph("Hello world"));</STRONG>
* } catch(DocumentException de) {
* System.err.println(de.getMessage());
* }
* <STRONG>document.close();</STRONG>
* </PRE>
*
* </BLOCKQUOTE>
*/
public class Document implements DocListener {
// membervariables
/** This constant may only be changed by Paulo Soares and/or Bruno Lowagie. */
private static final String ITEXT_VERSION = "iText 2.0.4 (by lowagie.com)";
/**
* Allows the pdf documents to be produced without compression for debugging
* purposes.
*/
public static boolean compress = true;
/**
* When true the file access is not done through a memory mapped file. Use it if the file
* is too big to be mapped in your address space.
*/
public static boolean plainRandomAccess = false;
/** The DocListener. */
private ArrayList listeners = new ArrayList();
/** Is the document open or not? */
protected boolean open;
/** Has the document already been closed? */
protected boolean close;
// membervariables concerning the layout
/** The size of the page. */
protected Rectangle pageSize;
/** margin in x direction starting from the left */
protected float marginLeft = 0;
/** margin in x direction starting from the right */
protected float marginRight = 0;
/** margin in y direction starting from the top */
protected float marginTop = 0;
/** margin in y direction starting from the bottom */
protected float marginBottom = 0;
protected boolean marginMirroring = false;
/** Content of JavaScript onLoad function */
protected String javaScript_onLoad = null;
/** Content of JavaScript onUnLoad function */
protected String javaScript_onUnLoad = null;
/** Style class in HTML body tag */
protected String htmlStyleClass = null;
// headers, footers
/** Current pagenumber */
protected int pageN = 0;
/** This is the textual part of a Page; it can contain a header */
protected HeaderFooter header = null;
/** This is the textual part of the footer */
protected HeaderFooter footer = null;
/** This is a chapter number in case ChapterAutoNumber is used. */
protected int chapternumber = 0;
// constructor
/**
* Constructs a new <CODE>Document</CODE> -object.
*/
public Document() {
this(PageSize.A4);
}
/**
* Constructs a new <CODE>Document</CODE> -object.
*
* @param pageSize
* the pageSize
*/
public Document(Rectangle pageSize) {
this(pageSize, 36, 36, 36, 36);
}
/**
* Constructs a new <CODE>Document</CODE> -object.
*
* @param pageSize
* the pageSize
* @param marginLeft
* the margin on the left
* @param marginRight
* the margin on the right
* @param marginTop
* the margin on the top
* @param marginBottom
* the margin on the bottom
*/
public Document(Rectangle pageSize, float marginLeft, float marginRight,
float marginTop, float marginBottom) {
this.pageSize = pageSize;
this.marginLeft = marginLeft;
this.marginRight = marginRight;
this.marginTop = marginTop;
this.marginBottom = marginBottom;
}
// listener methods
/**
* Adds a <CODE>DocListener</CODE> to the <CODE>Document</CODE>.
*
* @param listener
* the new DocListener.
*/
public void addDocListener(DocListener listener) {
listeners.add(listener);
}
/**
* Removes a <CODE>DocListener</CODE> from the <CODE>Document</CODE>.
*
* @param listener
* the DocListener that has to be removed.
*/
public void removeDocListener(DocListener listener) {
listeners.remove(listener);
}
// methods implementing the DocListener interface
/**
* Adds an <CODE>Element</CODE> to the <CODE>Document</CODE>.
*
* @param element
* the <CODE>Element</CODE> to add
* @return <CODE>true</CODE> if the element was added, <CODE>false
* </CODE> if not
* @throws DocumentException
* when a document isn't open yet, or has been closed
*/
public boolean add(Element element) throws DocumentException {
if (close) {
throw new DocumentException(
"The document has been closed. You can't add any Elements.");
}
int type = element.type();
if (open) {
if (!(type == Element.CHUNK || type == Element.PHRASE
|| type == Element.PARAGRAPH || type == Element.TABLE
|| type == Element.PTABLE
|| type == Element.MULTI_COLUMN_TEXT
|| type == Element.ANCHOR || type == Element.ANNOTATION
|| type == Element.CHAPTER || type == Element.SECTION
|| type == Element.LIST || type == Element.LISTITEM
|| type == Element.RECTANGLE || type == Element.JPEG
|| type == Element.IMGRAW || type == Element.IMGTEMPLATE
|| type == Element.MARKED)) {
throw new DocumentException(
"The document is open; you can only add Elements with content.");
}
} else {
if (!(type == Element.HEADER || type == Element.TITLE
|| type == Element.SUBJECT || type == Element.KEYWORDS
|| type == Element.AUTHOR || type == Element.PRODUCER
|| type == Element.CREATOR || type == Element.CREATIONDATE
|| type == Element.MARKED)) {
throw new DocumentException(
"The document is not open yet; you can only add Meta information.");
}
}
boolean success = false;
DocListener listener;
if (element instanceof ChapterAutoNumber) {
chapternumber++;
((ChapterAutoNumber)element).setChapterNumber(chapternumber);
}
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
success |= listener.add(element);
}
return success;
}
/**
* Opens the document.
* <P>
* Once the document is opened, you can't write any Header- or
* Meta-information anymore. You have to open the document before you can
* begin to add content to the body of the document.
*/
public void open() {
if (!close) {
open = true;
}
DocListener listener;
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
listener.setPageSize(pageSize);
listener.setMargins(marginLeft, marginRight, marginTop,
marginBottom);
listener.open();
}
}
/**
* Sets the pagesize.
*
* @param pageSize
* the new pagesize
* @return a <CODE>boolean</CODE>
*/
public boolean setPageSize(Rectangle pageSize) {
this.pageSize = pageSize;
DocListener listener;
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
listener.setPageSize(pageSize);
}
return true;
}
/**
* Sets the margins.
*
* @param marginLeft
* the margin on the left
* @param marginRight
* the margin on the right
* @param marginTop
* the margin on the top
* @param marginBottom
* the margin on the bottom
* @return a <CODE>boolean</CODE>
*/
public boolean setMargins(float marginLeft, float marginRight,
float marginTop, float marginBottom) {
this.marginLeft = marginLeft;
this.marginRight = marginRight;
this.marginTop = marginTop;
this.marginBottom = marginBottom;
DocListener listener;
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
listener.setMargins(marginLeft, marginRight, marginTop,
marginBottom);
}
return true;
}
/**
* Signals that an new page has to be started.
*
* @return <CODE>true</CODE> if the page was added, <CODE>false</CODE>
* if not.
* @throws DocumentException
* when a document isn't open yet, or has been closed
*/
public boolean newPage() {
if (!open || close) {
return false;
}
DocListener listener;
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
listener.newPage();
}
return true;
}
/**
* Changes the header of this document.
*
* @param header
* the new header
*/
public void setHeader(HeaderFooter header) {
this.header = header;
DocListener listener;
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
listener.setHeader(header);
}
}
/**
* Resets the header of this document.
*/
public void resetHeader() {
this.header = null;
DocListener listener;
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
listener.resetHeader();
}
}
/**
* Changes the footer of this document.
*
* @param footer
* the new footer
*/
public void setFooter(HeaderFooter footer) {
this.footer = footer;
DocListener listener;
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
listener.setFooter(footer);
}
}
/**
* Resets the footer of this document.
*/
public void resetFooter() {
this.footer = null;
DocListener listener;
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
listener = (DocListener) iterator.next();
listener.resetFooter();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -