Добавление изображения в pdf через pdfbox, но после добавления pdf получается пустой

#java #pdfbox

#java #pdfbox

Вопрос:

  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 теперь пустое.

Комментарии:

1. Используйте другой PDPageContentStream . Подробности см. в документации JavaDoc по этому классу.

2. Я вижу com.itextpdf импорт, но я не вижу, чтобы вы использовали что-либо из iText API. Можно ли удалить itext тег из этого вопроса?

3. используйте PDPageContentStream(document, page, AppendMode. ДОБАВИТЬ, true, true); . Ваш текущий код должен был выдать вам предупреждение «Вы перезаписываете существующий контент, вам следует использовать режим добавления». Если вы не получили предупреждение, значит, вы отключили сообщения журнала, или они вам не были показаны, или вы их не просматривали.

Ответ №1:

Как написали MKL amp; 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, page, AppendMode.APPEND, true, 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, но для дополнительной справки ответ более «виден», чем комментарий.

Комментарии:

1. Ну, я был слишком ленив, чтобы сделать это реальным ответом, так что здесь 1 для вас…