如何使用JPod在PDF中嵌入图像?

时间:2017-08-15 22:50:59

标签: java pdf pdf-generation

我想使用JPod库将图像添加到生成的pdf中。

JPod DrawInLineImagePlain示例(在https://github.com/born2snipe/learning-jpod/blob/master/not-in-repo/examples/de/intarsys/pdf/example/content/DrawInlineImagePlain.java)建议添加这样的图像(假设先前已定义了CSCreator创建者):

// image bytes
private byte[] data = new byte[] { (byte) 170, (byte) 170, (byte) 170,
    (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
    (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
    (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
    (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
    (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
    (byte) 170, (byte) 170, (byte) 170, (byte) 170 };

creator.transform(400, 0, 0, 400, 100, 100);
creator.perform("BI");
creator.perform("/W 16 /H 16 /BPC 1 /CS /G ID");
COSString stringData = COSString.create(data);
creator.perform("EI", stringData);

creator.close();

但是,我不能这样做,因为JPod不再支持perform()。

似乎inlineImage()应该能够嵌入图像。 JPod文档描述了inlineImage(),如下所示:

  

描绘内联图像。 PDF图形操作员" BI"," ID"," EI"。

这让我假设inlineImage()可以编码DrawInLineImagePlain示例中的所有图形运算符,还可以使用以下信息对宽度,高度,每个组件的位数,颜色空间和图像数据进行编码。 PDImage参数。

所以我尝试将这个例子并行化(再次假设CSCreator创建者先前已定义):

// image bytes
byte[] data = new byte[] { (byte) 170, (byte) 170, (byte) 170,
     (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
     (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
     (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
     (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
     (byte) 170, (byte) 170, (byte) 170, (byte) 170, (byte) 170,
     (byte) 170, (byte) 170, (byte) 170, (byte) 170 };

PDImage imageData = (PDImage) PDImage.META.createNew();
imageData.setBytes(data);
imageData.setHeight(16);
imageData.setWidth(16);
imageData.setBitsPerComponent(1);
imageData.setColorSpace(PDColorSpace.getNamed(PDColorSpace.CN_CS_DeviceGray));

creator.inlineImage(imageData);

creator.close();

遗憾的是,这会产生一个空白的PDF。我需要更改什么才能使图像显示在PDF中?

我猜测文档或页面设置没有任何问题,因为我可以将此图像嵌入替换为文本或线条图,并且文本或行将在PDF中正常显示。< / p>

1 个答案:

答案 0 :(得分:0)

遗憾的是,

inlineImage未在CSCreator中实施。使用addOperand直接向内容流添加内容。您的图片代码为:

content.addOperation(new CSOperation(CSOperators.CSO_BI));
CSOperation operationID = new CSOperation(CSOperators.CSO_ID);
operationID.addOperand(PDImage.DK_W);
operationID.addOperand(COSInteger.create(16));
operationID.addOperand(PDImage.DK_H);
operationID.addOperand(COSInteger.create(16));
operationID.addOperand(PDImage.DK_BPC);
operationID.addOperand(COSInteger.create(1));
operationID.addOperand(PDImage.DK_CS);
operationID.addOperand(PDColorSpace.CN_CS_G);
content.addOperation(operationID);
CSOperation operationEI = new CSOperation(CSOperators.CSO_EI);
operationEI.addOperand(COSString.create(data));
content.addOperation(operationEI);

或者使用doImage

将常规图片添加到您的文档中