Autor Thema: Barcode in Notes Dokumente einbinden  (Gelesen 6481 mal)

Offline michael-r

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.768
Barcode in Notes Dokumente einbinden
« am: 23.04.10 - 11:11:38 »
Hallo,

ich suche grade eine Möglichkeit Barcodes in Notes Dokumente einzubinden. Das einfachste wäre natürlich eine Barcode Schriftart, allerdings bin ich da auf Java und ein Open Source Projekt gestossen:
http://barcode4j.sourceforge.net/

Ich habe schon geschaft das Archiv und Teile eines Beispieles in einen Agenten zu importieren bzw zu kopieren.

Das Beispiel sieht so aus:
public static void main(String[] args) {
              try {
                  //Create the barcode bean
                  Code39Bean bean = new Code39Bean();
                 
                  final int dpi = 150;
                 
                  //Configure the barcode generator
                  bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi)); //makes the narrow bar
                                                                   //width exactly one pixel
                  bean.setWideFactor(3);
                  bean.doQuietZone(false);
                 
                  //Open output file
                  File outputFile = new File("out.jpg");
                  OutputStream out = new FileOutputStream(outputFile);
                  try {
                      //Set up the canvas provider for monochrome JPEG output
                      BitmapCanvasProvider canvas = new BitmapCanvasProvider(
                              out, "image/jpeg", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
                 
                      //Generate the barcode
                      bean.generateBarcode(canvas, "123456");
                 
                      //Signal end of generation
                      canvas.finish();
                  } finally {
                      out.close();
                  }


Es wird ein jpg erstellt mit dem Barcode String 123456.

Meine Frage hat jemand schonmal damit was gemacht?
Ich müsste nun ein String übergeben können, und das erstellte jpg in ein Dokument importieren.

MFG Michael

Offline michael-r

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.768
Re: Barcode in Notes Dokumente einbinden
« Antwort #1 am: 23.04.10 - 17:04:49 »
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
   
Set uidoc = workspace.CurrentDocument
Call uidoc.GotoField("InvBar")
Call uidoc.Import("JPEG Image", "c:\barcode.jpg")

Ok den Import hab ich mir gegooglt+Hilfe... kann man das auch irgendwie Variable machen, so dass der Import auch unter Linux/Mac geht?

Obwohl das ist erstmal unwichtig. Aber kann ich das mit %Windir% oder so variable machen, so das die Barcodes nicht irgendwo rumstehen, sondern irgendwann auch im Temp gelöscht werden?

Ahhh geht mit tempdir$ = Environ("temp"), grade im Forum gefunden.

MFG Michael

« Letzte Änderung: 23.04.10 - 17:17:30 von michael-r »

Offline michael-r

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.768
Re: Barcode in Notes Dokumente einbinden
« Antwort #2 am: 24.04.10 - 10:40:50 »
So das ganze sieht jetzt wie folgt aus, allerdings wie übergebe ich meine Werte von LotusScript zu dem Java Agenten  ???.

Also ich glaub der Agent muss in Java aufgerufen werden.

Java:
* Copyright 2004 Jeremias Maerki. *

import lotus.domino.*;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;


public class JavaAgent extends AgentBase {
      
   public void NotesMain() {

         try {
             Session session = getSession();
             AgentContext agentContext = session.getAgentContext();

            barcode39(inventarnr, tempdir);

         } catch(Exception e) {
             e.printStackTrace();
          }
      }
   
   
          public static void barcode39(String barcode, String tempdir)
          {
              try {
                  //Create the barcode bean
                  Code39Bean bean = new Code39Bean();
                 
                  final int dpi = 150;
                 
                  //Configure the barcode generator
                  bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi)); //makes the narrow bar
                                                                   //width exactly one pixel
                  bean.setWideFactor(3);
                  bean.doQuietZone(false);
                 
                  //Open output file
                  File outputFile = new File(tempdir + "barcode.jpg");
                  OutputStream out = new FileOutputStream(outputFile);
                  try {
                      //Set up the canvas provider for monochrome JPEG output
                      BitmapCanvasProvider canvas = new BitmapCanvasProvider(
                              out, "image/jpeg", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
                 
                      //Generate the barcode
                      bean.generateBarcode(canvas, barcode);
                 
                      //Signal end of generation
                      canvas.finish();
                  } finally {
                      out.close();
                  }

      } catch(Exception e) {
          e.printStackTrace();
       }
   }
}


Das LotusScript bei QuerySave der Maske sieht so aus:

Sub Querysave(Source As Notesuidocument, Continue As Variant)
   Dim workspace As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Dim tempdir As String   
   
   'Import des Barcode JPG
   tempdir$ = Environ("temp")
   tempdir= tempdir + "\"
      
   Set agent = db.GetAgent( "BarcodeCode39")
   Call agent.run
   
   Set uidoc = workspace.CurrentDocument
   Call uidoc.FieldClear("InvBarcode")       
   Call uidoc.GotoField("InvBarcode")
   Call uidoc.Import("JPEG Image", tempdir +"barcode.jpg")
   
   'Print tempdir
   
End Sub

Nun müsste ich doch irgendwie die Werte beim Aufruf des Java Agenten mit übergeben können?
Irgendwie komm ich da nicht weiter  ::)

MFG Michael

Offline gossifu

  • Senior Mitglied
  • ****
  • Beiträge: 352
  • Geschlecht: Männlich
  • Dummheit schafft Freizeit
Re: Barcode in Notes Dokumente einbinden
« Antwort #3 am: 24.04.10 - 11:08:19 »
Hallo,

schreib doch den Wert in dein Dokument in ein verstecktes Feld. Speichern nicht vergessen.
Dann übergibst Du das Dokument beim Agentenaufruf an den Agenten (agent.run(doc.NoteID)).
Im Agenten holst Du Dir das Dokument so:

Code
Database db = agentContext.getCurrentDatabase();
Agent ag = agentContext.getCurrentAgent();
Document doc = db.getDocumentByID(ag.getParameterDocID());
String inventarnr = doc.getItemValueString("Feldname des umzusetzenden Textes");

mfg

Kjeld
Immer lustig und vergnügt, bis der A.... im Sarge liegt. ;-)

Offline michael-r

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.768
Re: Barcode in Notes Dokumente einbinden
« Antwort #4 am: 24.04.10 - 12:01:13 »
Danke für die Antwort.

So nun hab ich das so probiert:
public class JavaAgent extends AgentBase {
   private Database db;
   private Agent ag;
   private String inventarnr;
   private String tempdir;
   
   public void NotesMain() {

         try {
             Session session = getSession();
             AgentContext agentContext = session.getAgentContext();

             db = agentContext.getCurrentDatabase();
             ag = agentContext.getCurrentAgent();
             Document doc = db.getDocumentByID(ag.getParameterDocID());
             inventarnr = doc.getItemValueString("inventarnr_");
             tempdir =   doc.getItemValueString("tempdir_");
         
            barcode39(inventarnr, tempdir);

         } catch(Exception e) {
             e.printStackTrace();
          }
      }
    
    
          public static void barcode39(String barcode, String tempdir)
          {
              try {
                  //Create the barcode bean
                  Code39Bean bean = new Code39Bean();
                  
                  final int dpi = 150;
                  
                  //Configure the barcode generator
                  bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi)); //makes the narrow bar
                                                                   //width exactly one pixel
                  bean.setWideFactor(3);
                  bean.doQuietZone(false);
                  
                  //Open output file
                  File outputFile = new File(tempdir + "barcode.jpg");
                  OutputStream out = new FileOutputStream(outputFile);
                  try {
                      //Set up the canvas provider for monochrome JPEG output
                      BitmapCanvasProvider canvas = new BitmapCanvasProvider(
                              out, "image/jpeg", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
                  
                      //Generate the barcode
                      bean.generateBarcode(canvas, barcode);
                  
                      //Signal end of generation
                      canvas.finish();
                  } finally {
                      out.close();
                  }

      } catch(Exception e) {
          e.printStackTrace();
       }
   }
}


Und der Code in der Maske sieht so aus:
Sub Querysave(Source As Notesuidocument, Continue As Variant)
   Dim workspace As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Dim doc As NotesDocument
   Dim tempdir As String
   Dim db As NotesDatabase
   Dim agent As NotesAgent
   Dim session As New NotesSession
   
   
   Set doc = source.Document
   Set db = session.CurrentDatabase
   
   tempdir$ = Environ("temp")
   tempdir= tempdir + "\"
   Call doc.ReplaceItemValue("inventarnr_", doc.GetItemValue("Inventarnr"))
   Call doc.ReplaceItemValue("tempdir_", tempdir)   
   Call doc.Save(True, False, False)
   
   Set agent = db.GetAgent( "(BarcodeCode39)")
   Call agent.run(doc.NoteID)
   
   'Import des Barcode JPG
   Set uidoc = workspace.CurrentDocument
   Call uidoc.FieldClear("InvBarcode")       
   Call uidoc.GotoField("InvBarcode")
   Call uidoc.Import("JPEG Image", tempdir +"barcode.jpg")
   
   Print tempdir
   
End Sub

2 versteckte Felder habe ich erstellt: tempdir_ und inventarnr_

Allerdings hängt es nun anscheinend am Java Agent... ich bekomme die Meldung:
Notes Fehler: Im Hintergrund ausgeführter oder eingebetteter Agent verwendet einen nicht Unterstützten Auslöser oder Suchtyp.

Och nööö...

Ich hab ja keine Ahnung von Java... aber es sah ja eigentlich soweit gut aus...
« Letzte Änderung: 24.04.10 - 12:06:28 von michael-r »

Offline gossifu

  • Senior Mitglied
  • ****
  • Beiträge: 352
  • Geschlecht: Männlich
  • Dummheit schafft Freizeit
Re: Barcode in Notes Dokumente einbinden
« Antwort #5 am: 24.04.10 - 12:06:34 »
Stell mal die Agenteneigenschaften so ein, das der Agent auf keine Dokumente geht.
Auswahl aus Agentenliste, Dokument Keine.

mfg

Kjeld
Immer lustig und vergnügt, bis der A.... im Sarge liegt. ;-)

Offline michael-r

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.768
Re: Barcode in Notes Dokumente einbinden
« Antwort #6 am: 24.04.10 - 12:18:43 »
Ok habe ich gemacht, denk ich. Ziel >>> Keine, bei dem Auslöser.

Nun bekomme ich die Meldung bei:
Call agent.run(doc.NoteID)

Object Variable not set

Aber NoteID und Doc haben Werte in den Variablen.
Ja ich Dussel  ;D, ich hab um den Agenten zu testen den Agenten umbenannt... Zwecks auswahl im Menü... und agent hatte keinen Wert.

Wow das klappt nun, vielen Dank Kjeld, muss ich bzw sollte ich im Querysave noch irgendwelche Sachen abfangen?

MFG Michael


« Letzte Änderung: 24.04.10 - 12:21:36 von michael-r »

Offline gossifu

  • Senior Mitglied
  • ****
  • Beiträge: 352
  • Geschlecht: Männlich
  • Dummheit schafft Freizeit
Re: Barcode in Notes Dokumente einbinden
« Antwort #7 am: 24.04.10 - 12:21:59 »
Prüf nochmal den Agentennamen im Agenten und im Code.
Bei Einstellung 'Aus Agentenliste' sollte man den Aliasnamen angeben.

mfg

Kjeld
Immer lustig und vergnügt, bis der A.... im Sarge liegt. ;-)

Offline michael-r

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.768
Re: Barcode in Notes Dokumente einbinden
« Antwort #8 am: 24.04.10 - 12:27:15 »
Jup hab ich. ich hatte vergessen, die Klammern wieder zu setzen.
Dumme Sache.

Das sieht doch mal genial aus :).
Vielen Dank.

Sollte ich noch irgendwelche Abfang Routinen einbauen bei Querysave?

MFG Michael

Offline gossifu

  • Senior Mitglied
  • ****
  • Beiträge: 352
  • Geschlecht: Männlich
  • Dummheit schafft Freizeit
Re: Barcode in Notes Dokumente einbinden
« Antwort #9 am: 24.04.10 - 12:30:50 »
Gerne.

Errorhandling ist immer gut. Besonders, wenn die Datei nicht gefunden wird.
Und ob Du bei jedem Speichern die Erstellung brauchst?
Ich würde da eher mit einem Status arbeiten, der bei bestimmten Bedingungen gesetzt ist.
Und nur dann Barcode-Datei erstellen und anhängen.

mfg

Kjeld
Immer lustig und vergnügt, bis der A.... im Sarge liegt. ;-)

Offline michael-r

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.768
Re: Barcode in Notes Dokumente einbinden
« Antwort #10 am: 24.04.10 - 12:37:27 »
Stimmt guter Einwand.

Ich sollte dann nur Prüfen ob inventarnr sich geändert haben, wenn ja, dann den Barcode neu generieren.

Ach ja, das wird ein guter Tag.  ;D

MFG Michael


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz