[英]How to translate correctly an iText5 code piece to an iText7?
我是一位SQL / ETL(PowerCenter)/ bash / Python開發人員,對Java的經驗很少。 我有一個任務-我需要使用.pptx模板,對其進行自定義,然后轉換為.pdf文件。 我決定從第二步開始,因此我以它為例。 我擁有最新版本的庫(iText7和POI4),因此必須修改此代碼才能進行編譯。 我能夠在“導入”部分中找到移動的軟件包,但隨后我被卡在這里:
slideImage = Image.getInstance(img, null);
我的新庫說,不再支持getInstance ( 無法找到symbol )。 我正在嘗試跳過此步驟並使用類似
table.addCell(new PdfPCell(slideImage, true));
我已經改為
table.addCell(new Cell(img, true));
將此bufferedImage直接添加到單元格,它會引發轉換錯誤,例如“ BufferedImage無法轉換為int)。如何將BufferedImage轉換為Image?我讀到第一個是第二個的子代,因此無需轉換它,但是它不起作用。下面我提供由我調整的代碼。在此先感謝您!
import java.io.FileOutputStream;
import java.io.*;
import java.io.IOException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hslf.record.Slide;
import org.apache.poi.sl.usermodel.SlideShow;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Table;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.geom.PageSize;
public void createPdf(String inFileName, String outFileName)
throws IOException
{
FileInputStream inputStream = new FileInputStream(inFileName);
double zoom = 2;
AffineTransform at = new AffineTransform();
at.setToScale(zoom, zoom);
Table table = new Table(1);
Dimension pgsize = null;
Image slideImage = null;
BufferedImage img = null;
XMLSlideShow ppt = new XMLSlideShow(inputStream);
pgsize = ppt.getPageSize();
// PDF part
// Initialize PDF writer
PdfWriter writer = new PdfWriter(outFileName);
// Initialize PDF document
PdfDocument pdf = new PdfDocument(writer);
// Initialize document
Rectangle srcPageSize = new Rectangle((float) pgsize.getWidth(), (float) pgsize.getHeight());
Document doc = new Document(pdf, new PageSize(srcPageSize));
List<XSLFSlide> slides = ppt.getSlides();
// writer.open();
// pdfDocument.open();
for (XSLFSlide slide : ppt.getSlides()) {
img = new BufferedImage((int) Math.ceil(pgsize.width * zoom), (int) Math.ceil(pgsize.height * zoom), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
graphics.setTransform(at);
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
slide.draw(graphics);
graphics.getPaint();
// Original start
// slideImage = Image.getInstance(img, null);
// table.addCell(new PdfPCell(slideImage, true));
// Original end
table.addCell(new Cell(img, true));
}
// pdfDocument.add(table);
// pdfDocument.close();
// pdfWriter.close();
System.out.println("Powerpoint file converted to PDF successfully");
// catch (IOException e)
// {
// System.err.println("FileStreamsReadnWrite: " + e);
// }
}
您可以嘗試以下使用當前API的方法 :
// you need to convert the BufferedImage to a byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
ImageData image = ImageDataFactory.create(baos.toByteArray());
table.addCell(new Image(image));
還有其他有趣的方法,例如ImageDataFactory.create(String filename)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.