Mesclar arquivos PDF em Java
Aspose.PDF for Java suporta várias estratégias de mesclagem dependendo de como a saída deve ser montada.
Mesclar dois documentos PDF
Use esta abordagem quando precisar do fluxo de mesclagem mais simples e quiser anexar um documento completo a outro.
- Abra ambos os PDFs de origem como objetos Document.
- Adicione o Page coleção do segundo documento para o primeiro documento.
- Salve o PDF atualizado Document.
public static void mergeTwoDocuments(Path inputFile1, Path inputFile2, Path outputFile) {
try (Document document1 = new Document(inputFile1.toString());
Document document2 = new Document(inputFile2.toString())) {
document1.getPages().add(document2.getPages());
document1.save(outputFile.toString());
}
}
Copiar um intervalo de páginas selecionado entre documentos
Este método auxiliar mantém a lógica de mesclagem de intervalo de páginas em um só lugar, para que outros exemplos possam reutilizar a mesma rotina de cópia validada.
- Abra ou receber o PDF de origem e destino objetos Document.
- Normalize o intervalo de páginas solicitado para que permaneça dentro do disponível Page coleção.
- Adicione cada página do intervalo validado ao documento de destino.
private static void appendPageRange(Document sourceDocument, Document destinationDocument, int startPage, int endPage) {
int totalPages = sourceDocument.getPages().size();
if (totalPages == 0) {
return;
}
int start = Math.max(1, startPage);
int end = Math.min(endPage, totalPages);
if (start > end) {
return;
}
for (int pageNumber = start; pageNumber <= end; pageNumber++) {
destinationDocument.getPages().add(sourceDocument.getPages().get_Item(pageNumber));
}
}
Mesclar vários documentos PDF em um único arquivo
Use este padrão quando precisar combinar uma lista de arquivos de entrada em um único documento de saída em sequência.
- Crie um PDF de saída vazio Document.
- Abra cada arquivo de entrada um de cada vez e copie todo o seu conteúdo Page intervalo no documento de saída.
- Salve o resultado mesclado depois que todos os arquivos de origem forem processados.
public static void mergeMultipleDocuments(List<Path> inputFiles, Path outputFile) {
try (Document outputDocument = new Document()) {
for (Path inputFile : inputFiles) {
try (Document sourceDocument = new Document(inputFile.toString())) {
appendPageRange(sourceDocument, outputDocument, 1, sourceDocument.getPages().size());
}
}
outputDocument.save(outputFile.toString());
}
}
Mesclar intervalos de páginas selecionados de dois documentos
Este exemplo cria um arquivo de saída personalizado ao selecionar apenas intervalos de páginas específicos de cada documento de origem.
- Abra ambos os PDFs de origem como objetos Document e crie um novo documento de saída.
- Adicione apenas o necessário Page intervalos de cada documento de origem.
- Salve o documento de saída montado.
public static void mergeSelectedPageRanges(Path inputFile1, Path inputFile2, Path outputFile) {
try (Document document1 = new Document(inputFile1.toString());
Document document2 = new Document(inputFile2.toString());
Document outputDocument = new Document()) {
appendPageRange(document1, outputDocument, 1, 2);
appendPageRange(document2, outputDocument, 2, 3);
outputDocument.save(outputFile.toString());
}
}
Inserir um documento PDF em outro em uma posição específica
Use esta abordagem quando um documento deve aparecer dentro de outro, em vez de apenas antes ou depois dele.
- Abra o PDF base e o PDF inserido objetos Document e crie um novo documento de saída.
- Copie a primeira parte do documento base, depois adicione o documento inserido completo e, por fim, adicione o restante do documento base. Page intervalo.
- Salve o resultado reordenado em um novo arquivo.
public static void mergeInsertDocumentAtPosition(Path inputFile1, Path inputFile2, int insertAfterPage, Path outputFile) {
try (Document baseDocument = new Document(inputFile1.toString());
Document insertDocument = new Document(inputFile2.toString());
Document outputDocument = new Document()) {
int baseTotalPages = baseDocument.getPages().size();
int insertIndex = Math.max(0, Math.min(insertAfterPage, baseTotalPages));
appendPageRange(baseDocument, outputDocument, 1, insertIndex);
appendPageRange(insertDocument, outputDocument, 1, insertDocument.getPages().size());
appendPageRange(baseDocument, outputDocument, insertIndex + 1, baseTotalPages);
outputDocument.save(outputFile.toString());
}
}
Mesclar dois documentos PDF alternando páginas
Este exemplo intercala páginas de dois documentos, o que é útil quando ambas as entradas devem contribuir página por página para a saída final.
- Abra ambos os PDFs de origem como objetos Document e crie um novo documento de saída.
- Percorra a contagem máxima de páginas disponíveis e adicione cada uma disponível Page do primeiro e do segundo documentos, respectivamente.
- Salve o documento de saída intercalado.
public static void mergeAlternatingPages(Path inputFile1, Path inputFile2, Path outputFile) {
try (Document document1 = new Document(inputFile1.toString());
Document document2 = new Document(inputFile2.toString());
Document outputDocument = new Document()) {
int document1Pages = document1.getPages().size();
int document2Pages = document2.getPages().size();
int maxPages = Math.max(document1Pages, document2Pages);
for (int pageNumber = 1; pageNumber <= maxPages; pageNumber++) {
if (pageNumber <= document1Pages) {
outputDocument.getPages().add(document1.getPages().get_Item(pageNumber));
}
if (pageNumber <= document2Pages) {
outputDocument.getPages().add(document2.getPages().get_Item(pageNumber));
}
}
outputDocument.save(outputFile.toString());
}
}
Mesclar documentos com páginas separadoras e marcadores
Use este padrão quando o arquivo mesclado precisar permanecer fácil de navegar e mostrar claramente onde cada documento de origem começa.
- Crie um PDF de saída vazio Document e abra cada arquivo fonte por sua vez.
- Adicione um separador Page com um título, então crie um OutlineItemCollection marcador para essa seção.
- Anexe as páginas de origem, opcionalmente adicione um marcador que aponta para a primeira página de conteúdo e salve o documento final mesclado.
public static void mergeWithSectionSeparatorsAndBookmarks(List<Path> inputFiles, Path outputFile) {
try (Document outputDocument = new Document()) {
int sectionIndex = 1;
for (Path inputFile : inputFiles) {
try (Document sourceDocument = new Document(inputFile.toString())) {
int sourcePageCount = sourceDocument.getPages().size();
Page separatorPage = outputDocument.getPages().add();
separatorPage.getParagraphs().add(new TextFragment(
"Section " + sectionIndex + ": " + inputFile.getFileName()));
OutlineItemCollection sectionBookmark = new OutlineItemCollection(outputDocument.getOutlines());
sectionBookmark.setTitle("Section " + sectionIndex);
sectionBookmark.setAction(new GoToAction(separatorPage));
outputDocument.getOutlines().add(sectionBookmark);
int firstContentPageNumber = outputDocument.getPages().size() + 1;
appendPageRange(sourceDocument, outputDocument, 1, sourcePageCount);
if (sourcePageCount > 0 && firstContentPageNumber <= outputDocument.getPages().size()) {
OutlineItemCollection contentBookmark = new OutlineItemCollection(outputDocument.getOutlines());
contentBookmark.setTitle("Section " + sectionIndex + " Content");
contentBookmark.setAction(new GoToAction(outputDocument.getPages().get_Item(firstContentPageNumber)));
sectionBookmark.add(contentBookmark);
}
}
sectionIndex++;
}
outputDocument.save(outputFile.toString());
}
}