You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2010/06/09 20:08:44 UTC

svn commit: r953104 - in /pdfbox/trunk/pdfbox/src/main/java/org: apache/pdfbox/cos/ apache/pdfbox/pdmodel/graphics/xobject/ lehmi/ lehmi/linuxmagazin/

Author: lehmi
Date: Wed Jun  9 18:08:44 2010
New Revision: 953104

URL: http://svn.apache.org/viewvc?rev=953104&view=rev
Log:
PDFBOX-513: addewd transparency/apla support for PDJpeg. Patch by Yonas Jongkind (yonas dot jongkind at gmail dot com)

Added:
    pdfbox/trunk/pdfbox/src/main/java/org/lehmi/
    pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/
    pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/CreatePDF.java
    pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportText.java
    pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportTextByArea.java
Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java?rev=953104&r1=953103&r2=953104&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java Wed Jun  9 18:08:44 2010
@@ -770,6 +770,10 @@ public final class COSName extends COSBa
      * A common COSName value.
      */
     public static final COSName SM = new COSName( "SM" );
+    /**
+     * A common COSName value.
+     */
+    public static final COSName SMASK = new COSName( "SMask" );
     /** "Size" */
     public static final COSName SIZE = new COSName( "Size" );
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java?rev=953104&r1=953103&r2=953104&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java Wed Jun  9 18:08:44 2010
@@ -16,6 +16,8 @@
  */
 package org.apache.pdfbox.pdmodel.graphics.xobject;
 
+import java.awt.Color;
+import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
 import java.io.InputStream;
 import java.io.IOException;
@@ -36,6 +38,7 @@ import org.apache.pdfbox.cos.COSName;
 
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.common.PDStream;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
 import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
 
 /**
@@ -47,7 +50,7 @@ import org.apache.pdfbox.pdmodel.graphic
 public class PDJpeg extends PDXObjectImage
 {
 
-    private static final List DCT_FILTERS = new ArrayList();
+    private static final List<String> DCT_FILTERS = new ArrayList();
 
     static
     {
@@ -101,20 +104,66 @@ public class PDJpeg extends PDXObjectIma
     public PDJpeg( PDDocument doc, BufferedImage bi ) throws IOException
     {
         super( new PDStream( doc ), "jpg" );
-
+        BufferedImage alpha = null;
+        if (bi.getColorModel().hasAlpha())
+        {
+            alpha = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
+            Graphics2D g = alpha.createGraphics();
+            g.setColor(Color.BLACK);
+            g.drawRect(0, 0, bi.getWidth(), bi.getHeight());
+            g.setColor(Color.WHITE);
+            g.drawImage(bi, 0, 0, null);
+            int alphaHeight = alpha.getHeight();
+            int alphaWidth = alpha.getWidth();
+            int whiteRGB = (Color.WHITE).getRGB();
+            for(int y = 0; y < alphaHeight; y++)
+            {
+                for(int x = 0; x < alphaWidth; x++)
+                {
+                    Color color = new Color(alpha.getRGB(x, y));
+                    if(color.getRed() != 0 && color.getGreen() != 0 && color.getBlue() != 0)
+                    {
+                        alpha.setRGB(x, y, whiteRGB);
+                    }
+                }
+            }
+            BufferedImage image = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_USHORT_565_RGB);
+            g = image.createGraphics();
+            g.drawImage(bi, 0, 0, null);
+            bi = image;
+        }
+        
         java.io.OutputStream os = getCOSStream().createFilteredStream();
         try
         {
-
             ImageIO.write(bi,"jpeg",os);
 
             COSDictionary dic = getCOSStream();
             dic.setItem( COSName.FILTER, COSName.DCT_DECODE );
             dic.setItem( COSName.SUBTYPE, COSName.IMAGE);
             dic.setItem( COSName.TYPE, COSName.XOBJECT );
-
+            PDXObjectImage alphaPdImage = null;
+            if(alpha != null)
+            {
+                alphaPdImage = new PDJpeg(doc, alpha);
+                dic.setItem(COSName.SMASK, alphaPdImage);
+            }
             setBitsPerComponent( 8 );
-            setColorSpace( PDDeviceRGB.INSTANCE );
+            if (bi.getColorModel().getNumComponents() == 3) 
+            {
+                setColorSpace( PDDeviceRGB.INSTANCE );
+            } 
+            else
+            {
+                if (bi.getColorModel().getNumComponents() == 1) 
+                {
+                    setColorSpace( new PDDeviceGray() );
+                } 
+                else 
+                {
+                    throw new IllegalStateException();
+                }
+            }
             setHeight( bi.getHeight() );
             setWidth( bi.getWidth() );
         }

Added: pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/CreatePDF.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/CreatePDF.java?rev=953104&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/CreatePDF.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/CreatePDF.java Wed Jun  9 18:08:44 2010
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.lehmi.linuxmagazin;
+
+import java.io.IOException;
+import org.apache.pdfbox.exceptions.*;
+import org.apache.pdfbox.pdmodel.*;
+import org.apache.pdfbox.pdmodel.edit.*;
+import org.apache.pdfbox.pdmodel.font.*;
+
+
+/**
+ * This is an example of how to use a text matrix.
+ * @version $Revision: 1.0 $
+ */
+public class CreatePDF
+{
+    /**
+     * creates a sample document with some text using a text matrix.
+     *
+     * @param message The message to write in the file.
+     * @param outfile The resulting PDF.
+     *
+     * @throws IOException If there is an error writing the data.
+     * @throws COSVisitorException If there is an error writing the PDF.
+     */
+    public static void main(String[] args)
+    {
+        PDDocument document = null;
+        try {
+            document = new PDDocument();
+            PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
+            document.addPage(page);
+            PDPageContentStream contentStream = new PDPageContentStream(document, page);
+            contentStream.setFont(PDType1Font.HELVETICA,1);
+            contentStream.beginText();
+            for (int i=0;i<9;i++) {
+                contentStream.setNonStrokingColor(10*i,20*i,30*i);
+                contentStream.setTextScaling(16+(i*6), 16+(i*6), 100, 100+i*60);
+                contentStream.drawString("Linuxmagazin");
+            }
+            contentStream.endText();
+            contentStream.close();
+            document.save(args[0]);
+            document.close();
+        }
+        catch (COSVisitorException exception) {
+            System.err.println(exception);
+        }
+        catch (IOException exception) {
+            System.err.println(exception);
+        }
+    }
+
+}

Added: pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportText.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportText.java?rev=953104&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportText.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportText.java Wed Jun  9 18:08:44 2010
@@ -0,0 +1,33 @@
+package org.lehmi.linuxmagazin;
+
+import org.apache.pdfbox.pdmodel.*;
+import org.apache.pdfbox.util.*;
+import java.io.*;
+
+public class ExportText
+{
+
+    public static void main(String[] args) throws Exception
+    {
+        PDDocument document = null;
+        Writer output = null;
+        try {
+            document = PDDocument.load(args[0]);
+            output = new OutputStreamWriter(System.out);
+            PDFTextStripper stripper = new PDFTextStripper("UTF-8");
+            stripper.setSortByPosition( true );
+            stripper.setStartPage( 1 );
+            stripper.setEndPage( document.getNumberOfPages() );
+            stripper.writeText( document, output );
+        }
+        catch (IOException exception) {
+            
+        }
+        finally {
+            if (output != null)
+                output.close();
+            if (document != null)
+                document.close();
+        }
+    }
+}

Added: pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportTextByArea.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportTextByArea.java?rev=953104&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportTextByArea.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/lehmi/linuxmagazin/ExportTextByArea.java Wed Jun  9 18:08:44 2010
@@ -0,0 +1,33 @@
+package org.lehmi.linuxmagazin;
+
+import org.apache.pdfbox.pdmodel.*;
+import org.apache.pdfbox.util.*;
+import java.awt.Rectangle;
+import java.io.*;
+import java.util.List;
+
+public class ExportTextByArea
+{
+
+    public static void main(String[] args) throws Exception
+    {
+        PDDocument document = null;
+        try {
+            document = PDDocument.load(args[0]);
+            PDFTextStripperByArea stripper = new PDFTextStripperByArea();
+            stripper.setSortByPosition( true );
+            Rectangle region = new Rectangle( 10, 280, 275, 60 );
+            stripper.addRegion( "region1", region );
+            List<PDPage> allPages = document.getDocumentCatalog().getAllPages();
+            stripper.extractRegions( allPages.get( 0 ) );
+            System.out.println(stripper.getTextForRegion( "region1" ));
+        }
+        catch (IOException exception) {
+            
+        }
+        finally {
+            if (document != null)
+                document.close();
+        }
+    }
+}