PDFs konkateniert als HttpResponse zurückgeben

Um irgendwas mit PDF zu machen, bietet sich die Bibliothek iText an. Die API finde ich persönlich nicht sonderlich schön, aber man hat ja keine Wahl…

Hier ein Snippet, wie man ganze PDF-Dokumente konkateniert und dann als ein PDF ausgibt. Es gibt sicherlich schönere Lösungen. Comments sind immer willkommen. Nachteilig ist hier vor allem die Benutzung von byte[]. Je nach konkretem Anwendungsfall sollte man besser auf Streams umsteigen.

public doGet(HttpServleRequest request, HttpServletResponse response){

byte[][] files = ...;

String fileName = "myfile.pdf";

response.setHeader("Pragma", "public");
response.setHeader("Cache-control", "must-revalidate");
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "filename=" + fileName);

Document document = new Document();

PdfCopy copy = new PdfCopy(document, response.getOutputStream());
document.open();
for (int i = 0; i < files.length; i++) {
PdfReader reader = new PdfReader(files[i]);
int pageNum = reader.getNumberOfPages();
for (int j = 1; j <= pageNum; j++) {
copy.addPage(copy.getImportedPage(reader, j));
}
}
document.close();

}

Erntedank: Stoiber weg, Frauen Weltmeister

Stoiber
by Michael Lucan

Die letzte Woche hat mit einem großartigen Erntedankfest geendet: Stoiber hat seine Ankündigung wahr gemacht und abgedankt (an dieser Stelle nochmal Glückwünsche an daviduu). Die Fussballfrauen haben auch kräftig geerntet, und zwar den WM-Titel. Nur dass RTL beim Fernsehpreis die Lorbeeren für ein “Informationsmagazin” ernten konnte, ist nicht nachvollziehbar. Wahrscheinlich für die plakative Aufmachung mit besonders effektvollen Animationen.

Apropos RTL: Bin eben auf die RTL-Kirche gestossen. Da gibt es u.a. feiste Bibel-Psalme direkt auf dein Handy.

Hier eine kleine Kostprobe (Psalm 104, Vers 14):

Erntedank

Gott, du lässt das Gras wachsen für das Vieh,
auch Pflanzen für den Menschen,
die er anbaut,
damit er Brot gewinnt von der Erde.

Bayerische Feiertage

fallen heute einige zusammen:

  1. CSU-Parteitag: Der Huber Erwin ist zum CSU-Parteivorsitzenden gewählt worden und löst somit Herrn Stoiber ab. Von dem wird gemunkelt, er würde in den kommenden Tagen den Transrapid nach Brüssel nehmen — Fahrzeit 10 Minuten.
  2. Wies’n aka Oktoberfest.
  3. Bayern München spielt und hat in Leverkusen gewonnen. Hätte aber ruhig ein Tor mehr fallen können.


Wettersteingebirge mit Zugspitze

Blick vom Moos bei Wielenbach auf Wettersteingebirge mit Zugspitze (23.09.2007)

EMC Erdfunkstelle in Raisting

EMC Global Teleport Raisting (23.09.2007)

Arbeiten im Bett

Gerade habe ich meinen Bettarbeitsplatz komplettiert, indem ich mir eine Funktastatur gekauft habe. Vor einigen Wochen schon habe ich einen Widescreen-TFT erworben und an Schnüren von der Decke über das Bett gehängt. Da baumelt das Ding jetzt leicht schräg in etwa einem Meter Höhe über dem Kopfende. Endlich nie wieder das blöde Kopfkissen türmen, um mühsam zu zweit Filme auf dem Laptop zu kucken. Fotos folgen.

Checkliste Java-Projekte

1. …

12. JRE-Kompatibilität

Kommen beim Kompilieren Warnings? Ist dies der Fall, ist zu überprüfen, ob als “deprecated” gesetzte Klassen oder Methoden verwendet wurden. Es gibt einen ganzen Haufen Anwendungen, die mit JDK 1.5 einfach nicht mehr funktionieren, da verwendete Klassen oder Methoden nicht mehr von java.lang (oder anderen APIs) unterstützt werden. Fallen in einer Version Elemente weg, so sind diese in älteren Versionen schon als deprecated gekennzeichnet.

1.6 Projektplanung

In jedem Projektplan ist Zeit zum Refactoren und zur Verbesserung der Performance einzuplanen. Nichts ist schlimmer, als in einem – natürlich auch wieder enorm zeitkritischen – Projekt in den erodierten Sourcen rumwühlen zu müssen und nach und nach immer unwartbareren Code zu pflegen.

14. Testing
14.56 Zufallsgeneratoren überprüfen
Zu testen:
verschiedene Seeds in hintereinander generierten Random-Objekten? Initialisiert man mehrere Random-Objekte hintereinander, z.B in einer Schleife, tut es ein einfaches new Randon(System.currentTimeMillis()) nicht mehr. Auf schnellen Rechnern führt das zu einem gleichen Verhalten der Randoms. Eine Lösung ist die Verwendung eines zusätzlichen Randoms zur Initialisierung.

23. Systemintegration

23.5 Speicherbedarf untersuchen

..

23.6 Garbage-Collection untersuchen

Bei der Systemintegration im Produktiv-, wie auch im Testsystem ist das Verhalten des Garbage-Collectors zu untersuchen.

Die JVM kann dazu mit den Parametern -gc:verbose und -XX:+PrintGCDetails gestartet werden.

Eine weitere interessante Perspektive gibt die Auswertung von jstat:

jps zeigt alle vm-Ids der laufenden Virtual Machines. Befehl ist Teil vom SDK. vm-Id ist typischerweise die pid.

jstat - [-t] [-h <lines>] <vmid> [<interval> [<count>]]
Beispiel: jstat -gcutil -h3 99999 250 200

Ein Tool, dass die Informationen zum Verhalten des Garbage Collector visualisiert, ist visualgc. Hier läßt sich auch der Grund für die Garbage Collection sehen: War es ein System.gc() oder gab es bessere Gründe? Das Tool ist nicht in der JDK 1.5 enthalten, kann aber bei Sun heruntergeladen werden.

Es sollte auch ein Auge auf die Auslastung des Perm-Spaces geworfen werden. Dieser ist unabhängig vom Gesamtheap. Die Größe läßt sich mit -XX:PermSize=..MB und -XX:MaxPermSize=..MB steuern. Im Default sollte die JVM 64MB reservieren, der aber unter mysteriösen Umständen auch schrumpfen kann. Ich bin mir nicht ganz sicher, ob es sich dabei um ein normales Vergrößern des Virtual Spaces ( nicht allozierter, aber reservierter Speicher) handelt. Setzt man die Größe mit -XX:PermSize scheint die Größe sich aber nicht zu verändern.

Bei Serveranwendungen ist es wichtig, das Verhältnis von Young zu Tenured Space zu untersuchen. Finden zuviele Young collections statt? In einer größeren Serveranwendung kann man u.U. eine Ratio von 1:2 festlegen ( -XX:NewRatio=2) (Young 1 : 2 Tenured) .

Im Client-Teil einer Anwendung reichen die default-Einstellungen meist aus.

Kann Internet Explorer mit setAttributeNode() kein Javascript-Event an DOM-Node binden?

Vorgestern trat ich mal wieder in eine Endlosschleife ein. Eigentlich wollte ich nur in einem XHTML-Dokument den Text innerhalb einer bestimmten Überschrift mit JavaScript zu einem Link umwandeln und diesen mit dem onclick-Attribut versehen. Quasi so:

vorher:

...
<div>
    <h1 id="header1">Hallo</h1>
</div>
...

nachher:

...
<div>
    <h1 id="header1">
        <a href="#" onclick="alert(this.tagName); return false">Hallo</a>
    </h1>
</div>
...

Dachte mir also, mit etwas DOM-Manipulation läßt sich der ganze Vorgang schön abwickeln und habe mir eine Funktion in dieser Art gebacken:

function tutNicht() {
    var heading = document.getElementById('header1');
    var headingText = document.createTextNode(heading.firstChild.nodeValue);

    var aElem = document.createElement('a');
    aElem.appendChild(headingText);

    var hrefAttrib = document.createAttribute("href");
    hrefAttrib.nodeValue = '#';

    var onclickAttrib = document.createAttribute("onclick");
    onclickAttrib.nodeValue = "alert(this.tagName); return false";

    aElem.setAttributeNode(onclickAttrib);
    aElem.setAttributeNode(hrefAttrib);

    heading.removeChild(heading.firstChild);
    heading.appendChild(aElem);
}

Jetzt wird es interessant. Der Internet Explorer (Version 6+7) führt zwar die Manipulationen am DOM aus (wovon ich mich mittels des IE DomInspectors überzeugte), wenn man dann aber auf den Link klickt wird das OnClick-Event nicht ausgelöst.

Habe länger im Trüben gestochert bis mir die Idee kam, den Link mal unschön über die Eigenschaft innerHTML der Überschrift zu erzeugen. Nun funktioniert die Sache plötzlich auch im IE und die Funktion alert() wir bei klicken aufgerufen:

function tut() {
    var heading = document.getElementById('header1');
    var text = heading.firstChild.nodeValue;
    heading.removeChild(heading.firstChild);

    heading.innerHTML = '<a href="#" onclick="alert(this.tagName); return false;">' + text + '</a>';
}

Ein äußerst interessantes Phänomen welches es noch zu ergründen gilt.

Innenminister Schäuble regt Ablenkungskonferenz an

Die jüngste Festnahme dreier Terrorverdächtiger dürfte Herrn Schäuble ja recht gelegen kommen. So konnte er nun eine Sonderkonferenz der Inneminister anregen und damit eine wunderbare Gelegenheit schaffen um von seinen Ausrutscher bzgl. der Änderung des Waffenrechts abzulenken. Man möchte faßt vermuten dass der Zugriff auf die Verdächtigen nicht zufällig diese Woche stattfand.

Haselünne, Herzlake, Löningen

Orte, von denen man nie zuvor gehört hat: Herzlake, Löningen, Haselünne. Im Rahmen eines Wochenendausfluges habe ich ebenjene Lokalitäten nun zum ersten Mal begutachten können. Trübe Käffer, in denen die einzige Unterhaltung aus Kinderkriegen zu bestehen scheint. Was wird aus diesen Menschen, fragte ich mich. Wie reagiert eine sensible Kinderpsyche auf eine reizfreie Umwelt? Wie es der Zufall will, habe ich heute auf der Internetpräsenz des BKA eine Antwort bekommen:

http://www.bka.de/fahndung/personen/meistgesuchte/bahaji/index.html

Die wahre Gefahr für unsere demokratische Grundordnung kommt von innen! Kampf den inländischen Terror-Ausbildungslagern! Für die progressive Urbanisierung Deutschlands!