2023-07-09 00:05:33 +01:00
package stirling.software.SPDF.controller.api ;
import java.io.ByteArrayInputStream ;
import java.io.ByteArrayOutputStream ;
import java.io.IOException ;
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.RequestParam ;
import org.springframework.web.bind.annotation.RestController ;
import org.springframework.web.multipart.MultipartFile ;
import com.itextpdf.kernel.geom.PageSize ;
import com.itextpdf.kernel.pdf.PdfDocument ;
import com.itextpdf.kernel.pdf.PdfPage ;
import com.itextpdf.kernel.pdf.PdfReader ;
import com.itextpdf.kernel.pdf.PdfWriter ;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas ;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject ;
import io.swagger.v3.oas.annotations.Operation ;
import io.swagger.v3.oas.annotations.Parameter ;
import io.swagger.v3.oas.annotations.media.Schema ;
import io.swagger.v3.oas.annotations.tags.Tag ;
import stirling.software.SPDF.utils.WebResponseUtils ;
@RestController
@Tag ( name = "General" , description = "General APIs" )
public class CropController {
private static final Logger logger = LoggerFactory . getLogger ( CropController . class );
@PostMapping ( value = "/crop" , consumes = "multipart/form-data" )
@Operation ( summary = "Crops a PDF document" , description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO" )
public ResponseEntity < byte []> cropPdf (
2023-07-22 13:17:24 +01:00
@Parameter ( description = "The input PDF file" , required = true ) @RequestParam ( "fileInput" ) MultipartFile file ,
2023-07-09 00:05:33 +01:00
@Parameter ( description = "The x-coordinate of the top-left corner of the crop area" , required = true , schema = @Schema ( type = "number" )) @RequestParam ( "x" ) float x ,
@Parameter ( description = "The y-coordinate of the top-left corner of the crop area" , required = true , schema = @Schema ( type = "number" )) @RequestParam ( "y" ) float y ,
@Parameter ( description = "The width of the crop area" , required = true , schema = @Schema ( type = "number" )) @RequestParam ( "width" ) float width ,
@Parameter ( description = "The height of the crop area" , required = true , schema = @Schema ( type = "number" )) @RequestParam ( "height" ) float height ) throws IOException {
byte [] bytes = file . getBytes ();
System . out . println ( "x=" + x + ", " + "y=" + y + ", " + "width=" + width + ", " + "height=" + height );
PdfReader reader = new PdfReader ( new ByteArrayInputStream ( bytes ));
PdfDocument pdfDoc = new PdfDocument ( reader );
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
PdfWriter writer = new PdfWriter ( baos );
PdfDocument outputPdf = new PdfDocument ( writer );
int totalPages = pdfDoc . getNumberOfPages ();
for ( int i = 1 ; i <= totalPages ; i ++ ) {
PdfPage page = outputPdf . addNewPage ( new PageSize ( width , height ));
PdfCanvas pdfCanvas = new PdfCanvas ( page );
PdfFormXObject formXObject = pdfDoc . getPage ( i ). copyAsFormXObject ( outputPdf );
// Save the graphics state, apply the transformations, add the object, and then
// restore the graphics state
pdfCanvas . saveState ();
pdfCanvas . rectangle ( x , y , width , height );
pdfCanvas . clip ();
pdfCanvas . addXObject ( formXObject , - x , - y );
pdfCanvas . restoreState ();
}
outputPdf . close ();
byte [] pdfContent = baos . toByteArray ();
pdfDoc . close ();
return WebResponseUtils . bytesToWebResponse ( pdfContent ,
file . getOriginalFilename (). replaceFirst ( "[.][^.]+$" , "" ) + "_cropped.pdf" );
}
}