We have a fully licensed Aspose Total for Java software suite and we are using Aspose.Slides version 14.8.0.
The PowerPoint file does have 90+ slides with embedded images, spreadsheets, and uses slide animations and speaker notes, however the total file size is only 4.2MB prior to conversion.
Are there size limits and/or features in PowerPoint 2010 which Aspose.Slides 14.8.0 does not support?
Are there options which can be set to ignore PowerPoint 2010 features during conversion to PDF?
Any assistance would be greatly appreciated.
Here are the Steps Taken when the Error was encountered:
1) Instantiate a Presentation object that represents a presentation with an absolute path and filename.
2) Instantiate the PdfOptions class
3) Set Jpeg quality
4) Define behavior of metafiles
5) Define the PDF standard as PdfCompliance.Pdf15
6) Set password protect = false
7) Use custom options when saving the presentation object as PDF
8) Delete temporary file used during conversion
Here is the trace for the ERROR Encountered:
canBeConverted(): Powerpoint to PDF conversion will FAIL (format is supported, but OUT-OF-MEMORY problem encountered)
java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 24963920, Num elements: 6240976
at com.aspose.slides.pa5e0ff62.pbdb106a0.p6a2feef8.pa2137a2a.a.(Unknown Source)
at com.aspose.slides.pa5e0ff62.pf4dd765c.pa5e0ff62.pa2137a2a.a.do(Unknown Source)
at com.aspose.slides.pa5e0ff62.pf4dd765c.pa5e0ff62.pf4dd765c.b.do(Unknown Source)
at com.aspose.slides.pa5e0ff62.pbdb106a0.p6a2feef8.b.do(Unknown Source)
at com.aspose.slides.pa5e0ff62.pbdb106a0.p6a2feef8.b.do(Unknown Source)
at com.aspose.slides.p6a2feef8.p883e881b.a.do(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.p2cbca448.a.if(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.p2cbca448.a.do(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.p2cbca448.a.for(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.p2cbca448.a.do(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.ar.do(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.ar.if(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.al.do(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.m.do(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.s.do(Unknown Source)
at com.aspose.slides.p6a2feef8.p390e9825.p6a2feef8.an.do(Unknown Source)
at com.aspose.slides.ass.if(Unknown Source)
at com.aspose.slides.Presentation.do(Unknown Source)
at com.aspose.slides.Presentation.save(Unknown Source)
at validation.AsposeSlides.canBeConverted(AsposeSlides.java:417)
at comment_book_support.SortSupportingDocuments.filterRES_SUPPORTING_DOCS(SortSupportingDocuments.java:900)
Here is a SNIPPET of the JAVA CODE Used:
protected boolean passwordProtect = false;
protected boolean useDefaultOptions = false;
public boolean canBeConverted(String fileName, String dataDir) {
String newFile = fileName.substring(0, fileName.lastIndexOf(“.”)) + “.pdf”;
Presentation presentation = null;
boolean canBeConverted = false;
try {
@Cleanup File myFile = File.createTempFile(newFile.substring(0, newFile.lastIndexOf(“.”)), “.pdf”);
@Cleanup BufferedOutputStream out = null;
try {
// Instantiate a Presentation Object that represents a presentation file
presentation = new Presentation(dataDir + fileName);
// Instantiate the PdfOptions Class for save options
PdfOptions options = new PdfOptions();
// Set Jpeg quality
options.setJpegQuality((byte) 90);
// Define behavior of metafiles
options.setSaveMetaFilesAsPng(true);
// Set Text compression level
options.setTextCompression (PdfTextCompression.Flates);
// Define the PDF standard (ex. pdf15 or PdfA1)
options.setCompliance(PdfCompliance.Pdf15);
// Save the presentation and decide whether to password protect
if (passwordProtect) options.setPassword(“password”);
try {
out = new BufferedOutputStream(new FileOutputStream(myFile));
if (useDefaultOptions) {
// Save the presentation to PDF using default options
presentation.save(out, SaveFormat.Pdf);
}// end if
else {
// Save the presentation to PDF with specified (custom) options
presentation.save(out, SaveFormat.Pdf, options);
}// end else
}// end try
finally {
if (out != null) out.close();
myFile.delete();
}// end finally
canBeConverted = true;
}// end try
catch (OutOfMemoryError err) {
// Print message
err.printStackTrace(System.out);
if (presentation != null) presentation.dispose();
myFile.delete();
canBeConverted = false;
}// end catch
}// end try
catch (Exception e) {
e.printStackTrace(System.out);
if (presentation != null) presentation.dispose();
canBeConverted = false;
}// end catch
finally {
if (presentation != null) presentation.dispose();
}// end finally
return canBeConverted;
}// end canBeConverted
Thanks.
Ed
Hi Edwin,
Mudassir,
Thank you for responding. As suggested, I downloaded Aspose.Slides 14.9.0 and increased my JVM heap size
(-Xms1024 -Xmx1024m -XX:MaxPermSize=256m)
but still encounter the OUT-OF-MEMORY exception. I will admit that it took longer and I monitored my resource usage on my server.
Sharing the PowerPoint presentation which is causing this exception is not an option. I am contemplating a manual process to try and determine which slide is causing the problem or what the Presentation object limitations actually are. I am considering after creating the Presentation object and getting the ISlidesCollection, saving each individual slide to a separate Presentation and then converting each to PDF. After converting each individual slide, merging them back into a single PDF. Essentially, this is what the Presentation.save() should be performing. I am open to any other suggestions and/or recommendations.
Thanks.
Ed
Hi ED,
I have observed the comments shared by you and like to share that setting heap size is dependent on presentation that you are using. If you want to save the presentation slides individually to PDF, it will work as it will reduce the memory consumption and thus avoiding the OutOfMemory exception. The solution is to increase the heap size further. Also, Aspose.Slides now offers to generate the PDF file per page. Please try using the sample code share over this documentation link as well for reference.
Many Thanks,
So I increased my heap size to -Xms2048 -Xmx2048 -XX:MaxPermSize=512m and still get the OUT-OF-MEMORY error.
I also created functionality to convert each individual slide to an individual PDF and then concatenate all of the individual PDFs into a single PDF. For the most part this works except when the slide contains an embedded image (non Clip Art), an embedded XLSX worksheet, or an embedded PDF. When the exception is thrown, I try to gracefully generate an error PDF as a place-holder. Even using this logic and increased heap size, the application throws an OUT-OF-MEMORY exception and then aborts execution.
It’s interesting that if I open the original 70 slide PPTX and use Adobe to create a PDF, I don’t have any issues.
What am I missing? Do the slides containing the embedded objects need to be flattened, or can the troublesome objects be detected and/or ignored?
Here are the methods I am using:
public void convertPowerpoint2PDF(Presentation presentation) {
Vector filesToConcatenate = new Vector();
try {
int i = 0;
try {
ISlidesCollection slidesCollection = presentation.getSlides();
int numSlides = slidesCollection.size();
int[] slides = null;
int[] badSlides = null;
for (i = 1; i
// Setting array of slides positions
sldies = new int[] { i };
try {
// Save the presentation to PDF
presentation.save(“C:/Temp/demo_”+i+".pdf", slides, SaveFormat.Pdf);
}// end try
catch (OutOfMemoryError err) {
try {
badSlides = new int[] { 1 };
Presentation badPresentation = new Presentation(“C:/Temp/BAD Slide PDF.pptx”);
// Save the presentation to PDF
badPresentation.save(“C:/Temp/demo_”+i+".pdf", badSlides, SaveFormat.Pdf);
if (badPresntation != null) badPresentation.dispose();
}// end try
catch (Exception e) {
if (presentation != null) presentation.dispose();
e.printStackTrace(System.out);
}// end catch
// err.printStackTrace(System.out);
}// end catch
catch (Exception e) { e.printStackTrace(System.out); }// end catch
filesToConcatenate.addElement(“demo_”+i+".pdf");
}// end for loop
concatenatePDFs(filesToConcatenate, “test_consolidated.pdf”, “C:/Temp/”);
}// end try
finally { ; }// end finally
}// end try
catch (Exception e) { e.printStackTrace(System.out); }// end catch
finally ( if (presentation != null) presentation.dispose(); }// end finally
}// end convertPowerpoint2PDF
public void concatenatePDFs(Vector filesToConcatenate, String destinationPDF, String dataDir) {
String sourcePDF = “”;
try {
// Open the destination document
com.aspose.pdf.Document pdfDestination = new com.aspose.pdf.Document(dataDir + destinationPDF);
for (int i = 0; i < filesToConcatenate.size(); i++) {
sourcePDF = (String) filesToConcatenate.elementAt(i);
// open source document
com.aspose.pdf.Document pdfSource = new com.aspose.pdf.Document(dataDir + sourcePDF);
// add the page(s) of the source document to the destination document
pdfDestination.getPages().add(pdfSource.getPages());
}// end for loop
// Save the concatenated output file (the destination document)
pdfDestination.save(dataDir + destinationPDF);
// free resources
if (pdfSource != null) pdfSource.dispose();
if (pdfDestination != null) pdfDestination.dispose();
}// end try
catch (Exception e) { e.printStackTrace(System.out); }// end catch
}// end concatenatePDFs
Thanks.
Ed
Hi Ed,
Mudassir,
As I mentioned in a previous post, that is not an option. Perhaps I can make a similar presentation. I did observe that most of the slides that fail have embedded XLSX spreadsheets. Upon further examination of the spreadsheets themselves, they appear to have values in columns not displayed on the slide.
Thanks.
Ed
Mudassir,
I created a sample presentation (see attached Demo_Presentation.zip), using MS Powerpoint 2010, which contains only four slides. Three of the slides throw the OUT-OF-MEMORY error. Slides 1, 3, and 4 throw the exception while Slide 3 is converted without the embedded PDF object (essentially a blank slide).
Slides 1 & 2 contain embedded PDFs inserted as an Adobe Acrobat Document.
Slides 3 & 4 contain embedded XLSX spreadsheets inserted as Microsoft Excel Worksheet. The data was entered by double-clicking the XLSX object.
All of the slides use a customized theme and all utilize the Fade transition.
Thanks.
Ed
Hi Ed,
Mudassir,
I have been testing execution of my code from my workstation. As mentioned earlier in my post, I was able to generate the PDF using standard Adobe software and thought that was a little strange that Adobe works fine and does not use system resources like Aspose.Slides apparently can.
I too am running 64-bit Windows 7 Enterprise with Service Pack 1. I have an AMD Athlon II processor running at 3.40 GHz but only 4GB RAM.
Thanks.
Ed
Hi Ed,
Mudassir,
I have re-written my process to no avail. Perhaps you could share the exact code you used to test? Although you said you were using my sample, I suspect to make it work on your machine you had to tweek a little. You especially had to create an execution shell (main). Perhaps I’m overlooking something very simple.
I was mistaken thinking the file was an Office 2010 pptx. It is actually an Office 2007 pptx. I know this because prior to trying Aspose.Slides, I had written functionality to convert Office Documents to PDF using OpenOffice. Just to see what would happen, I used this functionality to convert the troublesome presentation. Knowing that my version of OpenOffice does not support Office 2010 documents, I fully expected the conversion to fail. To my surprise, it did not. In-fact, the entire document converted with no exceptions caught.
Earlier in this post you recommended increasing my Java heap size which I did on our server. I am curious what are your heap size settings. In addition, you mentioned that the entire presentation object is loaded into memory as a single XML document. I’m curious if there is a formula for estimating/calculating the footprint (amount of memory) this XML document would take based upon the original file size?
Thanks.
Ed
Hi ED,
I have created a sample Net Beans application on my end that I have tested on two machine with Core I7 processor and 8 GB Ram. I have tested using JDK1.6_45 on my end on second machine. The sample application is available for download over this download link:
https://www.dropbox.com/s/pf8rpum1nejn0kx/SampleApp.rar?dl=0
I have used the same code that has been shared by you in your very first post. Also, I have attached the snapshot for maximum memory consumption during PDF export as well. I hope this will be helpful to you. All you need to do now is to set the paths in application as per your machine and test it. I also suggest you to please try using a fresh installation or some new machine to verify the fact. I am using the default heap size that is set be application and have not increased that even.
The generated PDF is also attached for your kind reference as well.
Many Thanks,