aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/pdfbox/TextToPDF.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/pdfbox/TextToPDF.java')
-rw-r--r--src/main/java/org/pdfbox/TextToPDF.java259
1 files changed, 259 insertions, 0 deletions
diff --git a/src/main/java/org/pdfbox/TextToPDF.java b/src/main/java/org/pdfbox/TextToPDF.java
new file mode 100644
index 0000000..413d981
--- /dev/null
+++ b/src/main/java/org/pdfbox/TextToPDF.java
@@ -0,0 +1,259 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+import org.pdfbox.pdmodel.font.PDSimpleFont;
+import org.pdfbox.pdmodel.font.PDTrueTypeFont;
+import org.pdfbox.pdmodel.font.PDType1Font;
+
+
+/**
+ * This will take a text file and ouput a pdf with that text.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class TextToPDF
+{
+ private int fontSize = 10;
+ private PDSimpleFont font = PDType1Font.HELVETICA;
+
+ /**
+ * Create a PDF document with some text.
+ *
+ * @param text The stream of text data.
+ *
+ * @return The document with the text in it.
+ *
+ * @throws IOException If there is an error writing the data.
+ */
+ public PDDocument createPDFFromText( Reader text ) throws IOException
+ {
+ PDDocument doc = null;
+ try
+ {
+
+ int margin = 40;
+ float height = font.getFontDescriptor().getFontBoundingBox().getHeight()/1000;
+
+ //calculate font height and increase by 5 percent.
+ height = height*fontSize*1.05f;
+ doc = new PDDocument();
+ BufferedReader data = new BufferedReader( text );
+ String nextLine = null;
+ PDPage page = new PDPage();
+ PDPageContentStream contentStream = null;
+ float y = -1;
+ float maxStringLength = page.getMediaBox().getWidth() - 2*margin;
+ while( (nextLine = data.readLine()) != null )
+ {
+
+ String[] lineWords = nextLine.trim().split( " " );
+ int lineIndex = 0;
+ while( lineIndex < lineWords.length )
+ {
+ StringBuffer nextLineToDraw = new StringBuffer();
+ float lengthIfUsingNextWord = 0;
+ do
+ {
+ nextLineToDraw.append( lineWords[lineIndex] );
+ nextLineToDraw.append( " " );
+ lineIndex++;
+ if( lineIndex < lineWords.length )
+ {
+ String lineWithNextWord = nextLineToDraw.toString() + lineWords[lineIndex];
+ lengthIfUsingNextWord =
+ (font.getStringWidth( lineWithNextWord )/1000) * fontSize;
+ }
+ }
+ while( lineIndex < lineWords.length &&
+ lengthIfUsingNextWord < maxStringLength );
+ if( y < margin )
+ {
+ page = new PDPage();
+ doc.addPage( page );
+ if( contentStream != null )
+ {
+ contentStream.endText();
+ contentStream.close();
+ }
+ contentStream = new PDPageContentStream(doc, page);
+ contentStream.setFont( font, fontSize );
+ contentStream.beginText();
+ y = page.getMediaBox().getHeight() - margin + height;
+ contentStream.moveTextPositionByAmount(
+ margin, y );
+
+ }
+ //System.out.println( "Drawing string at " + x + "," + y );
+
+
+ contentStream.moveTextPositionByAmount( 0, -height);
+ y -= height;
+ contentStream.drawString( nextLineToDraw.toString() );
+ }
+
+
+ }
+ if( contentStream != null )
+ {
+ contentStream.endText();
+ contentStream.close();
+ }
+ }
+ catch( IOException io )
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ throw io;
+ }
+ return doc;
+ }
+
+ /**
+ * This will create a PDF document with a single image on it.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ *
+ * @throws IOException If there is an error with the PDF.
+ */
+ public static void main(String[] args) throws IOException
+ {
+ TextToPDF app = new TextToPDF();
+ PDDocument doc = null;
+ try
+ {
+ if( args.length < 2 )
+ {
+ app.usage();
+ }
+ else
+ {
+ for( int i=0; i<args.length-2; i++ )
+ {
+ if( args[i].equals( "-standardFont" ))
+ {
+ i++;
+ app.setFont( PDType1Font.getStandardFont( args[i] ));
+ }
+ else if( args[i].equals( "-ttf" ))
+ {
+ i++;
+ PDTrueTypeFont font = PDTrueTypeFont.loadTTF( doc, new File( args[i]));
+ app.setFont( font );
+ }
+ else if( args[i].equals( "-fontSize" ))
+ {
+ i++;
+ app.setFontSize( Integer.parseInt( args[i] ) );
+ }
+ else
+ {
+ throw new IOException( "Unknown argument:" + args[i] );
+ }
+ }
+ doc = app.createPDFFromText( new FileReader( args[args.length-1] ) );
+ doc.save( args[args.length-2] );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ String[] std14 = PDType1Font.getStandard14Names();
+ System.err.println( "usage: " + this.getClass().getName() + " [options] <output-file> <text-file>" );
+ System.err.println( " -standardFont <name> default:" + PDType1Font.HELVETICA.getBaseFont() );
+ for( int i=0; i<std14.length; i++ )
+ {
+ System.err.println( " " + std14[i] );
+ }
+ System.err.println( " -ttf <ttf file> The TTF font to use.");
+ System.err.println( " -fontSize <fontSize> default:10" );
+
+
+ }
+ /**
+ * @return Returns the font.
+ */
+ public PDSimpleFont getFont()
+ {
+ return font;
+ }
+ /**
+ * @param aFont The font to set.
+ */
+ public void setFont(PDSimpleFont aFont)
+ {
+ this.font = aFont;
+ }
+ /**
+ * @return Returns the fontSize.
+ */
+ public int getFontSize()
+ {
+ return fontSize;
+ }
+ /**
+ * @param aFontSize The fontSize to set.
+ */
+ public void setFontSize(int aFontSize)
+ {
+ this.fontSize = aFontSize;
+ }
+} \ No newline at end of file