Java iText:如何在要刷新以响应的同一文档中插入背景图像
我正在创建一个PDF文件并编写流作为响应。在写入流之前,我想在所有页面中添加一个背景图像作为水印,这样通过响应刷新的PDF文档就是最后一个带有水印的文档 嗨,这是我的代码示例。任何帮助都是非常感激的Java iText:如何在要刷新以响应的同一文档中插入背景图像,java,itext,Java,Itext,我正在创建一个PDF文件并编写流作为响应。在写入流之前,我想在所有页面中添加一个背景图像作为水印,这样通过响应刷新的PDF文档就是最后一个带有水印的文档 嗨,这是我的代码示例。任何帮助都是非常感激的 private static String generatePDF(HttpServletRequest request, HttpServletResponse response, String fileName) throws Exception { Document documen
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(
)方法中的“下”内容)/我更喜欢选项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用布鲁诺的第二个选择解决了这个问题。请看下面我的答案。请阅读文档:和