2011-12-08 18 views
5

Próbuję załadować obraz z bazy danych PostgreSQL do raportów ipersport jaspersoft (4.0), ale pojawia się błąd.Wyświetlanie obrazu w Ireports przy użyciu PostgreSql

W obrazie PostgreSQL jest przechowywany jako obiekt typu bytea. W raportach zmieniłem właściwość pola obrazu na java.io.InputStream.

Po umieszczeniu obrazu w raporcie zostały ustalone następujące właściwości: klasa

Expression: java.io.InputStream wyraz Obrazu: image field

Próbowałem też this samouczek do wyświetlania obrazów blob w iReport. Wyświetlane

jest następujący błąd:

Error filling print... Image read failed. 
Setting up the file resolver...  
net.sf.jasperreports.engine.JRException: Image read failed.  
    at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73)  
    at net.sf.jasperreports.engine.util.JRImageLoader.loadImage(JRImageLoader.java:245)  
    at net.sf.jasperreports.engine.JRImageRenderer.getImage(JRImageRenderer.java:476)  
    at net.sf.jasperreports.engine.JRImageRenderer.getDimension(JRImageRenderer.java:512)  
    at net.sf.jasperreports.engine.fill.JRFillImage.fitImage(JRFillImage.java:1251)  
    at net.sf.jasperreports.engine.fill.JRFillImage.prepare(JRFillImage.java:1173)  
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:329)  
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:419)  
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:378)  
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2038)  
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:760)  
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:270)  
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128)  
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)  
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:845)  
    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)  
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)  
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247)  
    at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:877)  
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)  
    at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)  
Print not filled. Try to use an EmptyDataSource... 
+0

Czy możesz umieścić kod i szablon raportu? –

+0

Używam edycji profesjonalnej ireports Stworzyłem tabelę w postgresie z następującymi kolumnami log -double lat -double obraz-bytea Szablon - pusty szablon A4 Następnie po umieszczeniu elementu raportu obrazu z palety na raporcie skonfigurowano wyrażenie graficzne i klasę wyrażenia (java.io.InputStream) Po uruchomieniu raportu wyświetla się komunikat o błędzie "Błąd wyświetlania strony raportu. Patrz konsola dla szczegółów." Błędy zostały zamieszczone powyżej w pytaniu. Ale gdy usuwam element obrazu z raportu, działa dobrze – 3502

+0

po wyrażeniu wyrażenia obrazu? –

Odpowiedz

1

Wyświetlanie obrazu z plama (postgresql) do obrazowania w iReport

PostgreSQL obraz jest przechowywany jako blob-OID
kodu wewnątrz ReportController

  1. pobierania że ciąg oid z bazy danych zamień go na bajt
  2. przeliczyć wartość Tablica bajtów w InputStream wartość
  3. mapie to do parametru, który będzie używany wewnątrz iReport
  4. Weźmy jeden element obrazu zmienić jego typ na java.io.InputStream
  5. Utwórz jeden parametr typu java.io.InputStream (stosować taką samą nazwę, jak zaplanowano wewnątrz ReportController)
  6. teraz budować projekt i uruchomić
2

spędzeniu prawie jeden dzień, w końcu znaleźć rozwiązanie;

  1. w zapytaniu SQL select convert(your_image,'base64') as img from yourtable
  2. zestaw ekspresji klasy obraz do java.io.InputStream
  3. ekspresji obrazu net.sf.jasperreports.engine.util.JRImageLoader.getInstance(new SimpleJasperReportsContext()).loadAwtImageFromBytes(javax.xml.bind.DatatypeConverter.parseBase64Binary($F{img}))

EDIT:

wersja

My PostgreSQL: 9,4,

Dzięki FiruzzZ stwierdził, że w postgresql 9.1 zamiast funkcji konwersji, kodowanie (bytea, "base64") jest dostępne.

+0

konwersji (bytea, ciąg) nie działa, funkcja jest nieznana dla Postgres 9.1. Użyłem kodowania (bytea, "base64") i pracował – FiruzzZ

+0

Dziękuję za Twój komentarz. Edytowałem odpowiedź. – ismail

Powiązane problemy