我已经使用Java中的iText生成了pdf报告。现在,我需要拍摄一些iText图像(com.itextpdf.layout.element.Image),然后使用POI将其放入电子表格中。我正在使用iText 7。
我创建了一个基于Rectangle的PdfFormXObject。然后,我基于PdfFormXObject创建了一个PdfCanvas。在画布上添加线条和文本后,便将PdfFormXObject转换为iText图像。这张图片是他们插入到iText表中的。
我现在需要拍摄相同的图像并将其转换,以便POI可以在电子表格中使用它。
在下面的代码示例中,wb.addPicture(image,1)产生错误,因为图像格式错误。是否可以将此iText图像转换为java.awt.image?
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.UnitValue;
import com.itextpdf.layout.renderer.IRenderer;
public class Test {
public static void main(String[] args) {
try {
PdfDocument pdf = new PdfDocument(new PdfWriter("comparison2.pdf"));
Rectangle graphBox = new Rectangle(246, 98);
PdfFormXObject graph = new PdfFormXObject(graphBox);
graph.makeIndirect(pdf);
PdfCanvas canvas = new PdfCanvas(graph, pdf);
canvas.setStrokeColor(new DeviceRgb(195, 195, 195))
.setLineDash(0)
.setLineWidth(1.0f)
.moveTo(2, 98)
.lineTo(246, 98)
.lineTo(246, 2)
.lineTo(2, 2)
.closePathStroke();
Image image = new Image(graph);
Rectangle pageSize = new Rectangle(612, 792);
Document doc = new Document(pdf, new PageSize(pageSize).rotate(), true);
doc.setMargins(65, 20, 80, 20);
Table table = new Table(UnitValue.createPercentArray(new float[]{1,1,1}));
table.setWidth(UnitValue.createPercentValue(100));
table.addCell(image);
doc.add(table);
doc.close();
pdf.close();
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("test");
wb.addPicture(image, 1);
FileOutputStream out = new FileOutputStream("test.xlsx");
wb.write(out);
out.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}