EMMA Coverage Report (generated Sun Apr 20 22:38:01 CEST 2008)
[all classes][net.sf.jomic.comic]

COVERAGE SUMMARY FOR SOURCE FILE [CreatePdfComicTask.java]

nameclass, %method, %block, %line, %
CreatePdfComicTask.java100% (1/1)100% (6/6)87%  (239/276)96%  (52.6/55)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class CreatePdfComicTask100% (1/1)100% (6/6)87%  (239/276)96%  (52.6/55)
cleanUpComic (): void 100% (1/1)79%  (23/29)93%  (6.5/7)
<static initializer> 100% (1/1)80%  (12/15)80%  (0.8/1)
CreatePdfComicTask (File, String [], Map, File, Conversion): void 100% (1/1)80%  (20/25)96%  (4.8/5)
createJpegStream (RenderedImage): InputStream 100% (1/1)81%  (22/27)97%  (6.8/7)
addImageFile (String, File): void 100% (1/1)90%  (156/174)96%  (31.7/33)
setUpComic (): void 100% (1/1)100% (6/6)100% (2/2)

1// Jomic - a viewer for comic book archives.
2// Copyright (C) 2004-2008 Thomas Aglassinger
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program.  If not, see <http://www.gnu.org/licenses/>.
16package net.sf.jomic.comic;
17 
18import java.awt.image.RenderedImage;
19import java.io.ByteArrayInputStream;
20import java.io.ByteArrayOutputStream;
21import java.io.File;
22import java.io.FileInputStream;
23import java.io.IOException;
24import java.io.InputStream;
25import java.util.Map;
26 
27import javax.imageio.ImageIO;
28 
29import net.sf.jomic.tools.ImageTools;
30import net.sf.jomic.tools.StringTools;
31import net.sf.wraplog.Logger;
32 
33import org.pdfbox.pdmodel.PDDocument;
34import org.pdfbox.pdmodel.PDPage;
35import org.pdfbox.pdmodel.common.PDRectangle;
36import org.pdfbox.pdmodel.edit.PDPageContentStream;
37import org.pdfbox.pdmodel.graphics.xobject.PDJpeg;
38 
39/**
40 *  Task to create a PDF comic from a set of image files.
41 *
42 * @author    Thomas Aglassinger
43 */
44public class CreatePdfComicTask extends AbstractCreateComicTask
45{
46    private static final double WEIGHT_READ = 0.3333;
47    private static final double WEIGHT_READ_AND_CONVERT = 0.6667;
48 
49    private ImageTools imageTools;
50    private Logger logger;
51    private PDDocument pdfDocument;
52    private StringTools stringTools;
53 
54    public CreatePdfComicTask(File newSourceBaseDir, String[] newSourceFileNames,
55            Map newImageInfoMap, File newTargetPdfFile, Conversion newConversion) {
56        super(newSourceBaseDir, newSourceFileNames, newImageInfoMap, newTargetPdfFile, newConversion);
57 
58        logger = Logger.getLogger(CreatePdfComicTask.class);
59        imageTools = ImageTools.instance();
60        stringTools = StringTools.instance();
61    }
62 
63    protected void setUpComic()
64        throws Exception {
65        pdfDocument = new PDDocument();
66    }
67 
68    protected void addImageFile(String outName, File imageFile)
69        throws Exception {
70        assert outName != null;
71        assert imageFile != null;
72 
73        long imageFileLength = imageFile.length();
74        long baseProgress = getProgress();
75        String imageFormat = imageTools.getImageFormat(imageFile);
76 
77        if (imageFormat == null) {
78            if (logger.isInfoEnabled()) {
79                logger.info("ignore non-image: {}", imageFile);
80            }
81        } else {
82            InputStream imageStream;
83 
84            if (logger.isInfoEnabled()) {
85                logger.info("add " + stringTools.sourced(imageFile));
86            }
87            enableAddedAtLeastOneImage();
88 
89            boolean isJpegImage = imageFormat.equals("jpeg");
90            boolean needsTrim = getConversion().needsTrim(imageFile);
91 
92            if (!needsTrim && isJpegImage) {
93                // Use original JFIF/JPEG image.
94                imageStream = new FileInputStream(imageFile);
95            } else {
96                RenderedImage image = imageTools.readImage(imageFile);
97 
98                setProgress(baseProgress + Math.round(WEIGHT_READ * imageFileLength));
99                if (needsTrim) {
100                    image = getConversion().getTrimmed(image);
101                }
102                imageStream = createJpegStream(image);
103            }
104            setProgress(baseProgress + Math.round(WEIGHT_READ_AND_CONVERT * imageFileLength));
105 
106            try {
107                PDPage page = new PDPage();
108                PDJpeg jpeg = new PDJpeg(pdfDocument, imageStream);
109                PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page);
110 
111                try {
112                    contentStream.drawImage(jpeg, 0, 0);
113                } finally {
114                    contentStream.close();
115                }
116                page.setMediaBox(new PDRectangle(jpeg.getWidth(), jpeg.getHeight()));
117                pdfDocument.addPage(page);
118            } finally {
119                imageStream.close();
120            }
121            setProgress(baseProgress + imageFileLength + 1);
122        }
123    }
124 
125    protected void cleanUpComic()
126        throws Exception {
127        if (pdfDocument != null) {
128            try {
129                if (!isInterrupted() && hasAddedAtLeastOneImage()) {
130                    pdfDocument.save(getTargetComicFile().getAbsolutePath());
131                }
132                pdfDocument.close();
133            } finally {
134                pdfDocument = null;
135            }
136        }
137    }
138 
139    private InputStream createJpegStream(RenderedImage image)
140        throws IOException {
141        InputStream result;
142        ByteArrayOutputStream jpegStream = new ByteArrayOutputStream();
143 
144        try {
145            ImageIO.write(image, "jpeg", jpegStream);
146 
147            byte[] imageData = jpegStream.toByteArray();
148 
149            result = new ByteArrayInputStream(imageData);
150        } finally {
151            jpegStream.close();
152        }
153        return result;
154    }
155}

[all classes][net.sf.jomic.comic]
EMMA 2.0.4217 (C) Vladimir Roubtsov