Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich hab mich mal informiert wie ich Code aus Java in eine PDF Datei schreiben kann und wurde fündig in Form von "iText".
Das Problem ist nur, dass ich trotz langer Recherche, nicht verstehe wie ich dieses in mein Eclipse installieren kann und welche von denen viele .jar Dateien ich installieren muss...
Und dann musst Du lediglich das ZIP entpacken um die jars dann in ein Verzeichnis innerhalb deines Projektes zu legen um diese dann in dein Projekt mit einzubinden.
Du kannst alle jars einbinden oder Du schaust, was an Funktionalität Du wirklich brauchst. svg-7.1.8.jar brauchst Du wohl nicht, wenn Du nicht mit svg Dateien arbeiten willst. Barcodes-7.1.8.jar wirst Du wohl nur für Barcodes benötigen, u.s.w.
Aber wenn Du Dich auch mit Abhängigkeiten und so nicht beschäftigen willst, dann füge alle hinzu und gut ist es.
Habe es auf der Seite die du verlinkt hast gedownloadet und durch erstellen eines neuen User Libraries meinem Projekt hinzugefügt. Leider kann ich trotzdem nicht die Methoden von iText benutzen... Ich habe mal ein Screenshot gemacht wie es bei mir aussieht, evtl. könnt ihr ja sehen was ich falsch gemacht habe. https://gyazo.com/90e926330823b6b2f634cbc6da6763ea
Das sieht nach den Sourcen aus - Du willst doch die Library nur nutzen.
Also wäre die Datei iText7-Core-7.1.8-only-jars.zip wohl die, die Du herunter laden müsstest.
In diesem ZIP sind einfach nur einige jar files. Diese Packst Du in ein neues Verzeichnis "lib", welches im gleichen Verzeichnis liegt, wie das Verzeichnis src Deines Projektes. (So Du eine Source-Verwaltung wie z.B. git hast, dann kommt das auch da mit rein!) Also nicht das ZIP File sondern die jar Files kommen da rein!
Wenn Du kein anderes Build System wie maven, gradle oder ant nutzt sondern direkt in eclipse baust, dann musst Du noch die Libs in diesem Eclipse Projekt eintragen. (Ich gehe jetzt hier davon aus, dass Du ein einfache Eclipse Java Project hast)
a) In der Oberfläche ist dies trivial: Rechtsclick auf test Ordner (nicht der in src sondern den test Ordner drüber) und New -> Folder ..., dann lib als Name und ok. Dann über den Explorer die jar Files da rein kopieren. Dann auf den lib Ordner und F5 (Oder Rechtsclick -> Refresh), so dass die jar Files angezeigt werden. Jar Files markieren und Rechtsclick -> Build Path -> Add. Fertig! (Du hast dann noch in der Oberfläche Referenced Libraries, in dem dann alle jar Dateien auftauchen.)
b) Wenn Du es nicht über die GUI machen möchtest, dann editierst Du einfach die .classpath Datei und fügst da noch hinzu:
Alternative zu dem "kurzen Weg" in der GUI wäre natürlich die Eigenschaften von Deinem projekt test. Dort dann Java Build Path, Reiter Libraries und dort den Knopf "Add JARs ..." nutzen.
Was genau versuchst du denn und was klapp nicht? Wenn Du Details mitteilst, dann kann Dir ggf. geholfen werden. Dazu am Einfachsten klein anfangen - dann ist der Code auch nicht so komplex, dass man ihn nicht als Ganzes teilen könnte.
Also ich habe jetzt einfach mal den Code aus Deinem Bildschirmfoto weiter oben einmal zum übersetzen gebracht .... wirklich etwas sinnvolles sehe ich darin aber nicht....
Also was habe ich bei dem Code geändert?
- Klasse groß geschrieben
- Da war auch noch ein Zielpfad genutzt aber nicht deklariert - habe ich einfach rausgenommen.
- Methode zu einer main Methode gemacht
- Imports hinzugefügt
- Assert am Ende gelöscht
- Eine Klammer war zuviel...
Das übersetzt und erzeugt ein paar Barcodes. (Auch wenn die Schleife recht sinnlos scheint .,, -9 bis < 42 in 10er Schritten ... )
Da sieht der Code dann so aus:
Java:
package test;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import com.itextpdf.barcodes.BarcodeQRCode;
import com.itextpdf.barcodes.qrcode.EncodeHintType;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
public class Test {
public static void main(String[] args) throws FileNotFoundException {
String filename = "barcodeQRCodeVersioning.pdf";
PdfWriter writer = new PdfWriter(filename);
PdfDocument document = new PdfDocument(writer);
for (int i = -9; i < 42; i+=10) {
PdfPage page1 = document.addNewPage();
PdfCanvas canvas = new PdfCanvas(page1);
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MIN_VERSION_NR, 1);
BarcodeQRCode barcode1 = new BarcodeQRCode("Test", hints);
barcode1.placeBarcode(canvas, ColorConstants.GRAY, 3);
}
document.close();
}
}
Was Deinen neuen Code angeht: Der funktioniert und generiert das PDF korrekt. Was Du hier aber als Fehlerausgabe bekommst ist eine fehlende Abhängigkeit beim Logging.
Es wird slf4j eingesetzt, d.h. Du musst das auch noch herunter laden. Dazu brauchst Du dann z.B. die slf4j-api-1.7.28 (https://mvnrepository.com/artifact/org.slf4j/slf4j-api/1.7.28 ).
Und dann braucht slf4j noch etwas zur Ausgabe. Da könnte man noch slf4j-simple-1.7.28 nehhmen (https://mvnrepository.com/artifact/org.slf4j/slf4j-simple/1.7.28).
Zum einfügen bei den beiden Links in der Tabelle unter Files den Link bei jar anclicken, die Datei speichern und in den lib Ordner schieben und in den Build Path einfügen.....
Ah ok. Verstehe jetzt wie ich ein Barcode und PDF erstellen und ausgeben kann, aber wie kann ich den Barcode selbst hochzählen/ändern lassen? Wenn ich versuche einen Barcode in int zu speichern wird mir "out of range exception" angezeigt.
Ansonsten hätte ich es einfach in eine variable getan und diese dann hochgezählt.
Irgendwie blicke ich nicht ganz durch, was Du machen willst. EAN-13 hat klare vorgaben. So ist die letzte Ziffer die Checksumme. So ein EAN-13 Code ist eben auch nicht dafür gedacht, da einfach so Barcodes zu erstellen, sondern das sind Codes von Artikeln, die also auch zentral erfasst wurden. (Also evtl. einmal unter http://ean-suche.org/faq-fragen-und-antworten-zu-ean-codes/ erst einmal schlau machen).
Und code ist ein String. Es sollte doch ein leichtes sein, da eine Zahl oder so zu einem String entsprechender Länge zu machen. Ich habe mir den Fehler jetzt nicht genau angesehen, aber evtl. ist out of range genau wegen checksumme oder eben zu wenig Ziffern oder so geworfen worden ...
Es wäre mal interessant zu erfahren, was Du überhaupt machen willst. Wenn es um einfache Informationen, die Du übermitteln willst, geht: Da ist ein QR Code evtl. deutlich besser geeignet zumal du da viel mehr Informationen mitgeben kannst (Entsprechende Größe des QR Codes vorausgesetzt).
Ich will ein Barcode erzeugen und diesen in einem PDF ausgeben können. Der Barcode muss aber hochzählbar sein, d.h. wenn man den Button vom GUI 2 mal benutzt hat soll man nicht 2mal den selben Barcode ausgegeben bekommen sondern immer einen anderen
Für was willst Du Barcodes erstellen? Hast Du Dir den Link durchgelesen? Wenn Du n Barcodes haben willst, dann wende Dich an die entsprechenden Stellen und kauf dir n Barcodes, die Du dann verwenden kannst.
Es ist ein normales Unterfangen, Codes von Artikeln irgendwo zu speichern und dann ggf. irgendwo nutzen zu wollen. Habe ich oft genug gemacht. Aber da sind das dann entsprechende Codes gewesen, die halt die Artikel, die sie identifizieren sollten, identifiziert haben.
Wenn Du aber nicht Artikel eindeutig identifizieren können willst, dann ist das ein schlichter Missbrauch. Ganz einfach. Und es gibt auch keinen Grund, eigene EAN-13 Codes generieren zu wollen. EAN-13 hat nun einmal eine bestimmte Bedeutung.
Und wenn Du sowas unbedingt willst: Ich habe schon den Checkcode erwähnt - also wäre das Vorgehen, einen 12-stelligen Code zu generieren um dann die Prüfziffer zu berechnen.
Wenn Du aber schlicht Daten übermitteln willst, dann nimm etwas geeignetes wie z.B. QR Codes.
Sorry, hätte erwähnen sollen dass ich ein Projekt für die Uni mache und ich dafür Barcodes generieren soll (keine wirklichen Barcodes sondern lediglich fake Barcodes). D.h. die können auch nutzlos sein, sie sollen nur einem Artikel zugewiesen werden können und dann in einem PDF ausgegeben werden.
-> Jedoch soll jeder Artikel einen unterschiedlichen Barcode haben
Ich glaube, Du solltest über den Begriff Checksumme noch einmal nachdenken
Du nimmst 12 beliebige Ziffern. Also hast Du da 999.999.999.999 mögliche Kombinationen.
Und die 13 Stelle berechnest Du, d.h. für jede Kombination aus 12 Ziffern gibt es genau eine 13. Ziffer.
Edit: Hatte 3 Neuner zu wenig. Müssen natürlich 12 sein!
Ok habe es grad mal probiert bekomme aber Fehlermeldungen, dass ich was falsches übergebe. Ich muss ja ein String übergeben welcher 12 Zeichen haben muss damit er die Klasse durchläuft. Habe ich getan aber bei 12 Zeichen bekomme ich ArrayIndexOutOfBounds exception und bei 11 Zeichen bekomme ich logischerweise java.lang.NullPointerException
Exceptions bei 12 Stelligen String:
java.lang.ArrayIndexOutOfBoundsException: 1
at com.lowagie.text.pdf.BarcodeEAN.getBarsEAN13(BarcodeEAN.java:249)
at com.lowagie.text.pdf.BarcodeEAN.placeBarcode(BarcodeEAN.java:547)
at com.lowagie.text.pdf.Barcode.createTemplateWithBarcode(Barcode.java:409)
at com.lowagie.text.pdf.Barcode.createImageWithBarcode(Barcode.java:424)
at Design.test.main(test.java:124)
Exception in thread "main" ExceptionConverter: java.io.IOException: The document has no pages.
at com.lowagie.text.pdf.PdfPages.writePageTree(PdfPages.java:118)
at com.lowagie.text.pdf.PdfWriter.close(PdfWriter.java:1295)
at com.lowagie.text.pdf.PdfDocument.close(PdfDocument.java:964)
at com.lowagie.text.Document.close(Document.java:517)
at Design.test.main(test.java:130)
Exceptions bei 13 Stelligen String (logisch da bei 13 stellen null ausgegeben werden soll):
java.lang.ArrayIndexOutOfBoundsException: 1
at com.lowagie.text.pdf.BarcodeEAN.getBarsEAN13(BarcodeEAN.java:249)
at com.lowagie.text.pdf.BarcodeEAN.placeBarcode(BarcodeEAN.java:547)
at com.lowagie.text.pdf.Barcode.createTemplateWithBarcode(Barcode.java:409)
at com.lowagie.text.pdf.Barcode.createImageWithBarcode(Barcode.java:424)
at Design.test.main(test.java:124)
Exception in thread "main" ExceptionConverter: java.io.IOException: The document has no pages.
at com.lowagie.text.pdf.PdfPages.writePageTree(PdfPages.java:118)
at com.lowagie.text.pdf.PdfWriter.close(PdfWriter.java:1295)
at com.lowagie.text.pdf.PdfDocument.close(PdfDocument.java:964)
at com.lowagie.text.Document.close(Document.java:517)
at Design.test.main(test.java:130)
Die Methode getEANChecksum gibt nur die Checksumme zurück. Der ganze EAN Code sind die 12 Stellen + die Checksumme.
Und getEANChecksum gibt bei 13 Stellen nicht null zurück. Null wird nur zurück gegeben, wenn:
- null übergeben wurde
- weniger als 12 oder mehr wie 13 Ziffern übergeben wurden.
Ok es funktioniert aber derzeit gebe ich ein String mit 12 gesetzten Zahlen.
Wie kann ich ein String mit 12 zufälligen Zahlen erstellen?
Habe diese Methode gefunden:
static final String AB = "0123456789";
static SecureRandom rnd = new SecureRandom();
String randomString( int len ){
StringBuilder sb = new StringBuilder( len );
for( int i = 0; i < len; i++ )
sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
return sb.toString();
}
gelöst habe vergessen "String randomString(int len) {" static zu machen...