У меня есть требование конвертировать файлы PPTx в PDF в формате scala, и в настоящее время я использую подход, в котором мы конвертируем слайды ppt в изображения (с POI 3.17 - у меня есть зависимость, не могу использовать более высокую версию) в al oop и затем добавьте их в файл PDF (с iText версии 5.5.13). Проблема, с которой я сталкиваюсь, заключается в том, что для слайдов, содержащих таблицы, фон таблиц становится черным, а данные не видны.
следующий код
object PptToPdfPOC {
def main(args: Array[String]) {
val is = new FileInputStream("src/test/resources/files/2478.pptx")
val os = new FileOutputStream("src/test/resources/files/2478_Sample_1.pdf")
val ppt: XMLSlideShow = new XMLSlideShow(is)
var zoom: Double = 2;
var at = new AffineTransform()
at.setToScale(zoom, zoom)
var pdfDocument = new Document()
var pdfWriter = PdfWriter.getInstance(pdfDocument, os)
var table = new PdfPTable(1)
pdfWriter.open()
pdfDocument.open()
var pgsize: Dimension = null
var slideImage: Image = null
//getting the dimensions and size of the slide
pgsize = ppt.getPageSize()
var slide = ppt.getSlides().toArray
var img: BufferedImage = null;
for (i <- 0 to slide.length - 1) {
//img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB)
img = new BufferedImage((Math.ceil(pgsize.width * zoom)).toInt, (Math.ceil(pgsize.height * zoom)).toInt, BufferedImage.TYPE_INT_RGB)
var graphics = img.createGraphics()
graphics.setTransform(at)
//clear the drawing area
graphics.setPaint(Color.white)
graphics.setColor(Color.white)
graphics.setBackground(Color.white)
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height))
//render
slide(i).asInstanceOf[XSLFSlide].draw(graphics)
graphics.getPaint()
slideImage = Image.getInstance(img, null)
table.addCell(new PdfPCell(slideImage, true))
}
pdfDocument.add(table)
pdfDocument.close()
pdfWriter.close()
println("2478.pptx was converted to a PDF file")
}
}
пример выходного фрагмента
Я нашел несколько ссылок, где он было упомянуто, что это как-то связано с прозрачными пикселями, но ни один из них мне не подходит.