问题描述
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import javax.imageio.ImageIO;
import org.apache.commons.codec.binary.Base64;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import org.apache.pdfBox.pdmodel.PDDocument;
import org.apache.pdfBox.pdmodel.PDPage;
import org.apache.pdfBox.pdmodel.PDPageContentStream;
import org.apache.pdfBox.pdmodel.graphics.image.PDImageXObject;
public class One {
/**
* @param args
*/
public static void main(String[] args) throws IOException {
// Todo Auto-generated method stub
Scanner s=new Scanner(system.in);
System.out.println("Enter base64 string to be converted to image");
String base64=s.nextLine();
byte[] base64Val=convertToImg(base64);
writeBytetoImageFile(base64Val,"image.png");
System.out.println("Saved the base64 as image in current directory with name image.png");
addImagetoPDF();
}
public static byte[] convertToImg(String base64) throws IOException
{
return Base64.decodeBase64(base64);
}
public static void writeBytetoImageFile(byte[] imgBytes,String imgFileName) throws IOException
{
File imgFile = new File(imgFileName);
BufferedImage img = ImageIO.read(new ByteArrayInputStream(imgBytes));
ImageIO.write(img,"png",imgFile);
}
public static void addImagetoPDF() throws IOException {
File file = new File("C:\\Users\\user\\Downloads\\Risk Template(RiskTemplate).pdf");
PDDocument doc = PDDocument.load(file);
PDPage page = doc.getPage(0);
PDImageXObject pdImage = PDImageXObject.createFromFile("D:\\Development\\Workspace\\1\\image.png",doc);
PDPageContentStream contents = new PDPageContentStream(doc,page);
contents.drawImage(pdImage,5,5);
System.out.println("Image inserted");
contents.close();
doc.save("D:\\Development\\Workspace\\1\\Insertimage_OP.pdf");
doc.close();
}
}
我正在从base64字符串创建图像,然后尝试将该图像附加到pdf。图像创建成功,并且也将图像添加到pdf中,但是pdf(输出)仅在角落处包含图像,并且原始pdf的内容现在为空白。
解决方法
正如MKL和Tilman在评论中所写,您必须使用
PDPageContentStream(document,page,AppendMode.APPEND,true,true);
public static void addImageToPDF() throws IOException {
File file = new File("C:\\Users\\user\\Downloads\\Risk Template(RiskTemplate).pdf");
PDDocument doc = PDDocument.load(file);
PDPage page = doc.getPage(0);
PDImageXObject pdImage = PDImageXObject.createFromFile("D:\\Development\\Workspace\\1\\image.png",doc);
PDPageContentStream contents = new PDPageContentStream(doc,true);
contents.drawImage(pdImage,5,5);
System.out.println("Image inserted");
contents.close();
doc.save("D:\\Development\\Workspace\\1\\InsertImage_OP.pdf");
doc.close();
}
免责声明:该答案由MKL / Tilman给出,但作为参考,答案比评论更“可见”。