8

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();
     }
}
4

3 に答える 3

12

ブルーノの最初の(推奨)アプローチを使用してこれを解決しました。

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());
于 2013-10-12T15:49:44.000 に答える
4

ブルーノの2番目のオプションでこれを解決しました。これがコードです。

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();
        }
  }
}
于 2013-09-18T14:54:57.193 に答える
2

次の 2 つのオプションから選択できます。

  1. ページ イベントで背景画像を使用する ( onEndPage() メソッドの「下」のコンテンツに対して)/
  2. メモリ内に最初の PDF を作成し、投稿したコードを使用して 2 番目のパスに背景画像を追加します。

私はオプション1を好みます。

于 2012-10-02T06:26:18.360 に答える