Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java iText:如何在要刷新以响应的同一文档中插入背景图像_Java_Itext - Fatal编程技术网

Java iText:如何在要刷新以响应的同一文档中插入背景图像

Java iText:如何在要刷新以响应的同一文档中插入背景图像,java,itext,Java,Itext,我正在创建一个PDF文件并编写流作为响应。在写入流之前,我想在所有页面中添加一个背景图像作为水印,这样通过响应刷新的PDF文档就是最后一个带有水印的文档 嗨,这是我的代码示例。任何帮助都是非常感激的 private static String generatePDF(HttpServletRequest request, HttpServletResponse response, String fileName) throws Exception { Document documen

我正在创建一个PDF文件并编写流作为响应。在写入流之前,我想在所有页面中添加一个背景图像作为水印,这样通过响应刷新的PDF文档就是最后一个带有水印的文档

嗨,这是我的代码示例。任何帮助都是非常感激的

private static String generatePDF(HttpServletRequest request, HttpServletResponse   response, String fileName) throws Exception
{
    Document document = null;
    PdfWriter writer = null;
    FileOutputStream fos = null;
    try
    {
       fos = new FileOutputStream(fileName);
       Document document = new Document(PageSize.A4);
       writer = PdfWriter.getInstance(document, fos);
       document.open();

       /**
        * Adding tables and cells and other stuff required
        **/

       return pdfFileName;
  } catch (Exception e) {
       FileUtil.deleteFile(fileName);
       throw e
  } finally {
    if (document != null) {
        document.close();
    }
    fos.flush();
  }
}
我现在想使用下面的代码添加一个背景图像,并将输出的PDF写入同一个流

PdfReader sourcePDFReader = null;
try
{
   sourcePDFReader = new PdfReader(sourcePdfFileName);
   int noOfPages = sourcePDFReader.getNumberOfPages();
   PdfStamper stamp = new PdfStamper(sourcePDFReader, new FileOutputStream(destPdfFileName));
   int i = 0;
   Image templateImage = Image.getInstance(templateImageFile);
   templateImage.setAbsolutePosition(0, 0);
   PdfContentByte tempalteBytes;
   while (i < noOfPages) {
       i++;
       tempalteBytes = stamp.getUnderContent(i);
       tempalteBytes.addImage(templateImage);
   }
   stamp.close();
   return destPdfFileName;
} catch (Exception ex) {
   LOGGER.log(Level.INFO, "Error when applying tempalte image as watermark");
} finally {
     if (sourcePDFReader != null) {
         sourcePDFReader.close();
     }
}
PdfReader sourcePDFReader=null;
尝试
{
sourcePDFReader=新的PdfReader(sourcePdfFileName);
int noOfPages=sourcePDFReader.getNumberOfPages();
PdfStamper stamp=newpdfstamper(sourcePDFReader,newfileoutputstream(destpdfielname));
int i=0;
Image templateImage=Image.getInstance(templateImageFile);
templateImage.setAbsolutePosition(0,0);
PdfContentByte临时字节;
而(我
您可以在两个选项中进行选择:

  • 在页面事件中使用背景图像(指向
    onedpage(
    )方法中的“下”内容)/
  • 在内存中创建第一个PDF,然后使用您发布的代码在第二个过程中添加背景图像

  • 我更喜欢选项1。

    我用布鲁诺的第二个选项解决了这个问题。这是代码

    public static String addBackgroundImageToPDF(ByteArrayOutputStream bos, String destPdfFileName, String templateImageFile)
    {
      PdfReader sourcePDFReader = null;
      try
      {
            sourcePDFReader = new PdfReader(bos.toByteArray());
            int noOfPages = sourcePDFReader.getNumberOfPages();
            PdfStamper stamp = new PdfStamper(sourcePDFReader, new FileOutputStream(destPdfFileName));
            int i = 0;
            Image templateImage = Image.getInstance(templateImageFile);
            templateImage.setAbsolutePosition(0, 0);
            PdfContentByte tempalteBytes;
            while (i < noOfPages)
            {
                  i++;
                  tempalteBytes = stamp.getUnderContent(i);    
                  tempalteBytes.addImage(templateImage);  
            }
             stamp.close();
            return destPdfFileName;
      }
      catch (Exception ex)
      {
            LOGGER.log(Level.INFO, "Error when applying template image as watermark");
      }
      finally
      {
            if (sourcePDFReader != null)
            {
                  sourcePDFReader.close();
            }
      }
    }
    
    public静态字符串addBackgroundImageToPDF(ByteArrayOutputStream bos、字符串destpdfileName、字符串templateImageFile)
    {
    PdfReader sourcePDFReader=null;
    尝试
    {
    sourcePDFReader=newpdfreader(bos.toByteArray());
    int noOfPages=sourcePDFReader.getNumberOfPages();
    PdfStamper stamp=newpdfstamper(sourcePDFReader,newfileoutputstream(destpdfielname));
    int i=0;
    Image templateImage=Image.getInstance(templateImageFile);
    templateImage.setAbsolutePosition(0,0);
    PdfContentByte临时字节;
    而(我
    我用布鲁诺的第一个(推荐的)方法解决了这个问题

    1) 使用
    onEndPage
    事件创建页面事件帮助器:

    class PDFBackground extends PdfPageEventHelper {
    
        @Override
        void onEndPage(PdfWriter writer, Document document) {
            Image background = Image.getInstance("myimage.png");
            // This scales the image to the page,
            // use the image's width & height if you don't want to scale.
            float width = document.getPageSize().getWidth();
            float height = document.getPageSize().getHeight();
            writer.getDirectContentUnder()
                    .addImage(background, width, 0, 0, height, 0, 0);
        }
    
    }
    
    2) 创建编写器时,请注册页面事件帮助器:

    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    writer.setPageEvent(new PDFBackground());
    

    谢谢你回来。约翰,也请开始投票表决所有对你有帮助的答案(不仅仅是你自己的问题)。考虑一下布鲁诺已经为你的选票(即使还没有达到你的最终满意)的答案。“约翰,我正面临同样的问题,你能帮我吗?”me@Subratnayak.I用布鲁诺的第二个选择解决了这个问题。请看下面我的答案。请阅读文档:和