app/redact/Image.scala (27 lines of code) (raw):

package redact import java.awt.Color import javax.imageio.ImageIO import java.awt.image.BufferedImage import java.io.ByteArrayOutputStream import org.apache.pdfbox.pdmodel.PDDocument import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject object Image { def placeholder(width: Int, height: Int, document: PDDocument): PDImageXObject = { val img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) val graphics = img.createGraphics graphics.setBackground(Color.LIGHT_GRAY) graphics.setColor(Color.DARK_GRAY) graphics.clearRect(0, 0, img.getWidth, img.getHeight()) graphics.drawRect(0, 0, img.getWidth - 1, img.getHeight - 1) graphics.drawLine(0, 0, img.getWidth, img.getHeight) graphics.drawLine(img.getWidth, 0, 0, img.getHeight) PDImageXObject.createFromByteArray(document, toByteArray(img, format = "png"), "redacted.png") } private def toByteArray(image: BufferedImage, format: String): Array[Byte] = try { val out = new ByteArrayOutputStream try { ImageIO.write(image, format, out) out.toByteArray } finally if (out != null) out.close() } }