【问题标题】:Watermark across the page in JasperReportsJasperReports 中跨页面的水印
【发布时间】:2012-07-26 08:51:10
【问题描述】:

我们在 Web 应用程序中使用 jasperReports 和 iReports 来生成报告。

当我探索 jasper 报告时,我能够轻松地在报告中插入水印..

但是我的目的是将水印字符串说(迈克尔杰克逊)放在页面上。

翻遍属性我只能找到rotation option of left/right and upside down...

是否可以在整个页面的报告中放置水印..

我正在使用ireport 来设计报告...

【问题讨论】:

    标签: jasper-reports reporting ireport


    【解决方案1】:

    JasperReports 本身不支持将文本旋转到 90、180 或 270 度以外的任何角度。一种解决方案是生成旋转文本的图像并将其呈现在报告上。

    this jasperforge thread 的最后一篇文章中,用户“artduc”分享了一个报告脚本来实现这一点。

    【讨论】:

    • GenericJon 我想使用任何标准图像编辑器工具旋转图像都可以达到目的..在代码中使用 scriptlet 会不必要地为我的应用程序添加一个额外的 jar..感谢 cmets...
    【解决方案2】:

    我只是在说明 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);
        }
      }
    }
    

    结果:

    【讨论】:

    • 你把什么作为类放在 jrxml 中?
    【解决方案3】:

    您可以使用 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);
    

    我希望下面的 sn-p 可以帮助我从哪里读取文件并添加水印,删除现有文件并写入新文件。

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      相关资源
      最近更新 更多