/*******************************************************************************
* Copyright (c) MOBAC developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package mobac.program.atlascreators;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import mobac.exceptions.MapCreationException;
import mobac.program.ProgramInfo;
import mobac.program.annotations.AtlasCreatorName;
import mobac.program.model.UnitSystem;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;
@AtlasCreatorName(value = "Paper Atlas (PDF)")
public class PaperAtlasPdf extends PaperAtlas {
private Document document;
public PaperAtlasPdf() {
super(false);
}
private Document createDocument(Rectangle r) throws MapCreationException {
File pdfFile = new File(getLayerFolder(), map.getName() + ".pdf");
float left = (float) s.marginLeft;
float right = (float) s.marginRight;
float top = (float) s.marginTop;
float bottom = (float) s.marginBottom;
Document document = new Document(r, left, right, top, bottom);
PdfWriter pdfWriter;
try {
pdfFile.createNewFile();
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
} catch (IOException e) {
throw new MapCreationException(map, e);
} catch (DocumentException e) {
throw new MapCreationException(map, e);
}
pdfWriter.setCompressionLevel(s.compression);
document.open();
document.addAuthor(ProgramInfo.PROG_NAME);
document.addCreationDate();
document.addCreator(ProgramInfo.PROG_NAME);
document.addProducer();
return document;
}
@Override
public void createMap() throws MapCreationException, InterruptedException {
if (s.paperSize != null) {
document = createDocument(s.paperSize.createRectangle());
}
try {
super.createMap();
} finally {
try {
document.close();
} catch (Exception e) {
new MapCreationException(map, e);
}
document = null;
}
}
@Override
protected void processPage(BufferedImage image, int pageNumber) throws MapCreationException {
int imageWidth = image.getWidth();
int imageHeight = image.getHeight();
if (document == null) {
double width = UnitSystem.pixelsToPoints(imageWidth, s.dpi);
double height = UnitSystem.pixelsToPoints(imageHeight, s.dpi);
width += s.marginLeft + s.marginRight;
height += s.marginTop + s.marginBottom;
Rectangle r = new Rectangle((float) width, (float) height);
document = createDocument(r);
}
Image iTextImage;
try {
iTextImage = Image.getInstance(image, Color.WHITE);
} catch (BadElementException e) {
throw new MapCreationException(map, e);
} catch (IOException e) {
throw new MapCreationException(map, e);
}
iTextImage.setCompressionLevel(s.compression);
iTextImage.setDpi(s.dpi, s.dpi);
float width = (float) UnitSystem.pixelsToPoints(imageWidth, s.dpi);
float height = (float) UnitSystem.pixelsToPoints(imageHeight, s.dpi);
iTextImage.scaleAbsolute(width, height);
try {
document.add(iTextImage);
} catch (DocumentException e) {
throw new MapCreationException(map, e);
}
document.newPage();
}
}