public class WatermarkContentTransformer extends AbstractContentTransformer implements ContentTransformer {
private static final String WATERMARK_IMAGE_PATH = "/app:company_home/app:dictionary/app:space_templates/cm:watermark.png";
private NodeService nodeService;
private ContentService contentService;
public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; }
public void setContentService(ContentService contentService) { this.contentService = contentService; }
public boolean isTransformable(String sourceMimetype, String targetMimetype, TransformationOptions options) { // 只对PDF文件应用水印 return sourceMimetype.equals(MimetypeMap.MIMETYPE_PDF); }
public boolean isQuick() { return false; }
public void transform(ContentReader reader, ContentWriter writer, TransformationOptions options) throws Exception { // 如果文档已经应用过水印,则直接复制内容 if (reader.getReader() != null && reader.getReader().markSupported()) { reader.getReader().reset(); while (reader.getReader().read() != -1) { // do nothing, just copy } return; }
// 获取当前用户所在的所有组
AuthenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork() {
public Void doWork() throws Exception {
Set groups = AuthorityService.getAuthorityService().getAuthoritiesForUser(AuthenticationUtil.getFullyAuthenticatedUser());
for(String group : groups){
// 可以根据组名来判断是否应用水印
if(group.equals("some_group")){
applyWatermark(reader, writer);
return null;
}
}
return null;
}
});
}
private void applyWatermark(ContentReader reader, ContentWriter writer) throws Exception { OutputStream os = null; try { // 加载水印图像 ContentReader watermarkReader = contentService.getReader(WATERMARK_IMAGE_PATH); BufferedImage watermarkImage = ImageIO.read(watermarkReader.getStream()); PDFParser parser = new PDFParser(new ByteArrayInputStream(reader.getContent())); parser.parse(); PDDocument document = parser.getPDDocument(); os = writer.getContentOutputStream(); // 应用水印 PDFGraphics2D pdfGraphics = new PDFGraphics2D(document, document.getPage(0)); pdfGraphics.drawImage(watermarkImage, null, 0, 0); pdfGraphics.dispose(); // 将处理后的文档写入outputstream document.save(os); // 将处理后的文档保存在node上 nodeService.setProperty(writer.getNodeRef(), ContentModel.PROP_CONTENT, writer.getContentData()); nodeService.setProperty(writer.getNodeRef(), ContentModel.PROP_MIME_TYPE, MimetypeMap.MIMETYPE_PDF); } finally { if(os != null) { os.close(); } } }
}
content.transformer.watermark.transformer.watermark.class=org.example.temp.WatermarkContentTransformer content.transformer.watermark.transformer.watermark.extensions.pdf=pdf content.transformer.watermark.transform