PdfSurface.java
package io.brunoborges.jairosvg.surface;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
/**
* PDF output surface using Apache PDFBox. Renders SVG to a BufferedImage via
* the base Surface, then embeds it in a PDF page.
*/
public final class PdfSurface extends Surface {
@Override
public void finish() throws IOException {
super.finish();
if (output == null || image == null)
return;
try (PDDocument doc = new PDDocument()) {
float pdfWidth = (float) width;
float pdfHeight = (float) height;
PDPage page = new PDPage(new PDRectangle(pdfWidth, pdfHeight));
doc.addPage(page);
PDImageXObject pdfImage = LosslessFactory.createFromImage(doc, image);
try (PDPageContentStream cs = new PDPageContentStream(doc, page)) {
// PDF coordinate origin is bottom-left, so flip vertically
cs.drawImage(pdfImage, 0, 0, pdfWidth, pdfHeight);
}
doc.save(output);
}
}
}