Java und PDF-Verarbeitung

Oscu

Grünschnabel
Hallo auch...

ich habe ein kleines Problem, und zwar versuche ich mit iText ein PDF zu öffnen, in eine bestimmte Zone Text einzufügen und das ganze speichern. An sich hört sich das ja nach wenig an, ist es womöglich auch, nur beiß ich mir daran die Zähne aus. Die Idee dabei ist, dass ich ein Layer auf die betroffene Zone lege und da den Text reinschreibe. So etwas in der Art passiert wohl auch, dass sich die Größe der Dateien unterscheidet, nur seh ich nicht den Text den ich einfügen wollte.
Ich zeig mal den Code in der Hoffnung dass jemand den Fehler findet, und wenn ich komplett auf dem Holzweg bin, lass ich mir gerne helfen.

Und um der Frage "warum itext?" zuvorzukommen..... weil ich damit weiter gekommen bin als mit jpedal...Das Thema "PDF und Java" beschäftigt mich genau seit heute...

Code:
	public void copy(String outfile, String infile)
	{
    	System.out.println("PdfCopy example");
    	Document document = null;
        try 
        {
            int pageOffset = 0;
            ArrayList master = new ArrayList();

            
            PdfCopy  writer = null;
                PdfReader reader = new PdfReader(infile);
                reader.consolidateNamedDestinations();
                int n = reader.getNumberOfPages();
                List bookmarks = SimpleBookmark.getBookmark(reader);
                if (bookmarks != null) 
                {
                    if (pageOffset != 0)
                        SimpleBookmark.shiftPageNumbers(bookmarks, pageOffset, null);
                    master.addAll(bookmarks);
                }
                pageOffset += n;
                
                document = new Document(reader.getPageSizeWithRotation(1));
                writer = new PdfCopy(document, new FileOutputStream(outfile));
                document.open();

                PdfImportedPage page;
                for (int i = 0; i < n; ) 
                {
                    ++i;
                    page = writer.getImportedPage(reader, i);
                    writer.addPage(page);
                }
      
                PRAcroForm form = reader.getAcroForm();
                if (form != null)
                    writer.copyAcroForm(reader);        
        
                writer.setPdfVersion(PdfWriter.VERSION_1_5);
                writer.setViewerPreferences(PdfWriter.PageModeUseOC);

                PdfContentByte cb = writer.getDirectContent();
                Phrase explanation = new Phrase("Layer grouping", new Font(
                		Font.HELVETICA, 20, Font.BOLD, Color.red));
                ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, explanation, 50,
                		650, 0);
                PdfLayer layer = new PdfLayer("Layer", writer);
                Phrase p1 = new Phrase("Irgendwo sollte nun etwas stehen");
                System.out.println("tut es aber nicht");
                cb.beginLayer(layer);
                ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, p1, 50, 600, 0);
                cb.endLayer();
                PdfOCProperties p = writer.getOCProperties();
                PdfArray order = new PdfArray();
                order.add(layer.getRef());
                PdfDictionary d = new PdfDictionary();
                d.put(PdfName.ORDER, order);
                p.put(PdfName.D, d);
        }

        catch(DocumentException de) 
        {
                System.err.println(de.getMessage());
        }
            
        catch(IOException ioe) 
        {
                System.err.println(ioe.getMessage());
        }
        
        document.close();
    }
 
Huhu ..

Also ich bin mir nicht sicher, aber musst du nicht ein Objekt des Typs ColumnText erstellen dem du im Konstruktor das PdfContentByte Objekt übergibst ?

Also ungefähr so:

PdfContentByte cb = writer.getDirectContent();
ColumnText ct = new ColumnText(cb);
ct.setSimpleColumn(phrase, 100, 300, 200, 500, 15, Element.ALIGN_CENTER);

... usw.
 
hello again...

Nun das ist zumindest den examples nach nicht nötig, aber auch wenn ich das Objekt explizit erzeuge bringt mich das in der Hinsicht nicht weiter.

Mittlerweile hab ich es mir auch leicht gemacht, ich habe den fixen Text als String gespeichert, der "variable" Text wird aus einer XML-Datei eingelesen.

Jetzt hab ich ein Problem mit der Größe der Seiten im PDF. Wenn ich das PDF mit iText erzeuge muss ich ja die Größe der Seite mitgeben. nun will ich aber die PDFs in unterschiedlichen Größen erzeugen können. dazu ist deer Gedanke, dass ich zunächst ein großes PDF erzeuge, mir die Position des Textes hole (also x-Koordinate und y-Koordinate), dann daraus ein Rectangle baue und dann mit


setPageSize(rect)

die Seite anpasse wie es mir beliebt.

Das Problem ist nur, woher weiss ich wo der Text liegt? Schön wäre natürlich wenn das mit iText ginge, nur find ich da nichts passendes zu ( mag aber auch sein, dass ich nur blind bin ).

jPedal ist ebenfalls eingebunden, dort finde ich aber auch nur Methoden um den Text zu extrahieren, aber ich will ja nicht extrahieren, sondern die Position wissen, bzw die Maße.

Hat diesbezüglich jemand eine Idee oder einen Tipp?

Oscu


Edit
---------------------------
also gelöst habe ich dieses problem mit ColumnText und der Methode ColumnText.getLinesWritten()
den wert der dabei rauskommt mit der zeichengröße multipliziert ergibt zumindest einen näherungswert der für meine zwecke ausreicht, um anschliesend die viel zu große seite auf die richtige länge zu stutzen.

Oscu
 
Zuletzt bearbeitet:
Zurück