Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/main/java/net/sf/mcf2pdf/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import net.sf.mcf2pdf.mcfelements.util.ImageUtil;
import net.sf.mcf2pdf.mcfelements.util.PdfUtil;


Expand Down
46 changes: 27 additions & 19 deletions src/main/java/net/sf/mcf2pdf/Mcf2FoConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -175,17 +175,28 @@ public void convert(File mcfFile, OutputStream xslFoOut, int dpi, boolean bindin
// create XSL-FO document
XslFoDocumentBuilder docBuilder = new XslFoDocumentBuilder();

float pageWidth = albumType.getUsableWidth() / 10.0f * 2;
float pageHeight = albumType.getUsableHeight() / 10.0f;

// set page master
docBuilder.addPageMaster("default", pageWidth, pageHeight);

// create master for cover
float coverPageWidth = pageWidth + (albumType.getCoverExtraHorizontal() * 2 + albumType.getSpineWidth(book.getNormalPages())) / 10.0f;
float coverPageHeight = pageHeight + albumType.getCoverExtraVertical() / 10.0f;

docBuilder.addPageMaster("cover", coverPageWidth, coverPageHeight);
// setting page widths for master pages
int coverPageWidthPX = -1;
int coverPageHeightPX = -1;
int pageWidthPX = -1;
int pageHeightPX = -1;

for (McfPage p : book.getPages()) {
if (McfPage.FULLCOVER.matcher(p.getType()).matches() && coverPageWidthPX == -1 && coverPageHeightPX == -1) {
coverPageWidthPX = context.toPixel(p.getBundlesize().getWidth() / 10.0f);
coverPageHeightPX = context.toPixel(p.getBundlesize().getHeight() / 10.0f);
} else if (McfPage.CONTENT.matcher(p.getType()).matches()&& pageWidthPX == -1 && pageHeightPX == -1 ) {
pageWidthPX = context.toPixel(p.getBundlesize().getWidth() / 10.0f);
pageHeightPX = context.toPixel(p.getBundlesize().getHeight() / 10.0f);
}
if (coverPageWidthPX != -1 && coverPageHeightPX != -1 && pageWidthPX != -1 && pageHeightPX != -1) {
break;
}
}

// setting master pages
docBuilder.addPageMaster("cover", coverPageWidthPX, coverPageHeightPX);
docBuilder.addPageMaster("default", pageWidthPX, pageHeightPX);

// prepare temporary folder
log.debug("Preparing temporary working directory");
Expand All @@ -205,7 +216,7 @@ public void convert(File mcfFile, OutputStream xslFoOut, int dpi, boolean bindin

if (leftCover != null) {
log.info("Rendering cover...");
currentPage = new BitmapPageBuilder(coverPageWidth, coverPageHeight, context, tempImageDir);
currentPage = new BitmapPageBuilder(coverPageWidthPX, coverPageHeightPX, context, tempImageDir);
processDoublePage(leftCover, rightCover, imageDir, false);
docBuilder.startFlow("cover");
currentPage.addToDocumentBuilder(docBuilder);
Expand All @@ -230,7 +241,7 @@ public void convert(File mcfFile, OutputStream xslFoOut, int dpi, boolean bindin
// now, process pages as a pair
docBuilder.startFlow("default");
log.debug("Starting rendering of " + normalPages.size() + " pages");
currentPage = new BitmapPageBuilder(pageWidth, pageHeight, context, tempImageDir);
currentPage = new BitmapPageBuilder(pageWidthPX, pageHeightPX, context, tempImageDir);

for (int i = 0; i < normalPages.size(); i += 2) {
log.info("Rendering pages " + i + "+" + (i+1) + "...");
Expand All @@ -239,8 +250,7 @@ public void convert(File mcfFile, OutputStream xslFoOut, int dpi, boolean bindin
imageDir, binding);
currentPage.addToDocumentBuilder(docBuilder);
if (i < normalPages.size() - 2) {
docBuilder.newPage();
currentPage = new BitmapPageBuilder(pageWidth, pageHeight, context, tempImageDir);
currentPage = new BitmapPageBuilder(pageWidthPX, pageHeightPX, context, tempImageDir);
}
}

Expand All @@ -253,7 +263,7 @@ public void convert(File mcfFile, OutputStream xslFoOut, int dpi, boolean bindin

private void processDoublePage(McfPage leftPage, McfPage rightPage, File imageDir,
boolean addBinding) throws IOException {
// handle packgrounds
// handle backgrounds
PageBackground bg = new PageBackground(
leftPage == null ? Collections.<McfBackground>emptyList() : leftPage.getBackgrounds(),
rightPage == null ? Collections.<McfBackground>emptyList() : rightPage.getBackgrounds());
Expand Down Expand Up @@ -282,9 +292,7 @@ else if (McfArea.TEXTAREA.matcher(a.getAreaType()).matches()) {
}

if (addBinding) {
currentPage.addDrawable(new PageBinding(resources.getBinding(),
(albumType.getUsableWidth() + albumType.getBleedMargin()) / 10.0f * 2,
(albumType.getUsableHeight() + albumType.getBleedMargin() * 2) / 10.0f));
currentPage.addDrawable(new PageBinding(resources.getBinding()));
}
}

Expand Down
11 changes: 11 additions & 0 deletions src/main/java/net/sf/mcf2pdf/mcfelements/McfBundlesize.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package net.sf.mcf2pdf.mcfelements;

public interface McfBundlesize {

public McfPage getPage();

public int getHeight();

public int getWidth();

}
2 changes: 2 additions & 0 deletions src/main/java/net/sf/mcf2pdf/mcfelements/McfPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public interface McfPage {
public final static Pattern SPINE = Pattern.compile("SPINE|spine");

public McfFotobook getFotobook();

public McfBundlesize getBundlesize();

public List<? extends McfArea> getAreas();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import net.sf.mcf2pdf.mcfelements.McfArea;
import net.sf.mcf2pdf.mcfelements.McfBackground;
import net.sf.mcf2pdf.mcfelements.McfBorder;
import net.sf.mcf2pdf.mcfelements.McfBundlesize;
import net.sf.mcf2pdf.mcfelements.McfClipart;
import net.sf.mcf2pdf.mcfelements.McfFotobook;
import net.sf.mcf2pdf.mcfelements.McfImage;
Expand Down Expand Up @@ -100,6 +101,12 @@ public void configureDigester(Digester digester, File mcfFile)
digester.addSetTop("fotobook/page", "setFotobook");
DigesterUtil.addSetProperties(digester, "fotobook/page", getSpecialPageAttributes());
digester.addSetNext("fotobook/page", "addPage", McfPage.class.getName());

// bundlesize element
digester.addObjectCreate("fotobook/page/bundlesize", getBundlesizeClass());
digester.addSetTop("fotobook/page/bundlesize", "setPage");
digester.addSetProperties("fotobook/page/bundlesize");
digester.addSetNext("fotobook/page/bundlesize", "setBundlesize", McfBundlesize.class.getName());

// background element
digester.addObjectCreate("fotobook/page/background", getBackgroundClass());
Expand Down Expand Up @@ -228,6 +235,10 @@ protected List<String[]> getSpecialPageAttributes() {
result.add(new String[] { "pagenr", "pageNr" });
return result;
}

protected Class<? extends McfBundlesize> getBundlesizeClass() {
return McfBundlesizeImpl.class;
}

protected Class<? extends McfBackground> getBackgroundClass() {
return McfBackgroundImpl.class;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package net.sf.mcf2pdf.mcfelements.impl;

import net.sf.mcf2pdf.mcfelements.McfBundlesize;
import net.sf.mcf2pdf.mcfelements.McfPage;

public class McfBundlesizeImpl implements McfBundlesize {

private McfPage page;
private int height;
private int width;

@Override
public McfPage getPage() {
return page;
}

public void setPage(McfPage page) {
this.page = page;
}

@Override
public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

@Override
public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}

}
11 changes: 11 additions & 0 deletions src/main/java/net/sf/mcf2pdf/mcfelements/impl/McfPageImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public class McfPageImpl implements McfPage {

private McfFotobook fotobook;

private McfBundlesize bundlesize;

private int pageNr;

private String type;
Expand Down Expand Up @@ -62,4 +64,13 @@ public void setType(String type) {
this.type = type;
}

@Override
public McfBundlesize getBundlesize() {
return bundlesize;
}

public void setBundlesize(McfBundlesize bundlesize) {
this.bundlesize = bundlesize;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,11 @@ public XslFoDocumentBuilder() {
document.addContent(e);
}

public void addPageMaster(String name, float widthMM, float heightMM) {
public void addPageMaster(String name, int widthPX, int heightPX) {
Element m = new Element("simple-page-master", ns);
m.setAttribute("master-name", name);
m.setAttribute("page-width", widthMM + "mm");
m.setAttribute("page-height", heightMM + "mm");
m.setAttribute("margin", "0mm");
m.setAttribute("page-width", widthPX + "px");
m.setAttribute("page-height", heightPX + "px");

Element body = new Element("region-body", ns);
m.addContent(body);
Expand All @@ -62,7 +61,6 @@ public void startFlow(String masterName) {

Element ps = new Element("page-sequence", ns);
ps.setAttribute("master-reference", masterName);
ps.setAttribute("id", masterName);
Element f = new Element("flow", ns);
f.setAttribute("flow-name", "xsl-region-body");
ps.addContent(f);
Expand All @@ -80,9 +78,9 @@ public void newPage() {

Element e = new Element("block", ns);
e.setAttribute("break-after", "page");
e.setAttribute("padding", "0mm");
e.setAttribute("margin", "0mm");
e.setAttribute("border-width", "0mm");
e.setAttribute("padding", "0px");
e.setAttribute("margin", "0px");
e.setAttribute("border-width", "0px");
flow.addContent(e);
}

Expand All @@ -94,28 +92,18 @@ public Namespace getNamespace() {
return ns;
}

public void addPageElement(Element element, float widthMM, float heightMM) {
public void addPageElement(String imgSource) {
if (flow == null)
throw new IllegalStateException("Please call startFlow() first");

// create block container
Element bc = new Element("block-container",ns);
bc.setAttribute("absolute-position", "absolute");
bc.setAttribute("left", "0mm");
bc.setAttribute("top", "0mm");
bc.setAttribute("width", widthMM + "mm");
bc.setAttribute("height", heightMM + "mm");

// create block
Element b = new Element("block", ns);
b.setAttribute("margin", "0mm");
b.setAttribute("padding", "0mm");
b.setAttribute("border-width", "0mm");
bc.addContent(b);

b.addContent(element);
bc.setAttribute("background-image", imgSource);
bc.setAttribute("width", "100%");
bc.setAttribute("height", "100%");
bc.addContent(new Element("block", ns));

flow.addContent(bc);
}
}

}
28 changes: 11 additions & 17 deletions src/main/java/net/sf/mcf2pdf/pagebuild/BitmapPageBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@

import net.sf.mcf2pdf.mcfelements.util.XslFoDocumentBuilder;

import org.jdom.Element;
import org.jdom.Namespace;


Expand All @@ -34,9 +33,9 @@ public class BitmapPageBuilder extends AbstractPageBuilder {

private PageRenderContext context;

private float widthMM;
private int widthPX;

private float heightMM;
private int heightPX;

private static final Comparator<PageDrawable> zComp = new Comparator<PageDrawable>() {
@Override
Expand All @@ -45,10 +44,10 @@ public int compare(PageDrawable p1, PageDrawable p2) {
}
};

public BitmapPageBuilder(float widthMM, float heightMM,
public BitmapPageBuilder(int widthPX, int heightPX,
PageRenderContext context, File tempImageDir) throws IOException {
this.widthMM = widthMM;
this.heightMM = heightMM;
this.widthPX = widthPX;
this.heightPX = heightPX;
this.context = context;
this.tempImageDir = tempImageDir;
}
Expand All @@ -62,8 +61,7 @@ public void addToDocumentBuilder(XslFoDocumentBuilder docBuilder)

context.getLog().debug("Creating full page image from page elements");

BufferedImage img = new BufferedImage(context.toPixel(widthMM),
context.toPixel(heightMM), BufferedImage.TYPE_INT_ARGB);
BufferedImage img = new BufferedImage(widthPX, heightPX, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
g2d.setColor(Color.white);
g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
Expand All @@ -74,7 +72,7 @@ public void addToDocumentBuilder(XslFoDocumentBuilder docBuilder)

Point offset = new Point();
try {
BufferedImage pdImg = pd.renderAsBitmap(context, offset);
BufferedImage pdImg = pd.renderAsBitmap(context, offset, widthPX, heightPX);
if (pdImg != null)
g2d.drawImage(pdImg, left + offset.x, top + offset.y, null);
}
Expand All @@ -84,11 +82,11 @@ public void addToDocumentBuilder(XslFoDocumentBuilder docBuilder)
}
}

docBuilder.addPageElement(createXslFoElement(img, docBuilder.getNamespace()), widthMM, heightMM);
docBuilder.addPageElement(createImgFoElement(img, docBuilder.getNamespace()));
g2d.dispose();
}

private Element createXslFoElement(BufferedImage img, Namespace xslFoNs) throws IOException {
private String createImgFoElement(BufferedImage img, Namespace xslFoNs) throws IOException {
// save bitmap to file
File f;
int i = 1;
Expand All @@ -103,14 +101,10 @@ private Element createXslFoElement(BufferedImage img, Namespace xslFoNs) throws
g2d.dispose();

ImageIO.write(imgPlain, "jpeg", f);

Element eg = new Element("external-graphic", xslFoNs);
eg.setAttribute("src", f.getAbsolutePath());
eg.setAttribute("content-width", widthMM + "mm");
eg.setAttribute("content-height", heightMM + "mm");
String src = f.getAbsolutePath();
f.deleteOnExit();

return eg;
return src;
}


Expand Down
11 changes: 2 additions & 9 deletions src/main/java/net/sf/mcf2pdf/pagebuild/PageBackground.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

import net.sf.mcf2pdf.mcfelements.McfBackground;
import net.sf.mcf2pdf.mcfelements.util.ImageUtil;
import net.sf.mcf2pdf.mcfglobals.McfAlbumType;


public class PageBackground implements PageDrawable {
Expand All @@ -41,17 +40,11 @@ public void renderAsSvgElement(Writer writer, PageRenderContext context) throws

@Override
public BufferedImage renderAsBitmap(PageRenderContext context,
Point drawOffsetPixels) throws IOException {
Point drawOffsetPixels, int widthPX, int heightPX) throws IOException {
File fLeft = extractBackground(leftBg, context);
File fRight = extractBackground(rightBg, context);

McfAlbumType albumType = context.getAlbumType();

float widthMM = (albumType.getUsableWidth() + albumType.getBleedMargin()) / 10.0f * 2;
float heightMM = (albumType.getUsableHeight() + albumType.getBleedMargin() * 2) / 10.0f;

BufferedImage img = new BufferedImage(context.toPixel(widthMM),
context.toPixel(heightMM), BufferedImage.TYPE_INT_ARGB);
BufferedImage img = new BufferedImage(widthPX, heightPX, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
Expand Down
Loading