我们在 Web 应用程序中使用 jasperReports 和 iReports 来生成报告。
当我探索碧玉报告时,我能够轻松地在报告中插入水印..
但是我的目的是将水印字符串说(迈克尔杰克逊)放在页面上。
通过我只能找到的属性rotation option of left/right and upside down
...
是否可以在整个页面的报告中放置水印..
我正在使用ireport
设计报告...
我们在 Web 应用程序中使用 jasperReports 和 iReports 来生成报告。
当我探索碧玉报告时,我能够轻松地在报告中插入水印..
但是我的目的是将水印字符串说(迈克尔杰克逊)放在页面上。
通过我只能找到的属性rotation option of left/right and upside down
...
是否可以在整个页面的报告中放置水印..
我正在使用ireport
设计报告...
JasperReports 本身不支持将文本旋转到 90、180 或 270 度以外的任何角度。一种解决方案是生成旋转文本的图像并将其呈现在报告上。
在这个 jasperforge 线程的最后一篇文章中,用户“artduc”分享了一个报告脚本来实现这一点。
我只是在说明 GenericJon 的建议...
将图像元素添加到背景带(设置见屏幕截图)。
实现 Renderable 并通过参数映射将其传递给 Jasper Reports:
InputStream jasperReportInputStream = getClass().getResourceAsStream("/reports/Test.jasper");
JRBeanCollectionDataSource dataSource = ...
Map parameters = new HashMap();
parameters.put("watermark", new WaterMarkRenderer(true);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReportInputStream, parameters, dataSource);
水印渲染器:
@SuppressWarnings("deprecation")
public class WaterMarkRenderer extends JRAbstractRenderer
{
private boolean m_licenseTrial = false;
public WaterMarkRenderer(boolean isLicenseTrial)
{
m_licenseTrial = isLicenseTrial;
}
@Override
public byte getType()
{
// no idea what this does
return RenderableTypeEnum.SVG.getValue();
}
@Override
public byte getImageType()
{
// no idea what this does
return ImageTypeEnum.UNKNOWN.getValue();
}
@Override
public Dimension2D getDimension() throws JRException
{
// A4 in pixel: 595x842
// this seems to override whatever is configured in jasperreports studio
return new Dimension(595 - 2 * 40, 700);
}
@Override
public byte[] getImageData() throws JRException
{
// no idea what this does
return new byte[0];
}
@Override
public void render(Graphics2D g2, Rectangle2D rectangle) throws JRException
{
if(m_licenseTrial)
{
AffineTransform originalTransform = g2.getTransform();
// just for debugging
g2.setColor(Color.BLUE);
g2.draw(rectangle);
g2.translate(rectangle.getX() + 100, rectangle.getMaxY());
g2.rotate(-55 * Math.PI / 180);
Font font = new Font("Arial", Font.PLAIN, 120);
Shape shape = font.createGlyphVector(g2.getFontRenderContext(), "Trial License").getOutline();
g2.setColor(new Color(255, 0, 0, 100));
g2.setStroke(new BasicStroke(1));
g2.draw(shape);
g2.setTransform(originalTransform);
}
}
}
结果:
您可以使用 iText 阅读您使用 jasper 报告创建的 pdf。要么将 pdf 读取为 byteArray。然后使用 itext PdfReader 使用它
byte [] dataArray = JasperExportManager.exportReportToPdf(jasperPrint);
PdfReader pdfReader = new PdfReader(dataArray);
或从某个位置读取 pdf(如果已写入)
JasperExportManager.exportReportToPdfFile(jasperPrint,pdfFileLocation);
PdfReader pdfReader = new PdfReader(pdfFileLocation);
我希望下面的代码片段有助于我从哪里读取文件并添加水印,删除现有文件并编写新文件。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BaseFont bf = null;
PdfBoolean pdfBoolean_YES = new PdfBoolean(true);
PdfReader pdfReader = new PdfReader(pdfFileLocation);
PdfStamper pdfStamper = new PdfStamper(pdfReader, baos);
PdfContentByte contentunder = pdfStamper.getUnderContent(1);
contentunder.saveState();
contentunder.setColorFill(new Color(200, 200, 200));
contentunder.beginText();
bf = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
contentunder.setFontAndSize(bf, 90);
contentunder.showTextAligned(Element.ALIGN_MIDDLE, " WaterMark Content", 200, 400, 45);
contentunder.endText();
contentunder.restoreState();
// We could stack those ViewerPreferences using '|' ... :)
pdfStamper.addViewerPreference(PdfName.HIDETOOLBAR, pdfBoolean_YES);
pdfStamper.addViewerPreference(PdfName.HIDEMENUBAR, pdfBoolean_YES);
//pdfStamper.addViewerPreference(PdfName.HIDEWINDOWUI, pdfBoolean_YES);
pdfReader.close();
pdfStamper.close();
//deleting existing file
FileUtil.delete(pdfFileLocation);
FileOutputStream fos = new FileOutputStream(pdfFileLocation);
baos.writeTo(fos);
fos.flush();
//close streams
baos.close();
fos.close();