Indicates whether the file is a PDF portfolio.
public static boolean isPortfolio(
java.lang.String string,
java.lang.String string2
);
fileName
The name of the PDF file.
password
The password to use when loading this PDF file (if the file is encrypted); otherwise, use null.
true if the file is 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