Author: tilman Date: Mon Jul 4 16:46:34 2016 New Revision: 1751339 URL: http://svn.apache.org/viewvc?rev=1751339&view=rev Log: PDFBOX-3410: added landscape option, as wished by Marc Stuart PDFBOX-3409: don't drop leading spaces, and handle formfeed as wished by Marc Stuart
Modified: pdfbox/branches/2.0/tools/src/main/java/org/apache/pdfbox/tools/TextToPDF.java Modified: pdfbox/branches/2.0/tools/src/main/java/org/apache/pdfbox/tools/TextToPDF.java URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/tools/src/main/java/org/apache/pdfbox/tools/TextToPDF.java?rev=1751339&r1=1751338&r2=1751339&view=diff ============================================================================== --- pdfbox/branches/2.0/tools/src/main/java/org/apache/pdfbox/tools/TextToPDF.java (original) +++ pdfbox/branches/2.0/tools/src/main/java/org/apache/pdfbox/tools/TextToPDF.java Mon Jul 4 16:46:34 2016 @@ -28,6 +28,7 @@ import org.apache.pdfbox.pdmodel.PDDocum import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType0Font; import org.apache.pdfbox.pdmodel.font.PDType1Font; @@ -60,6 +61,7 @@ public class TextToPDF private static final float LINE_HEIGHT_FACTOR = 1.05f; private int fontSize = DEFAULT_FONT_SIZE; + private boolean landscape = false; private PDFont font = DEFAULT_FONT; private static final Map<String, PDType1Font> STANDARD_14 = new HashMap<String, PDType1Font>(); @@ -111,12 +113,17 @@ public class TextToPDF final int margin = 40; float height = font.getBoundingBox().getHeight() / FONTSCALE; + PDRectangle mediaBox = PDRectangle.LETTER; + if (landscape) + { + mediaBox = new PDRectangle(mediaBox.getHeight(), mediaBox.getWidth()); + } //calculate font height and increase by a factor. height = height*fontSize*LINE_HEIGHT_FACTOR; BufferedReader data = new BufferedReader( text ); String nextLine = null; - PDPage page = new PDPage(); + PDPage page = new PDPage(mediaBox); PDPageContentStream contentStream = null; float y = -1; float maxStringLength = page.getMediaBox().getWidth() - 2*margin; @@ -132,20 +139,61 @@ public class TextToPDF // the text. textIsEmpty = false; - String[] lineWords = nextLine.trim().split( " " ); + String[] lineWords = nextLine.replaceAll("[\\n\\r]+$", "").split(" "); int lineIndex = 0; while( lineIndex < lineWords.length ) { StringBuilder nextLineToDraw = new StringBuilder(); float lengthIfUsingNextWord = 0; + boolean ff = false; do { - nextLineToDraw.append( lineWords[lineIndex] ); - nextLineToDraw.append( " " ); - lineIndex++; + String word1, word2 = ""; + int indexFF = lineWords[lineIndex].indexOf('\f'); + if (indexFF == -1) + { + word1 = lineWords[lineIndex]; + } + else + { + ff = true; + word1 = lineWords[lineIndex].substring(0, indexFF); + if (indexFF < lineWords[lineIndex].length()) + { + word2 = lineWords[lineIndex].substring(indexFF + 1); + } + } + // word1 is the part before ff, word2 after + // both can be empty + // word1 can also be empty without ff, if a line has many spaces + if (word1.length() > 0 || !ff) + { + nextLineToDraw.append(word1); + nextLineToDraw.append(" "); + } + if (!ff || word2.length() == 0) + { + lineIndex++; + } + else + { + lineWords[lineIndex] = word2; + } + if (ff) + { + break; + } if( lineIndex < lineWords.length ) { - String lineWithNextWord = nextLineToDraw.toString() + lineWords[lineIndex]; + // need cut off at \f in next word to avoid IllegalArgumentException + String nextWord = lineWords[lineIndex]; + indexFF = nextWord.indexOf('\f'); + if (indexFF != -1) + { + nextWord = nextWord.substring(0, indexFF); + } + + String lineWithNextWord = nextLineToDraw.toString() + " " + nextWord; lengthIfUsingNextWord = (font.getStringWidth( lineWithNextWord )/FONTSCALE) * fontSize; } @@ -156,7 +204,7 @@ public class TextToPDF { // We have crossed the end-of-page boundary and need to extend the // document by another page. - page = new PDPage(); + page = new PDPage(mediaBox); doc.addPage( page ); if( contentStream != null ) { @@ -179,6 +227,18 @@ public class TextToPDF contentStream.newLineAtOffset(0, -height); y -= height; contentStream.showText(nextLineToDraw.toString()); + if (ff) + { + page = new PDPage(mediaBox); + doc.addPage(page); + contentStream.endText(); + contentStream.close(); + contentStream = new PDPageContentStream(doc, page); + contentStream.setFont(font, fontSize); + contentStream.beginText(); + y = page.getMediaBox().getHeight() - margin + height; + contentStream.newLineAtOffset(margin, y); + } } @@ -251,6 +311,10 @@ public class TextToPDF i++; app.setFontSize( Integer.parseInt( args[i] ) ); } + else if( args[i].equals( "-landscape" )) + { + app.setLandscape(true); + } else { throw new IOException( "Unknown argument:" + args[i] ); @@ -278,13 +342,14 @@ public class TextToPDF message.append("Usage: jar -jar pdfbox-app-x.y.z.jar TextToPDF [options] <outputfile> <textfile>\n"); message.append("\nOptions:\n"); message.append(" -standardFont <name> : " + DEFAULT_FONT.getBaseFont() + " (default)\n"); - + for (String std14String : std14) { message.append(" " + std14String + "\n"); } message.append(" -ttf <ttf file> : The TTF font to use.\n"); message.append(" -fontSize <fontSize> : default: " + DEFAULT_FONT_SIZE ); + message.append(" -landscape : sets orientation to landscape" ); System.err.println(message.toString()); System.exit(1); @@ -342,4 +407,24 @@ public class TextToPDF { this.fontSize = aFontSize; } + + /** + * Tells the paper orientation. + * + * @return + */ + public boolean isLandscape() + { + return landscape; + } + + /** + * Sets paper orientation. + * + * @param landscape + */ + public void setLandscape(boolean landscape) + { + this.landscape = landscape; + } }