2023-08-01 00:03:13 +01:00
package stirling.software.SPDF.controller.api ;
import java.io.ByteArrayOutputStream ;
2023-08-27 00:39:22 +01:00
import java.io.IOException ;
2023-08-01 00:03:13 +01:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import org.springframework.http.ResponseEntity ;
import org.springframework.web.bind.annotation.PostMapping ;
import org.springframework.web.bind.annotation.RequestPart ;
import org.springframework.web.bind.annotation.RestController ;
import org.springframework.web.multipart.MultipartFile ;
2023-08-27 00:39:22 +01:00
import com.itextpdf.kernel.geom.PageSize ;
import com.itextpdf.kernel.geom.Rectangle ;
import com.itextpdf.kernel.pdf.PdfDocument ;
import com.itextpdf.kernel.pdf.PdfReader ;
import com.itextpdf.kernel.pdf.PdfWriter ;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject ;
import com.itextpdf.layout.Document ;
import com.itextpdf.layout.element.Image ;
2023-08-01 00:03:13 +01:00
import io.swagger.v3.oas.annotations.Operation ;
import io.swagger.v3.oas.annotations.Parameter ;
import io.swagger.v3.oas.annotations.tags.Tag ;
import stirling.software.SPDF.utils.WebResponseUtils ;
@RestController
@Tag ( name = " General " , description = " General APIs " )
public class ToSinglePageController {
private static final Logger logger = LoggerFactory . getLogger ( ToSinglePageController . class ) ;
@PostMapping ( consumes = " multipart/form-data " , value = " /pdf-to-single-page " )
@Operation (
summary = " Convert a multi-page PDF into a single long page PDF " ,
description = " This endpoint converts a multi-page PDF document into a single paged PDF document. The width of the single page will be same as the input's width, but the height will be the sum of all the pages' heights. Input:PDF Output:PDF Type:SISO "
)
public ResponseEntity < byte [ ] > pdfToSinglePage (
@RequestPart ( required = true , value = " fileInput " )
@Parameter ( description = " The input multi-page PDF file to be converted into a single page " , required = true )
MultipartFile file ) throws IOException {
PdfReader reader = new PdfReader ( file . getInputStream ( ) ) ;
PdfDocument sourceDocument = new PdfDocument ( reader ) ;
float totalHeight = 0 ;
float width = 0 ;
for ( int i = 1 ; i < = sourceDocument . getNumberOfPages ( ) ; i + + ) {
Rectangle pageSize = sourceDocument . getPage ( i ) . getPageSize ( ) ;
totalHeight + = pageSize . getHeight ( ) ;
if ( width < pageSize . getWidth ( ) )
width = pageSize . getWidth ( ) ;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream ( ) ;
PdfWriter writer = new PdfWriter ( baos ) ;
PdfDocument newDocument = new PdfDocument ( writer ) ;
PageSize newPageSize = new PageSize ( width , totalHeight ) ;
newDocument . addNewPage ( newPageSize ) ;
Document layoutDoc = new Document ( newDocument ) ;
float yOffset = totalHeight ;
for ( int i = 1 ; i < = sourceDocument . getNumberOfPages ( ) ; i + + ) {
PdfFormXObject pageCopy = sourceDocument . getPage ( i ) . copyAsFormXObject ( newDocument ) ;
Image copiedPage = new Image ( pageCopy ) ;
copiedPage . setFixedPosition ( 0 , yOffset - sourceDocument . getPage ( i ) . getPageSize ( ) . getHeight ( ) ) ;
yOffset - = sourceDocument . getPage ( i ) . getPageSize ( ) . getHeight ( ) ;
layoutDoc . add ( copiedPage ) ;
}
layoutDoc . close ( ) ;
sourceDocument . close ( ) ;
byte [ ] result = baos . toByteArray ( ) ;
return WebResponseUtils . bytesToWebResponse ( result , file . getOriginalFilename ( ) . replaceFirst ( " [.][^.]+$ " , " " ) + " _singlePage.pdf " ) ;
}
}