001: /**
002: * Copyright (c) 2005, www.pdfbox.org
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain the above copyright notice,
009: * this list of conditions and the following disclaimer.
010: * 2. Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: * 3. Neither the name of pdfbox; nor the names of its
014: * contributors may be used to endorse or promote products derived from this
015: * software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
021: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: *
028: * http://www.pdfbox.org
029: *
030: */package org.pdfbox;
031:
032: import java.io.BufferedReader;
033: import java.io.File;
034: import java.io.FileReader;
035: import java.io.IOException;
036: import java.io.Reader;
037:
038: import org.pdfbox.pdmodel.PDDocument;
039: import org.pdfbox.pdmodel.PDPage;
040:
041: import org.pdfbox.pdmodel.edit.PDPageContentStream;
042: import org.pdfbox.pdmodel.font.PDSimpleFont;
043: import org.pdfbox.pdmodel.font.PDTrueTypeFont;
044: import org.pdfbox.pdmodel.font.PDType1Font;
045:
046: /**
047: * This will take a text file and ouput a pdf with that text.
048: *
049: * @author <a href="ben@benlitchfield.com">Ben Litchfield</a>
050: * @version $Revision: 1.4 $
051: */
052: public class TextToPDF {
053: private int fontSize = 10;
054: private PDSimpleFont font = PDType1Font.HELVETICA;
055:
056: /**
057: * Create a PDF document with some text.
058: *
059: * @param text The stream of text data.
060: *
061: * @return The document with the text in it.
062: *
063: * @throws IOException If there is an error writing the data.
064: */
065: public PDDocument createPDFFromText(Reader text) throws IOException {
066: PDDocument doc = null;
067: try {
068:
069: int margin = 40;
070: float height = font.getFontDescriptor()
071: .getFontBoundingBox().getHeight() / 1000;
072:
073: //calculate font height and increase by 5 percent.
074: height = height * fontSize * 1.05f;
075: doc = new PDDocument();
076: BufferedReader data = new BufferedReader(text);
077: String nextLine = null;
078: PDPage page = new PDPage();
079: PDPageContentStream contentStream = null;
080: float y = -1;
081: float maxStringLength = page.getMediaBox().getWidth() - 2
082: * margin;
083: while ((nextLine = data.readLine()) != null) {
084:
085: String[] lineWords = nextLine.trim().split(" ");
086: int lineIndex = 0;
087: while (lineIndex < lineWords.length) {
088: StringBuffer nextLineToDraw = new StringBuffer();
089: float lengthIfUsingNextWord = 0;
090: do {
091: nextLineToDraw.append(lineWords[lineIndex]);
092: nextLineToDraw.append(" ");
093: lineIndex++;
094: if (lineIndex < lineWords.length) {
095: String lineWithNextWord = nextLineToDraw
096: .toString()
097: + lineWords[lineIndex];
098: lengthIfUsingNextWord = (font
099: .getStringWidth(lineWithNextWord) / 1000)
100: * fontSize;
101: }
102: } while (lineIndex < lineWords.length
103: && lengthIfUsingNextWord < maxStringLength);
104: if (y < margin) {
105: page = new PDPage();
106: doc.addPage(page);
107: if (contentStream != null) {
108: contentStream.endText();
109: contentStream.close();
110: }
111: contentStream = new PDPageContentStream(doc,
112: page);
113: contentStream.setFont(font, fontSize);
114: contentStream.beginText();
115: y = page.getMediaBox().getHeight() - margin
116: + height;
117: contentStream.moveTextPositionByAmount(margin,
118: y);
119:
120: }
121: //System.out.println( "Drawing string at " + x + "," + y );
122:
123: if (contentStream == null) {
124: throw new IOException(
125: "Error:Expected non-null content stream.");
126: }
127: contentStream.moveTextPositionByAmount(0, -height);
128: y -= height;
129: contentStream.drawString(nextLineToDraw.toString());
130: }
131:
132: }
133: if (contentStream != null) {
134: contentStream.endText();
135: contentStream.close();
136: }
137: } catch (IOException io) {
138: if (doc != null) {
139: doc.close();
140: }
141: throw io;
142: }
143: return doc;
144: }
145:
146: /**
147: * This will create a PDF document with a single image on it.
148: * <br />
149: * see usage() for commandline
150: *
151: * @param args Command line arguments.
152: *
153: * @throws IOException If there is an error with the PDF.
154: */
155: public static void main(String[] args) throws IOException {
156: TextToPDF app = new TextToPDF();
157: PDDocument doc = null;
158: try {
159: if (args.length < 2) {
160: app.usage();
161: } else {
162: for (int i = 0; i < args.length - 2; i++) {
163: if (args[i].equals("-standardFont")) {
164: i++;
165: app.setFont(PDType1Font
166: .getStandardFont(args[i]));
167: } else if (args[i].equals("-ttf")) {
168: i++;
169: PDTrueTypeFont font = PDTrueTypeFont.loadTTF(
170: doc, new File(args[i]));
171: app.setFont(font);
172: } else if (args[i].equals("-fontSize")) {
173: i++;
174: app.setFontSize(Integer.parseInt(args[i]));
175: } else {
176: throw new IOException("Unknown argument:"
177: + args[i]);
178: }
179: }
180: doc = app.createPDFFromText(new FileReader(
181: args[args.length - 1]));
182: doc.save(args[args.length - 2]);
183: }
184: } catch (Exception e) {
185: e.printStackTrace();
186: } finally {
187: if (doc != null) {
188: doc.close();
189: }
190: }
191: }
192:
193: /**
194: * This will print out a message telling how to use this example.
195: */
196: private void usage() {
197: String[] std14 = PDType1Font.getStandard14Names();
198: System.err.println("usage: " + this .getClass().getName()
199: + " [options] <output-file> <text-file>");
200: System.err.println(" -standardFont <name> default:"
201: + PDType1Font.HELVETICA.getBaseFont());
202: for (int i = 0; i < std14.length; i++) {
203: System.err.println(" "
204: + std14[i]);
205: }
206: System.err
207: .println(" -ttf <ttf file> The TTF font to use.");
208: System.err.println(" -fontSize <fontSize> default:10");
209:
210: }
211:
212: /**
213: * @return Returns the font.
214: */
215: public PDSimpleFont getFont() {
216: return font;
217: }
218:
219: /**
220: * @param aFont The font to set.
221: */
222: public void setFont(PDSimpleFont aFont) {
223: this .font = aFont;
224: }
225:
226: /**
227: * @return Returns the fontSize.
228: */
229: public int getFontSize() {
230: return fontSize;
231: }
232:
233: /**
234: * @param aFontSize The fontSize to set.
235: */
236: public void setFontSize(int aFontSize) {
237: this.fontSize = aFontSize;
238: }
239: }
|