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. Diese Einstellung kann bei der Anlage einer neuen Datengruppe ausgewählt werden. 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 de.uplanet.lucy.server.businesslogic.util.FileUCHelper
import org.apache.pdfbox.pdmodel.*
import org.apache.pdfbox.pdmodel.PDDocument
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
Im nächsten Schritt müssen die eingegebenen Inhalte aus der Applikation bezogen werden. An dieser Stelle müssen die GUIDs und Variablennamen passend zur Applikation ausgetauscht werden.
//values to be changed
def strInputFileGuid = "3FD2E12C9D737FDEA12956339BE664CFE57550BA" /*pdf file Guid in parent table*/
def strRecIdGuid = "49355853C4816EA50DE6AE4906C9EFD8DFC5B1C2" /* record id Guid in parent table*/
def strImageFileGuid = "3BAE89765D5E2C7C91C3128E0527815B022D4AEB" /* file Guid in child table for the images */

def strImageDatagroup = g_rtCache.dataGroups["C15295917F975DFF15E0959AA5BE02817A8CA511"].getName() /* table name in database */
def strVariableFKLID = g_rtCache.fields["A2EC7A0463038240B4D78F41988A7BB68DAE17D8"].getName() /* foreign key variable in child table*/
def strVariableImageRecId = g_rtCache.fields["1A7DC10A0A402847516CEBB7EBA0D441C1D3ECF2"].getName() /* record id variable in child table */
def strVariablePage = g_rtCache.fields["1CC4FEDE1289764F1DA1EAFB3178E4EF48A65554"].getName() /* page variable in child table */
Im weiteren Script-Verlauf wird geprüft, ob eine Datei beim Upload ausgewählt wurde und eine PDF-Datei ist. Danach folgen die eigentliche Wandlung der PDF-Seiten und ein Insert in die Kind-Tabelle.
//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 = PDDocument.load(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
			FileUCHelper.copyFileToIntrexx(g_context, tempFile.getAbsolutePath(), strImageFileGuid, strNewGuid, 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()
      		}
   		}
	}
}