Java 如何在pdfbox中将通过解码字符串创建的图像插入pdf

Java 如何在pdfbox中将通过解码字符串创建的图像插入pdf,java,image,pdfbox,Java,Image,Pdfbox,我正在尝试将一个图像(需要通过java.util.Base64.getDecoder().decode(imageInputString))从字符串转换为pdf文件的某个位置 代码的主要逻辑是: //create a PDImageXObject myImage first (or something that could be used in addImage method. //And this is what I could not figure out how to accom

我正在尝试将一个图像(需要通过java.util.Base64.getDecoder().decode(imageInputString))从字符串转换为pdf文件的某个位置

代码的主要逻辑是:

  //create a PDImageXObject myImage first (or something that could be used in addImage method. 
  //And this is what I could not figure out how to accomplish.

  //open the pdf file and use addImage to insert the image to the specific page at specific position.
  PDDocument document = PDDocument.load(pdfFile);  
  PDPageContentStream contentStream = new PDPageContentStream(document, pageNumber);
  contentStream.addImage(myImage,x,y);
  document.save();
我找到的大部分教程都是通过读取图像文件创建myImage的。有人能帮我看看我是否可以做同样的事情,但是使用一个字节[],它是java.util.Base64.getDecoder().decode(imageInputString)的输出吗


谢谢

您可以使用静态方法
PDImageXObject.createFromByteArray()
,该方法根据内容检测文件类型,并决定哪种PDF图像类型/图像压缩最好。()

多亏了蒂尔曼·豪瑟。 以下是最终代码(只是核心部分):


您是否尝试过
PDImageXObject.createFromByteArray()
?您的代码缺少几行重要的代码,请参见示例子项目中的源代码下载,例如
ImageToPDF.java
示例。Tilman Hausherr:PDImageXObject.createFromByteArray()是我正在寻找的。谢谢你的帮助。你能写一个答案让我投票吗?我会在你回答后发布我的最终代码。
int pageNumber = j;
PDPage page = document.getPage(pageNumber);
PDResources resources = page.getResources();
byte[] ba = java.util.Base64.getDecoder().decode(base64str);
PDImageXObject sigimg = PDImageXObject.createFromByteArray(document,ba,"signature");
float imgW = sigimg.getWidth();
float imgH = sigimg.getHeight();
PDPageContentStream contentStream = new PDPageContentStream(document, page,PDPageContentStream.AppendMode.APPEND, true,true);
PDRectangle sigRect = field.getWidgets().get(0).getRectangle();
float fieldW = sigRect.getWidth();
float fieldH = sigRect.getHeight();
if (imgW > fieldW || imgH > fieldH){
        if(imgW/fieldW > imgH/fieldH){
                sigimg.setWidth(Math.round(fieldW));
                sigimg.setHeight(Math.round(imgH/imgW*fieldW));
        }
        else{
                sigimg.setWidth(Math.round(imgW/imgH*fieldH));
                sigimg.setHeight(Math.round(fieldH));
        }
}
contentStream.drawImage(sigimg,sigRect.getLowerLeftX(),sigRect.getLowerLeftY());
contentStream.close();