You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2017/11/08 20:01:51 UTC

svn commit: r1814633 - /pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ShowTextWithPositioning.java

Author: tilman
Date: Wed Nov  8 20:01:51 2017
New Revision: 1814633

URL: http://svn.apache.org/viewvc?rev=1814633&view=rev
Log:
PDFBOX-3992: example of show text with positioning by Dan Fickling

Added:
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ShowTextWithPositioning.java   (with props)

Added: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ShowTextWithPositioning.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ShowTextWithPositioning.java?rev=1814633&view=auto
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ShowTextWithPositioning.java (added)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ShowTextWithPositioning.java Wed Nov  8 20:01:51 2017
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2017 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.examples.pdmodel;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
+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.util.Matrix;
+
+/**
+ * This example shows how to justify a string using the showTextWithPositioning method. First only
+ * spaces are adjusted, and then every letter.
+ *
+ * @author Dan Fickling
+ */
+public class ShowTextWithPositioning
+{
+    public static void main(String[] args) throws Exception
+    {
+        doIt("Hello World, this is a test!", "justify-example.pdf");
+    }
+
+    public static void doIt(String message, String outfile) throws Exception
+    {
+        // the document
+        try (PDDocument doc = new PDDocument();
+             InputStream is = PDDocument.class.getResourceAsStream("/org/apache/pdfbox/resources/ttf/LiberationSans-Regular.ttf"))
+        {
+            final float FONT_SIZE = 20.0f;
+
+            // Page 1
+            PDFont font = PDType0Font.load(doc, is, true);
+            //PDFont font = PDType1Font.COURIER;
+            PDPage page = new PDPage(PDRectangle.A4);
+            doc.addPage(page);
+
+            // Get the non-justified string width in text space units.
+            float stringWidth = font.getStringWidth(message) * FONT_SIZE;
+
+            // Get the string height in text space units.
+            float stringHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() * FONT_SIZE;
+
+            // Get the width we have to justify in.
+            PDRectangle pageSize = page.getMediaBox();
+
+            try (PDPageContentStream contentStream = new PDPageContentStream(doc,
+                    page, AppendMode.OVERWRITE, false))
+            {
+                contentStream.beginText();
+                contentStream.setFont(font, FONT_SIZE);
+                
+                // Start at top of page.
+                contentStream.setTextMatrix(
+                        Matrix.getTranslateInstance(0, pageSize.getHeight() - stringHeight / 1000f));
+                
+                // First show non-justified.
+                contentStream.showText(message);
+                
+                // Move to next line.
+                contentStream.setTextMatrix(
+                        Matrix.getTranslateInstance(0, pageSize.getHeight() - ((stringHeight / 1000f) * 2)));
+                
+                // Now show word justified.
+                // The space we have to make up, in text space units.
+                float justifyWidth = ((pageSize.getWidth() * 1000f) - (stringWidth));
+                
+                List<Object> text = new ArrayList<>();
+                String[] parts = message.split("\\s");
+                
+                float spaceWidth = (justifyWidth / (parts.length - 1)) / FONT_SIZE;
+                
+                for (int i = 0; i < parts.length; i++)
+                {
+                    if (i != 0)
+                    {
+                        text.add(" ");
+                        // Positive values move to the left, negative to the right.
+                        text.add(-spaceWidth);
+                    }
+                    text.add(parts[i]);
+                }
+                contentStream.showTextWithPositioning(text.toArray());
+                contentStream.setTextMatrix(Matrix.getTranslateInstance(0, pageSize.getHeight() - ((stringHeight / 1000f) * 3)));
+                
+                // Now show letter justified.
+                text = new ArrayList<>();
+                justifyWidth = ((pageSize.getWidth() * 1000f) - stringWidth);
+                float extraLetterWidth = (justifyWidth / (message.codePointCount(0, message.length()) - 1)) / FONT_SIZE;
+                
+                for (int i = 0; i < message.length();)
+                {
+                    if (i != 0)
+                    {
+                        text.add(-extraLetterWidth);
+                    }
+                    
+                    text.add(String.valueOf(Character.toChars(message.codePointAt(i))));
+                    
+                    i += Character.charCount(message.codePointAt(i));
+                }
+                contentStream.showTextWithPositioning(text.toArray());
+                
+                // Finish up.
+                contentStream.endText();
+            }
+
+            doc.save(outfile);
+        }
+    }
+}

Propchange: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ShowTextWithPositioning.java
------------------------------------------------------------------------------
    svn:eol-style = native