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()
      		}
   		}
	}
}