I am trying to programmatically batch reduce the size of PDFs. Manually, I would go through File>Save as>Adobe PDF files, optimized. From reading the documenation I was expecting that I could achieve the same using (C# and IAC):
Thanks a lot for the reply. I had a look at the batch processing feature. It might do the job, but not completely. I guess I should have provided more details about what I want to achieve.
The idea is to create a tool that will create lores version(s) of one PDF or of all PDFs in a specific folder. This tool should integrate with the Windows context menu. So, I right-click on a folder, select the command and all hires PDFs in that folder (and its sub-folders) are converted to lores. Additionally, I would want this tool to come as an installable file. And finally, if the hires PDFs are zipped, the should be extracted prior to the conversion.
If I want to use the built-in batch processing, there are two problems:
- How can I create a batch sequence when installing the tool?
- How can I call this sequence from the tool?
It would seem much more straightforward, if I could just save a given PDF in its optimized version through the API.
All of your users will have Adobe Acrobat Professional installed, correct? Because the Acrobat SDK requires the presence of Acrobat - and PDF Optimizer is only in Professional.
Assuming this is the case, then your best bet is to write a custom plugin that calls on PDF Optimizer with your settings as you wish them - and exposes some IAC/COM interface for your own tool to call on.
If you are all on Acrobat Professional 8, another option would be to use the "Fix Up" functionality of Preflight to build the set of corrections/optimizations that you wish to apply. Make a "droplet" from that, and then call on the droplet from your external application.
I am new to Acrobat and I am searching to compress PDF files too, for example by reducing quality level and using Jpeg2000 instead of Jpeg compression. I have read the suggestion below :
"You can use Acrobat's own PDF Optimizer via Acrobat's Batch feature all by itself - no scripting is necessary."
I wonder where this Acrobat's Batch feature could be found and in which document it is described. I also wonder if it is possible to call it as an external application from a VB6 program (with a Shell call), writing the save options like Jpeg2000 compression as parameters in a command line.
>- is it possible to call an Acrobat plug-in from a VB6 program ? (I saw that a plug-in is an .api file rather than a .dll)
Not directly. A plug-in is loaded by Acrobat, and Acrobat allows the
plug-in to register menu items, tool buttons and so forth. So it is
Acrobat that calls the plug-in, always.
It is possible for an external program to ask Acrobat to run a menu
item, and so run part of a plug-in. But passing parameters is a
separate issue - for example you could put parameters into a file.
>- do PDF Optimizer functions like AVDocSaveOptimized can be called from a C/C++ standalone application ?
The Acrobat SDK cannot be used to make standalone applications:
Acrobat always does the work. The methods available to you are IAC,
which can be a standalone executable using Acrobat, and plug-ins,
which are part of Acrobat. AVDocSaveOptimized is only in the plug-in
So, the way to go in this would be to create a plugin that saves a file as optimised. This plugin would register a menu item and this menu item could be called from the VB or C# app via Acrobat API. Right?
In this scenario, would it still be possible to have a single installer file for the PDF optimiser tool? That is which also installs the Acrobat plugin?
> his plugin would register a menu item and this menu item could be called from the VB or C# app via Acrobat API. Right?
This should work. You still have to consider what back door would be
used to pass parameters, or whether you need parameters (for example
it could just act on the currently open front document).
>In this scenario, would it still be possible to have a single installer file for the PDF optimiser tool? That is which also installs the Acrobat plugin?
You mean, could you write an installer that installed an executable,
and also a plug-in, given that someone has already purchased abnd
installed Acrobat? I don't see why not, but bear in mind that the
location for the Acrobat plug_ins folder is not fixed.
left->right, top->bottom is only true for Roman language documents. For Hebrew or Arabic, for example, it's right->left. For Chinese or Japanese, it may be top->bottom, left->right (for vertical text).
If you are planning to do text extraction on PDF, there is a LOT of complexity involved...
I'm lost on this, as well. How, programmatically, do you optimize? I will be running this process as an automated service, so menu items would be out of the question. It will be a .net windows service that scans a directory, appends the PDFs and optimizes them. How do I go about doing this?
I tried this:
Dim outDoc As CAcroPDDoc
Dim App As CAcroApp
Dim inDoc As CAcroPDDoc
Dim outputFileFullPath As String
Dim inputFileName As String
Dim i As Integer
'Dim fileNames(PDFfiles.Count - 1) As String
Dim xmlFileName As String
Dim w As String, x As String, y As String, z As String
Dim numInPages As Integer, numOutPages
Dim retval As Integer
Dim tempFileName As String
Dim xmlFile As String
Dim processAcrobat() As Process
Dim trialAttempts As Integer = 6
Dim triedAttempts As Integer
Dim finishedOptimization As Boolean
Dim killedAcrobat As Boolean
Dim BRetval As Boolean = False
Dim AcrobatJava As Object
'Dim pp As VariantType
'For i = 0 To PDFfiles.Count - 1
' fileNames(i) = PDFfiles(i)
If PDFfiles.Count = 0 Then
'FileSet.LogMessage("No files were found for this set. Output File was going to be " & outputFileName)
tempFileName = Path.Combine(outputDir, "temp.pdf")
If PDFfiles.Count > 1 Then
outDoc = CreateObject("AcroExch.PDDoc")
App = CreateObject("AcroExch.App")
File.Copy(PDFfiles(0), PDFfiles(0) + ".tmp", True)
outDoc.Open(PDFfiles(0) + ".tmp")
For i = 1 To PDFfiles.Count - 1
inDoc = CreateObject("AcroExch.PDDoc")
inputFileName = PDFfiles(i)
retval = inDoc.Open(inputFileName)
numOutPages = outDoc.GetNumPages() - 1
numInPages = inDoc.GetNumPages()
outDoc = Nothing
BRetval = True
Catch ex As Exception
'FileSet.LogMessage("Error Message 1007: Error concatenating Pdf Files for inputfile " & inputFileName & " OutputFile=" & outputFileName & " Error is " & Err.Description)
BRetval = False
outDoc = Nothing
Do Until killedAcrobat Or triedAttempts = trialAttempts
processAcrobat = System.Diagnostics.Process.GetProcessesByName("Acrobat")
For i = 0 To processAcrobat.GetLength(0) - 1
triedAttempts = triedAttempts + 1
If File.Exists(inputFileName + ".temp") Then
File.Delete(inputFileName + ".temp")
killedAcrobat = True
Catch exException As Exception
killedAcrobat = False
File.Copy(PDFfiles(0), outputFileName, True)
When I get to "getPrintParams" it pops up a dialogue window. How do I get it to not do that?
In adobe there is a function by which you can right click on a group of files, and choose to concatenate them, with a menu option for making the file size smaller. I have tried to scour the documentation for a way to automate this, and have found nothing. Is this at all possible through the SDK?
What's odd is I found a way to combine the PDFs, then save as postscript then distill, but it takes 12 hours, mostly the PDF conversion. the combine and shrink takes about 5. I essentialyl just need a way to shrink the PDF without making postscript of it.