Tipps & Tricks - PDF in Bilddatei konvertieren
Dieser Beitrag zeigt, wie PDF-Dateien, die als Anhang in einer Applikation gespeichert sind, per Prozess in Bilddateien (z.B. .png oder .jpg) umgewandelt werden können. Die Beispielapplikation mit Prozess können Sie hier herunterladen und wie gewohnt importieren. Aktivieren Sie anschließend den enthaltenen Prozess.
Applikation
In der Beispielapplikation können auf der Eingabeseite Titel und Beschreibung erfasst werden. Außerdem gibt es eine Dateikontrolle, über die im Browser PDFs hochgeladen werden können. Die aus den PDFs erzeugten Bilder werden in der untergeordneten Datengruppe "images" abgelegt.
Der Datentyp des Primärschlüssels dieser Datengruppe ist GUID.
In der Datengruppe "images" gibt es ein File-Datenfeld, in dem vom Prozess der Verweis auf die erstellten Bilder gespeichert wird.
Prozess
Der Prozess reagiert auf Einfügen oder Ändern eines Eintrags in der Datengruppe "PDFs".
Anschließend sollen die bereits abgelegten Bilder in der Kind-Tabelle gelöscht werden, für den Fall, dass ein bestehendes PDF ausgetauscht wird.
Dann wird die PDF-Datei mit einer Groovy-Aktion in Bilder zerlegt. Die Wandlung einzelner PDF-Seiten zu Bildern wird mit dem Apache Projekt "PDFBox" (https://pdfbox.apache.org) durchgeführt. Alle notwendigen Klassen sind bei der Installation von Intrexx enthalten und müssen lediglich als Import im Groovy-Skript eingebunden werden.
import java.awt.Toolkit import java.awt.image.BufferedImage import org.apache.pdfbox.pdmodel.* import org.apache.pdfbox.Loader import org.apache.pdfbox.rendering.PDFRenderer import java.io.IOException import org.apache.pdfbox.pdmodel.PDPage import org.apache.pdfbox.pdmodel.font.PDType1Font import org.apache.pdfbox.pdmodel.PDPageContentStream import javax.imageio.ImageIO import java.util.List import java.io.File import java.io.FileWriter import java.io.BufferedWriter import org.apache.pdfbox.rendering.ImageType //define variables def conn = g_dbConnections.systemConnection def strNewGuid def l_pdfPage = 1 File tempFile = null def inputFile = g_record[strInputFileGuid] /* datafield file <file> */ int l_recId = g_record[strRecIdGuid].value /* datafield (PK) (S) ID <integer> */ if(inputFile.hasValue() && inputFile.getFirstFile().getContentType()=="application/pdf"){ try { //get file from Intrexx def pdfFile = new File(inputFile.getFirstFile().getPath()) // load PDF document PDDocument document = Loader.loadPDF(pdfFile) // get all pages pages = document.getDocumentCatalog().getPages() PDFRenderer pdfRenderer = new PDFRenderer(document); // for each page for (int i = 0; i < pages.getCount(); i++) { // single page PDPage singlePage = pages.get(i) // to BufferedImage BufferedImage buffImage = pdfRenderer.renderImageWithDPI(i, 300, ImageType.RGB); /*use for quality configuration*/ //BufferedImage buffImage = singlePage.convertToImage(BufferedImage.TYPE_INT_BGR, 70) // write image to temporary file tempFile = File.createTempFile("pdfImage", ".png") ImageIO.write(buffImage, "png", tempFile) //generate new Guid for insert query strNewGuid = newGuid() //insert into child table g_dbQuery.executeUpdate(conn, "INSERT INTO ${strImageDatagroup} (${strVariableFKLID}, ${strVariableImageRecId}, ${strVariablePage}) VALUES (?, ?, ?)") { setInt(1, l_recId) setString(2, strNewGuid) setInt(3, l_pdfPage) } //save image to Intrexx g_dgFile.copy(guid: strImageFileGuid, id: strNewGuid, file: tempFile.getAbsolutePath(), replaceMode: true, triggerWorkflow: false) //next l_pdfPage as integer l_pdfPage = l_pdfPage +1 tempFile.delete() } document.close() } catch (IOException e) { g_log.err(e) } finally { //delete pdfbox temp files File path = new File("internal/tmp/") for (File file : path.listFiles()) { if (file.getName().endsWith(".tmp") && file.getName().startsWith("+~")) { file.delete() } } } }