java - 使用 iText 5 或 7 将图像层添加到 pdf
问题描述
我需要创建一个包含应包含在图层中的图像的 pdf 文档。每个图像都应该包含在一个图层中,以便我们可以选择使每个图像可见或不可见。
我知道 iText 为此目的提供了一个类PdfLayer,但他们没有解释如何使用它。令人惊讶的是,网络上的教程没有涵盖这个问题。
这是一个小小的开始:
// Creating a PdfWriter
String dest = "export.pdf";
PdfWriter writer = new PdfWriter(dest);
// Creating a PdfDocument
PdfDocument pdfDoc = new PdfDocument(writer);
// Adding an empty page
//pdfDoc.addNewPage();
// Creating a Document
Document document = new Document(pdfDoc);
/////////////////////////////////////////////////////////
// Creating an ImageData object
String imageFile = "map.png";
ImageData data = ImageDataFactory.create(imageFile);
// Creating an Image object
Image img = new Image(data);
PdfLayer pdflayer = new PdfLayer("main layer", pdfDoc);
pdflayer.setOn(true);
/* normally, here where the image should be added to the layer */
希望得到您的帮助,谢谢!
解决方案
PdfCanvas
您可以通过在要绘制的图层中开始该图层,添加图像并再次在其中结束图层来将图像添加到图层。
根据您是否要自己进行内容布局工作,您可以直接或通过Canvas
.
例如:
try ( PdfWriter writer = new PdfWriter(...);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc) ) {
ImageData data = ImageDataFactory.create(IMAGE_DATA);
Image img = new Image(data);
PdfLayer pdflayer = new PdfLayer("main layer", pdfDoc);
pdflayer.setOn(true);
// using a Canvas, to allow iText layout'ing the image
PdfCanvas pdfCanvas = new PdfCanvas(pdfDoc.addNewPage());
try ( Canvas canvas = new Canvas(pdfCanvas, pdfDoc, document.getPageEffectiveArea(pdfDoc.getDefaultPageSize())) ) {
canvas.add(new Paragraph("This image is added using a Canvas:"));
pdfCanvas.beginLayer(pdflayer);
canvas.add(img);
pdfCanvas.endLayer();
canvas.add(new Paragraph("And this image is added immediately:"));
}
// or directly
pdfCanvas.beginLayer(pdflayer);
pdfCanvas.addImage(data, 100, 100, false);
pdfCanvas.endLayer();
}
(AddImageToLayer测试testAddLikeIan
)
根据您的问题标题,您正在寻找 iText 5 或 iText 7 的解决方案。上面的代码适用于 iText 7,我使用了当前的开发版本 7.1.4-SNAPSHOT。
推荐阅读
- python - 在 Pandas 中删除 NaN 时遇到问题
- flutter - 是否可以使用 AR 在 Flutter 中构建客户支持以及如何构建?
- django - django rest:测试文件上传但 request.data 为空
- python - 如何获得两个以上列表的对称差异?
- c# - Firebird 嵌入式多用户支持
- java - 有没有办法从 Java 程序中调用 checkstyle?
- python - 使用 Python 处理原始 POST 数据
- leaflet - Leaflet 聚类 choropleth 区域
- .htaccess - 使用 htaccess 在 url 中强制 index.php
- apache - 如何在 mac os x 上使用 APACHE 2.4.25 服务器和 PHP 7.2 修复浏览器中的 ERR_EMPTY_RESPONSE