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