iText download/installieren

Diskutiere iText download/installieren im Java Basics - Anfänger-Themen Bereich.
F

Funkeyfreak

Hey,

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...

Ich habe es hier auf der Seite gedownloadet: https://sourceforge.net/projects/itext/

Ich hoffe ihr könnt mir weiterhelfen.

Mfg
 
J

JustNobody

Erst einmal schreibt die von Dir verlinkte Seite direkt:
iText 5 has moved to GitHub: https://github.com/itext/itextpdf
iText 5 is no longer supported - please use iText 7 instead: https://github.com/itext/itext7
Daher solltest Du zuerst einmal die aktuellen Informationen unter https://github.com/itext/itext7 nutzen.

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.
 
F

Funkeyfreak

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
 
J

JustNobody

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:
Code:
    <classpathentry kind="lib" path="lib/barcodes-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/font-asian-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/forms-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/hyph-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/io-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/kernel-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/layout-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/pdfa-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/pdftest-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/sign-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/styled-xml-parser-7.1.8.jar"/>
    <classpathentry kind="lib" path="lib/svg-7.1.8.jar"/>
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.
 
F

Funkeyfreak

hat funktioniert danke

Jedoch schaffe ich es leider nicht code von anderen - die damit ein pdf element generieren zum laufen zu bekommen.

-> will nämlich ein PDF erstellen und dort eine Packliste ausgeben...
 
Zuletzt bearbeitet:
J

JustNobody

Jedoch schaffe ich es leider nicht code von anderen - die damit ein pdf element generieren zum laufen zu bekommen.
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.
 
F

Funkeyfreak

Habe den Fehler gefunden. Dass was ich einfügen wollte war erstellt mit itext5 und nicht itext7, d.h. es kann gar nicht funktionieren.

Jedoch habe ich nun Probleme mit einem sehr einfachen Anfangscode: https://gyazo.com/e37f614962841c3c908bcb66c1faaaae

Code:
package test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;


public class ItextExample {

    public static void main(String[] args) throws MalformedURLException, IOException {

        PdfWriter writer = new PdfWriter("Packliste.pdf");
        PdfDocument pdfDoc = new PdfDocument(writer);
        Document document = new Document(pdfDoc);
        
        document.add(new Paragraph ("Hello World"));
        
        document.close();
        
       // File file = new File("PdfFile.pdf");
       // file.delete();

    }
}
 
J

JustNobody

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.....
 
F

Funkeyfreak

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.

Code:
 Document document = new Document(PageSize.A4, 50, 50, 50, 50);
                        try {
                            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("BarcodeArtikel.pdf"));
                            document.open();
                            PdfContentByte cb = writer.getDirectContent();
                            String code = "1234567812345";
                            int code1= 1234567812345;
                            BarcodeEAN codeEAN = new BarcodeEAN();
                            codeEAN.setCodeType(Barcode.EAN13);
                            codeEAN.setCode(code);
                            Image imageEAN = codeEAN.createImageWithBarcode(cb, null, null);

                            document.add(new Phrase(new Chunk(imageEAN, 0, 0)));
                        }
                        catch (Exception de) {
                            de.printStackTrace();
                        }
                        document.close();
 
F

Funkeyfreak

Ich habe es mit long und mit BigInteger probiert aber bei beiden bekomme ich bei setCode ein Fehler
 
J

JustNobody

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).
 
F

Funkeyfreak

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
 
J

JustNobody

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.
 
F

Funkeyfreak

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
 
J

JustNobody

Dann erstell 12 Stellige Codes und berechne dann die 13te Stelle. Damit solltest Du an gültige EAN Codes kommen.

Code, den ich mal dafür geschrieben habe:
Java:
static String getEANChecksum(String ean) {
        // validate
        if (ean == null) return null;
        if (ean.length() < 12 || ean.length() > 13) return null;

        try {
            int total_sum = 0;
            for (int i = 0; i < 12; i++) {
                if (i % 2 != 0) {
                    total_sum = total_sum + Integer.parseInt("" + ean.charAt(i)) * 3;
                } else {
                    total_sum = total_sum + Integer.parseInt("" + ean.charAt(i));
                }
            }

            return new Integer(((10 - (total_sum % 10)) % 10)).toString();
        } catch (Exception ex) {
            Log.error("Exception when calculating EAN13 checksum for " + ean, ex);
            return null;
        }
    }
Wobei der Code etwas älter ist und ich würde ihn wohl anders schreiben, wenn ich ihn noch einmal schreiben müsste. Aber er sollte funktionieren.
 
F

Funkeyfreak

Dann kann man doch nur 9 Barcodes generieren da man nur die letzte Stelle berechnet oder?
 
J

JustNobody

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!
 
F

Funkeyfreak

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

Was mache ich falsch?
 
J

JustNobody

Wo bekommst du welche Exception? was genau versuchst du? Bei sowas immer Code und ganzen Stacktrace geben.
 
F

Funkeyfreak

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)


Code:
package Design;

import java.io.FileOutputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

import com.lowagie.text.Chunk;
import com.lowagie.text.Image;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.Barcode;
import com.lowagie.text.pdf.BarcodeEAN;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.Barcode;
import com.lowagie.text.pdf.BarcodeEAN;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;
public class test {
    static String getEANChecksum(String ean) {
        // validate
        if (ean == null) return null;
        if (ean.length() < 12 || ean.length() > 13) return null;

        try {
            int total_sum = 0;
            for (int i = 0; i < 12; i++) {
                if (i % 2 != 0) {
                    total_sum = total_sum + Integer.parseInt("" + ean.charAt(i)) * 3;
                } else {
                    total_sum = total_sum + Integer.parseInt("" + ean.charAt(i));
                }
            }

            return new Integer(((10 - (total_sum % 10)) % 10)).toString();
        } catch (Exception ex) {
           System.err.println(ex);
            return null;
        }
    }
    public static void main(String[] args)  {

Document document = new Document(PageSize.A4, 50, 50, 50, 50);
         try {
                PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("BarcodeArtikel.pdf"));
                document.open();
                PdfContentByte cb = writer.getDirectContent();
                BarcodeEAN codeEAN = new BarcodeEAN();
                codeEAN.setCodeType(Barcode.EAN13);
                String ean = "123456789124";
                codeEAN.setCode(getEANChecksum(ean));
                Image imageEAN = codeEAN.createImageWithBarcode(cb, null, null);
                document.add(new Phrase(new Chunk(imageEAN, 0, 0)));
            }
            catch (Exception de) {
                de.printStackTrace();
            }
            document.close();
        
    }   
}
 
Thema: 

iText download/installieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben