Domino 9 und frühere Versionen > ND8: Entwicklung
Barcode in Notes Dokumente einbinden
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