Водяной знак по всей странице в JasperReports

Мы используем jasperReports и iReports в нашем веб-приложении для создания отчетов.

Когда я исследовал отчеты о яшме, я смог легко вставить водяной знак в отчет.

Однако моя цель состоит в том, чтобы поставить водяной знак String say (Майкл Джексон) на всю страницу.

Просматривая свойства, я могу найти только rotation option of left/right and upside down...

Можно ли разместить водяной знак в отчете по всей странице..

Я использую ireport для разработки отчета...


person AngelsandDemons    schedule 26.07.2012    source источник


Ответы (3)


Поворот текста на любой угол, кроме 90, 180 или 270 градусов, изначально не поддерживается JasperReports. Решением было бы создать изображение повернутого текста и вместо этого отобразить его в отчете.

В последнем сообщении этой ветки jasperforge, пользователь «artduc» поделился скриптлетом отчета, чтобы сделать именно это.

person GenericJon    schedule 26.07.2012
comment
GenericJon Я предполагаю, что поворот изображения с помощью любого стандартного инструмента для редактирования изображений будет служить этой цели. Использование скриптлета в коде без необходимости добавит одну дополнительную банку в мое приложение. Спасибо за комментарии... - person AngelsandDemons; 28.07.2012

Я просто излагаю то, что предложил 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);
    }
  }
}

И результат:

person Reto Höhener    schedule 05.04.2015
comment
что вы ставите в качестве класса в jrxml? ‹имя параметра=класс водяного знака=?/› - person user2976568; 02.07.2020

Вы можете использовать iText для чтения PDF-файла, созданного с помощью отчетов jasper. Либо прочитайте 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();
person Sumanth    schedule 06.08.2017