【问题标题】:Adding image layers to a pdf using iText 5 or 7使用 iText 5 或 7 将图像层添加到 pdf
【发布时间】:2019-03-26 08:34:53
【问题描述】:

我需要创建一个包含应包含在图层中的图像的 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 */

希望得到您的帮助,谢谢!

【问题讨论】:

  • 首先,你所说的层到底是什么意思?我问是因为这不是 pdf 规范中定义的术语,所以它对我们来说可能意味着也可能不同。你是否例如是指可选的内容组?
  • 根据 iText 规范:可选内容组是表示图形集合的字典,可以由查看器应用程序的用户动态地使其可见或不可见。在 iText 中,它们被称为图层。
  • 我的回答能解决你的问题吗?或者还有未解决的问题?
  • @mkl 确实如此,谢谢。但是在itext中实现层的概念对我来说确实很奇怪并且难以掌握(开始层和结束层??)。最大的问题是官方文档没有解释任何内容。您知道如何在表格中构建一组图像并同时使用图层吗? (选择在单元格中显示和隐藏图像)。提前致谢!
  • “但是在 itext 中实现层的概念对我来说确实很奇怪,很难掌握” - 原因是“层”这个词已经具有误导性; PDF 规范中的正式名称是“可选内容组”,这更好地描述了这个概念:任何绘制的元素都可以属于这样的 OCG(甚至它们中的多个!),无论内容流中多早或多晚该元素被绘制。并且可以通过在标记内容运算符BDCEMC 之间用标记内容标记OC 将元素括起来来使元素成为可选的。 iText 用 start 和 end 反映了这一点

标签: java image pdf itext layer


【解决方案1】:

您可以通过在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。

【讨论】:

    猜你喜欢
    • 2017-12-19
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多