thank for help
Question
Question
Pdf to tiff via sdk and tiff to pdf its possible ?
Answer
The Laserfiche SDK does not have any tools in it to convert PDF to TIFF. But that does not mean that it can not be done, but rather that it will require another tool be used to do the conversion and then SDK used to import the resulting TIFF.
There are many PDF to TIFF tools available and most have licensing that requires purchase for commercial use. Search the web to find one that best suits your needs.
I like to use GhostScripts (http://www.ghostscript.com/download/gsdnld.html) for this job. Download the 32 bit version (I have been reading reports that the x64 version is still not stable).
In a VB project, create a class named Ghostscript
Imports System.Runtime.InteropServices Public Class Ghostscript <StructLayout(LayoutKind.Sequential)> _ Public Structure GSVersion Public product As String Public copyright As String Public revision As Integer Public revisionDate As Integer End Structure <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function gsapi_revision(ByRef version As GSVersion, ByVal len As Integer) As Integer End Function <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function gsapi_new_instance(ByRef pinstance As System.IntPtr, ByVal handle As System.IntPtr) As Integer End Function <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function gsapi_init_with_args(ByVal pInstance As IntPtr, ByVal argc As Integer, <[In](), Out()> ByVal argv As String()) As Integer End Function <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function gsapi_exit(ByVal instance As IntPtr) As Integer End Function <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Sub gsapi_delete_instance(ByVal pinstance As System.IntPtr) End Sub Public Shared Sub getVersion(ByRef version As GSVersion) gsapi_revision(version, Marshal.SizeOf(version)) End Sub Public Shared Sub run(ByVal argv As String()) Dim inst As IntPtr = IntPtr.Zero Dim code As Integer = gsapi_new_instance(inst, IntPtr.Zero) If code <> 0 Then Return End If code = gsapi_init_with_args(inst, argv.Length, argv) gsapi_exit(inst) gsapi_delete_instance(inst) End Sub End Class
Then to convert a PDF to TIFF G4, call it like this
Private Sub ToTIFFG4(ByVal sPDFPath As String, ByVal sOutputFolder As String) If Not String.IsNullOrEmpty(sPDFPath) Then If Not String.IsNullOrEmpty(sOutputFolder) Then If IO.File.Exists(sPDFPath) Then Try If Not IO.Directory.Exists(sOutputFolder) Then IO.Directory.CreateDirectory(sOutputFolder) End If Dim fi As IO.FileInfo = New IO.FileInfo(sPDFPath) Dim sOutName As String = IO.Path.Combine(sOutputFolder, fi.Name.Replace(fi.Extension, "_G4.tiff")) If IO.File.Exists(sOutName) Then IO.File.Delete(sOutName) End If Dim gsVer As New Ghostscript.GSVersion() Ghostscript.getVersion(gsVer) If gsVer.revision > 900 Then Dim argv As String() = {"PDF2TIFF", "-q", "-sOutputFile=" & sOutName, "-dNOPAUSE", "-dBATCH", "-P-", _ "-dSAFER", "-sDEVICE=tiffg4", "-r300", sPDFPath} Ghostscript.run(argv) End If Catch ex As Exception MsgBox(ex.Message) End Try End If End If End If End Sub
NOTE: Make sure after you install Ghostscripts, you copy the gs dll (Example: "C:\Program Files (x86)\gs\gs9.10\bin\gsdll32.dll") into your project (the dll must be in the same folder as the exe or its location included in the system path).
Replies
We use a product by SautinSoft called PDFFocus which has worked well as a solution. I think it runs about $500, but it will handle conversions to multiple formats and works quickly/efficiently.
For example:
Dim pdfFocus As SautinSoft.PdfFocus = New SautinSoft.PdfFocus
pdfFocus.Serial = "serialno"
pdfFocus.OpenPdf("\\pathtofile\filename.pdf")
pdfFocus.ImageOptions.Dpi = 300
pdfFocus.ToMultipageTiff("\\saveloc\filename.tiff")
ok thanks
Ok. thanks.
how do you integrate this to laserfiche workflow?
There are several ways, but the way I like best is this:
Create a command line utility that takes an Entry ID as an argument and then logs into Laserfiche and converts the document with the passed in ID and sets a specific field. Then create a workflow that calls the external app and passes the Entry ID in the command line. Then the workflow waits for the field specified field to equal the value that means it is completed with the conversion before it moves to the next step.
Alternatively, you can create your own workflow activity or use a workflow script to do the same thing.
Hi Bert,
I tried your solution but I have an error with the SDK (sorry i'm not good with this)
Imports System Imports System.Collections.Generic Imports System.ComponentModel Imports System.Data Imports System.Data.SqlClient Imports System.Text Imports System.Runtime.InteropServices Namespace WorkflowActivity.Scripting.Script '''<summary> '''Offre une ou plusieurs méthodes qui peuvent être exécutées au moment de l'exécution de l'activité de scriptage du flux de travail. Public Class Ghostscript <StructLayout(LayoutKind.Sequential)> _ Public Structure GSVersion Public product As String Public copyright As String Public revision As Integer Public revisionDate As Integer End Structure <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function gsapi_revision(ByRef version As GSVersion, ByVal len As Integer) As Integer End Function <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function gsapi_new_instance(ByRef pinstance As System.IntPtr, ByVal handle As System.IntPtr) As Integer End Function <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function gsapi_init_with_args(ByVal pInstance As IntPtr, ByVal argc As Integer, <[In](), Out()> ByVal argv As String()) As Integer End Function <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Function gsapi_exit(ByVal instance As IntPtr) As Integer End Function <DllImport("gsdll32.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)> _ Private Shared Sub gsapi_delete_instance(ByVal pinstance As System.IntPtr) End Sub Public Shared Sub getVersion(ByRef version As GSVersion) gsapi_revision(version, Marshal.SizeOf(version)) End Sub Public Shared Sub run(ByVal argv As String()) Dim inst As IntPtr = IntPtr.Zero Dim code As Integer = gsapi_new_instance(inst, IntPtr.Zero) If code <> 0 Then Return End If code = gsapi_init_with_args(inst, argv.Length, argv) gsapi_exit(inst) gsapi_delete_instance(inst) End Sub End Class Private Sub ToTIFFG4(ByVal sPDFPath As String, ByVal sOutputFolder As String) If Not String.IsNullOrEmpty(sPDFPath) Then If Not String.IsNullOrEmpty(sOutputFolder) Then If IO.File.Exists(sPDFPath) Then Try If Not IO.Directory.Exists(sOutputFolder) Then IO.Directory.CreateDirectory(sOutputFolder) End If Dim fi As IO.FileInfo = New IO.FileInfo(sPDFPath) Dim sOutName As String = IO.Path.Combine(sOutputFolder, fi.Name.Replace(fi.Extension, "_G4.tiff")) If IO.File.Exists(sOutName) Then IO.File.Delete(sOutName) End If Dim gsVer As New Ghostscript.GSVersion() Ghostscript.getVersion(gsVer) If gsVer.revision > 900 Then Dim argv As String() = {"PDF2TIFF", "-q", "-sOutputFile=" & sOutName, "-dNOPAUSE", "-dBATCH", "-P-", _ "-dSAFER", "-sDEVICE=tiffg4", "-r300", sPDFPath} Ghostscript.run(argv) End If Catch ex As Exception MsgBox(ex.Message) End Try End If End If End If End Sub End Namespace
It said "Invalid statement in a namespace"