Indicates whether the stream contains a PDF portfolio.
public static boolean isPortfolio(
leadtools.ILeadStream iLeadStream,
java.lang.String string
);
stream
Stream containing the data of a PDF document.
password
The password to use when loading this PDF file (if the file is encrypted); otherwise, use null.
true if the file is a PDF portfolio; otherwise, false.
A PDF file can be created as a portfolio which contains multiple files assembled into an integrated unit. In these types of documents, the file contains a single generic help page with text such as "For the best experience, open this PDF portfolio in a compatible viewer", any number of attachments, and a schema to control how to view the document.
Refer to PDFDocument.EmbeddedFiles for more information.
using Leadtools.WinForms;
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Controls;
using Leadtools.Drawing;
using Leadtools.ImageProcessing;
using Leadtools.Pdf;
using Leadtools.Svg;
public static void ExtractAttachmentsAndStitch(string inputFileName, string outputFileName)
{
File.Delete(outputFileName);
// Get the number of embedded files (attachments) in the input file
int attachmentCount = PDFFile.GetEmbeddedFileCount(inputFileName, null);
// If the file does not have any attachments we are done
if (attachmentCount == 0)
{
File.Copy(inputFileName, outputFileName, true);
return;
}
// To convert attachment files that are not PDF
var rasterCodecs = new RasterCodecs();
rasterCodecs.ThrowExceptionsOnInvalidImages = false;
var tempFiles = new List<string>();
// Now, extract all the attachments
for (int attachmentNumber = 1; attachmentNumber <= attachmentCount; attachmentNumber++)
{
// Extract this attachment to a temporary file
string tempFile = Path.GetTempFileName();
PDFFile.ExtractEmbeddedFile(inputFileName, null, attachmentNumber, tempFile);
// If attachment is not PDF, convert it
RasterImageFormat format;
int pageCount;
using (CodecsImageInfo info = rasterCodecs.GetInformation(tempFile, true))
{
format = info.Format;
pageCount = info.TotalPages;
}
if (format == RasterImageFormat.Unknown)
{
// We do not know what to do with this attachment, log and ignore it
Console.WriteLine("Could not convert attachment file to PDF, ignoring");
File.Delete(tempFile);
}
else if (format != RasterImageFormat.RasPdf)
{
// Simple conversion using RasterImage.
// TODO for the Example: A better way is to use the DocumentConverter to get true document conversion with all the
// options available
string tempPdfFile = Path.GetTempFileName();
for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++)
{
using (RasterImage image = rasterCodecs.Load(tempFile, pageNumber))
{
rasterCodecs.Save(image, tempPdfFile, RasterImageFormat.RasPdfJpeg422, 0, 1, -1, -1, CodecsSavePageMode.Append);
}
}
File.Copy(tempPdfFile, tempFile, true);
File.Delete(tempPdfFile);
tempFiles.Add(tempFile);
}
else
{
// TODO for the Example: Check if this file is PDF with attachments and call the function recursively.
tempFiles.Add(tempFile);
}
}
// Time to generate the final document, first the pages from the original document
// Did we extract/convert any attachments?
if (tempFiles.Count > 0)
{
// Note that if the original document is PDF portfolio, then it does not contain real pages. Just a placeholder that should be ignored
if (!PDFFile.IsPortfolio(inputFileName, null))
{
PDFFile file = new PDFFile(inputFileName);
file.MergeWith(tempFiles.ToArray(), outputFileName);
}
else
{
// This is portfolio, so we will ignore the original file and just merge the attachments
string firstFile = tempFiles[0];
tempFiles.RemoveAt(0);
PDFFile file = new PDFFile(firstFile);
file.MergeWith(tempFiles.ToArray(), outputFileName);
File.Delete(firstFile);
}
}
else
{
// No, just copy the original file over
File.Copy(inputFileName, outputFileName, true);
}
// Clean up
foreach (string tempFile in tempFiles)
File.Delete(tempFile);
rasterCodecs.Dispose();
}
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import org.junit.*;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import static org.junit.Assert.*;
import leadtools.*;
import leadtools.codecs.*;
import leadtools.pdf.*;
public void pdfFileExtractAttachmentsAndStitch() throws IOException {
final String LEAD_VARS_IMAGES_DIR = "C:\\LEADTOOLS23\\Resources\\Images";
String inputFileName = combine(LEAD_VARS_IMAGES_DIR, "leadtools.pdf");
String outputFileName = combine(LEAD_VARS_IMAGES_DIR, "LEAD_extractedAndStitched.pdf");
// Get the number of embedded files (attachments) in the input file
int attachmentCount = PDFFile.getEmbeddedFileCount(inputFileName, null);
// If the file does not have any attachments we are done
if (attachmentCount == 0) {
Files.copy(Paths.get(inputFileName), Paths.get(outputFileName), StandardCopyOption.REPLACE_EXISTING);
return;
}
// To convert attachment files that are not PDF
RasterCodecs rasterCodecs = new RasterCodecs();
rasterCodecs.setThrowExceptionsOnInvalidImages(false);
ArrayList<String> tempFiles = new ArrayList<String>();
// Now, extract all the attachments
for (int attachmentNumber = 1; attachmentNumber <= attachmentCount; attachmentNumber++) {
// Extract this attachment to a temporary file
InputStream temp = new FileInputStream(new File("temp"));
LeadStream tempFile = new LeadStream(temp, false);
PDFFile.extractEmbeddedFile(inputFileName, null, attachmentNumber, tempFile);
// If attachment is not PDF, convert it
RasterImageFormat format;
int pageCount;
CodecsImageInfo info = rasterCodecs.getInformation(tempFile, true);
format = info.getFormat();
pageCount = info.getTotalPages();
info = null;
if (format == RasterImageFormat.UNKNOWN) {
// We do not know what to do with this attachment, log and ignore it
System.out.println("Could not convert attachment file to PDF, ignoring");
tempFile.dispose();
} else if (format != RasterImageFormat.RAS_PDF) {
// Simple conversion using RasterImage.
// TODO for the Example: A better way is to use the DocumentConverter to get
// true document conversion with all the
// options available
// string tempPdfFile = Path.GetTempFileName();
File tempPdfFile = new File("tempPdfFile");
for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++) {
RasterImage image = rasterCodecs.load("tempPdfFile", pageNumber);
rasterCodecs.save(image, "tempPdfFile", RasterImageFormat.RAS_PDF_JPEG_422, 0, 1, -1, -1,
CodecsSavePageMode.APPEND);
image = null;
}
Files.copy(Paths.get(tempPdfFile.getName()), Paths.get(tempFile.getFileName()),
StandardCopyOption.REPLACE_EXISTING);
tempPdfFile.delete();
tempFiles.add(tempFile.getFileName());
} else {
// TODO for the Example: Check if this file is PDF with attachments and call the
// function recursively.
tempFiles.add(tempFile.getFileName());
}
}
// Time to generate the final document, first the pages from the original
// document
// Did we extract/convert any attachments?
if (tempFiles.size() > 0) {
// Note that if the original document is PDF portfolio, then it does not contain
// real pages. Just a placeholder that should be ignored
PDFFile file;
if (!PDFFile.isPortfolio(inputFileName, null)) {
file = new PDFFile(inputFileName);
file.mergeWith(tempFiles.toArray(new String[tempFiles.size()]), outputFileName);
} else {
// This is portfolio, so we will ignore the original file and just merge the
// attachments
String firstFile = tempFiles.get(0);
tempFiles.remove(0);
file = new PDFFile(firstFile);
file.mergeWith(tempFiles.toArray(new String[tempFiles.size()]), outputFileName);
file = null;
}
} else {
// No, just copy the original file over
Files.copy(Paths.get(inputFileName), Paths.get(outputFileName), StandardCopyOption.REPLACE_EXISTING);
}
assertTrue("Check if destination file exists", new File(outputFileName).exists());
// Clean up
rasterCodecs.dispose();
}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
Your email has been sent to support! Someone should be in touch! If your matter is urgent please come back into chat.
Chat Hours:
Monday - Friday, 8:30am to 6pm ET
Thank you for your feedback!
Please fill out the form again to start a new chat.
All agents are currently offline.
Chat Hours:
Monday - Friday
8:30AM - 6PM EST
To contact us please fill out this form and we will contact you via email.