Domino 9 und frühere Versionen > ND8: Entwicklung

Barcode in Notes Dokumente einbinden

(1/3) > >>

michael-r:
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

michael-r:
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

michael-r:
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

gossifu:
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");

--- Ende Code ---

mfg

Kjeld

michael-r:
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...

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln