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 2011/02/20 19:38:59 UTC
svn commit: r1072680 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
Author: lehmi
Date: Sun Feb 20 18:38:59 2011
New Revision: 1072680
URL: http://svn.apache.org/viewvc?rev=1072680&view=rev
Log:
PDFBOX-947: use in-memory stream instead of temporary file as proposed by Martin Koegler
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
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=1072680&r1=1072679&r2=1072680&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 Sun Feb 20 18:38:59 2011
@@ -25,7 +25,7 @@ import java.io.OutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.ByteArrayInputStream;
-import java.io.FileOutputStream;
+import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
@@ -58,6 +58,8 @@ import org.apache.pdfbox.pdmodel.graphic
public class PDJpeg extends PDXObjectImage
{
+ private static final String JPG = "jpg";
+
private static final List<String> DCT_FILTERS = new ArrayList<String>();
private final static float defaultCompressionLevel = 0.75f;
@@ -75,7 +77,7 @@ public class PDJpeg extends PDXObjectIma
*/
public PDJpeg(PDStream jpeg)
{
- super(jpeg, "jpg");
+ super(jpeg, JPG);
}
/**
@@ -87,7 +89,7 @@ public class PDJpeg extends PDXObjectIma
*/
public PDJpeg( PDDocument doc, InputStream is ) throws IOException
{
- super( new PDStream( doc, is, true ), "jpg" );
+ super( new PDStream( doc, is, true ), JPG);
COSDictionary dic = getCOSStream();
dic.setItem( COSName.FILTER, COSName.DCT_DECODE );
dic.setItem( COSName.SUBTYPE, COSName.IMAGE);
@@ -114,7 +116,7 @@ public class PDJpeg extends PDXObjectIma
*/
public PDJpeg( PDDocument doc, BufferedImage bi ) throws IOException
{
- super( new PDStream( doc ) , "jpg");
+ super( new PDStream( doc ) , JPG);
createImageStream(doc, bi, defaultCompressionLevel);
}
@@ -128,7 +130,7 @@ public class PDJpeg extends PDXObjectIma
*/
public PDJpeg( PDDocument doc, BufferedImage bi, float compressionQuality ) throws IOException
{
- super( new PDStream( doc ), "jpg" );
+ super( new PDStream( doc ), JPG);
createImageStream(doc, bi, compressionQuality);
}
@@ -167,7 +169,7 @@ public class PDJpeg extends PDXObjectIma
try
{
ImageWriter writer = null;
- Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
+ Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(JPG);
if (iter.hasNext())
{
writer = iter.next();
@@ -226,18 +228,19 @@ public class PDJpeg extends PDXObjectIma
*/
public BufferedImage getRGBImage() throws IOException
{ //TODO PKOCH
- File imgFile = null;
BufferedImage bi = null;
boolean readError = false;
try
{
- imgFile = File.createTempFile("pdjpeg", ".jpeg");
- write2file(imgFile);
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ write2OutputStream(os);
+ os.close();
+ byte[] img = os.toByteArray();
// 1. try to read jpeg image
try
{
- bi = ImageIO.read(imgFile);
+ bi = ImageIO.read(new ByteArrayInputStream(img));
}
catch (IIOException iioe)
{
@@ -253,32 +256,15 @@ public class PDJpeg extends PDXObjectIma
// TODO : not sure if it works for all cases
if (bi == null && readError)
{
- byte[] newImage = replaceHeader(imgFile);
+ byte[] newImage = replaceHeader(img);
ByteArrayInputStream bai = new ByteArrayInputStream(newImage);
- // persist file temporarely, because i was not able to manage
- // to call the ImageIO.read(InputStream) successfully.
- FileOutputStream o = new FileOutputStream(imgFile);
- byte[] buffer = new byte[512];
- int read;
- while ((read=bai.read(buffer)) >0)
- {
- o.write(buffer, 0, read);
- }
-
- bai.close();
- o.close();
-
- bi = ImageIO.read(imgFile);
+ bi = ImageIO.read(bai);
}
}
finally
{
- if (imgFile != null)
- {
- imgFile.delete();
- }
}
// If there is a 'soft mask' image then we use that as a transparency mask.
@@ -368,11 +354,8 @@ public class PDJpeg extends PDXObjectIma
return 0;
}
- private byte[] replaceHeader(File jpegFile) throws IOException
+ private byte[] replaceHeader(byte[] image)
{
- // read image into memory
- byte[] image = getBytesFromFile(jpegFile);
-
// get end position of wrong header respectively startposition of "real jpeg data"
int pos = getHeaderEndPos(image);
@@ -389,3 +372,4 @@ public class PDJpeg extends PDXObjectIma
return newImage;
}
}
+