如何使用IText7将源PDF内容添加到目标PDF,而不丢失页眉和页脚?
我正在使用iText7。我有两个PDF文件。源PDF有一些内容。目标PDF具有页眉和页脚。我有一个要求,将内容从源PDF添加到目的地PDF在页面中间,而不重叠的页眉和页脚的目的地PDF。有人能帮我查一下密码吗 下面是我的代码,所附文档是需要嵌入final.PDF中的源PDF的屏幕截图如何使用IText7将源PDF内容添加到目标PDF,而不丢失页眉和页脚?,pdf,itext7,Pdf,Itext7,我正在使用iText7。我有两个PDF文件。源PDF有一些内容。目标PDF具有页眉和页脚。我有一个要求,将内容从源PDF添加到目的地PDF在页面中间,而不重叠的页眉和页脚的目的地PDF。有人能帮我查一下密码吗 下面是我的代码,所附文档是需要嵌入final.PDF中的源PDF的屏幕截图 import java.io.File; import java.io.FileOutputStream; import java.net.MalformedURLException; import java.ni
import java.io.File;
import java.io.FileOutputStream;
import java.net.MalformedURLException;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.Style;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.borders.SolidBorder;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.element.Text;
import com.itextpdf.layout.font.FontProvider;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.UnitValue;
import com.itextpdf.layout.property.VerticalAlignment;
public class TestPdf {
public static void main(String[] args) {
String uuid = UUID.randomUUID().toString();
try{
@SuppressWarnings("resource")
PdfWriter writer = new PdfWriter(new FileOutputStream(new File(Paths.get("Output").toAbsolutePath()+"/final.pdf"))).setSmartMode(true);
PdfDocument pdfDoc = new PdfDocument(writer);
pdfDoc.setDefaultPageSize(PageSize.A4.rotate());
String fonts[] = {Paths.get("fonts").toAbsolutePath() + "/TREBUC.TTF", Paths.get("fonts").toAbsolutePath() + "/TREBUCBD.TTF", Paths.get("fonts").toAbsolutePath() + "/TREBUCBI.TTF",Paths.get("fonts").toAbsolutePath() + "/TREBUCIT.TTF"};
FontProvider fontProvider = new FontProvider();
Map<String, PdfFont> pdfFontMap = new HashMap();
for (String font : fonts) {
FontProgram fontProgram = FontProgramFactory.createFont(font);
if(font.endsWith("TREBUC.TTF")) {
pdfFontMap.put("NORMAL", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
} else if(font.endsWith("TREBUCBD.TTF")) {
pdfFontMap.put("BOLD", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
} else if(font.endsWith("TREBUCBI.TTF")) {
pdfFontMap.put("BOLD_ITALIC", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
} else if(font.endsWith("TREBUCIT.TTF")) {
pdfFontMap.put("ITALIC", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
}
fontProvider.addFont(fontProgram);
}
TestPdf testPdf = new TestPdf();
NormalPageHeader headerHandler = testPdf.new NormalPageHeader(Paths.get("images").toAbsolutePath() + "\\logo.png", pdfFontMap);
pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
PageEndEvent pageEndEvent = testPdf.new PageEndEvent(Paths.get("images").toAbsolutePath() + "\\FooterLineExternal.png" ,pdfFontMap);
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, pageEndEvent);
Document doc = new Document(pdfDoc);
doc.getPageEffectiveArea(PageSize.A4.rotate());
Table imageTable = new Table(1);
imageTable.setBorder(Border.NO_BORDER);
imageTable.setWidth(UnitValue.createPercentValue(100));
Cell cell = new Cell();
Paragraph paragraph = new Paragraph("Title");
paragraph.setVerticalAlignment(VerticalAlignment.TOP);
cell.add(paragraph);
cell.setBorder(Border.NO_BORDER);
cell.setPaddingTop(50);
imageTable.addCell(cell);
doc.add(imageTable);
doc.close();
System.out.println("Converted to PDF Succesfully >>> convertedSvg_"+uuid+".pdf");
}catch(Exception e){
e.printStackTrace();
System.out.println("Error Occured while converting to PDF = " + e.getMessage());
}
}
class NormalPageHeader implements IEventHandler {
String header;
Map<String, PdfFont> font;
public NormalPageHeader(String header, Map<String, PdfFont> font) {
this.header = header;
this.font = font;
}
@Override
public void handleEvent(Event event) {
//Retrieve document and
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdf = docEvent.getDocument();
PdfPage page = docEvent.getPage();
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(
page.getLastContentStream(), page.getResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
canvas.setFontSize(10f);
Table table = new Table(3);
table.setBorder(Border.NO_BORDER);
table.setWidth(UnitValue.createPercentValue(100));
Cell leftCell = new Cell();
leftCell.setFont(font.get("NORMAL"));
leftCell.setPaddingTop(15);
leftCell.setPaddingLeft(20);
leftCell.setBorder(Border.NO_BORDER);
leftCell.setBorderBottom(new SolidBorder(0.5f));
leftCell.setWidth(UnitValue.createPercentValue(33.3f));
Text userLabel = new Text("Username: ");
userLabel.setBold();
Paragraph paragraph = new Paragraph(userLabel);
Cell middleCell = new Cell();
middleCell.setFont(font.get("NORMAL"));
middleCell.setPaddingTop(15);
middleCell.setBorder(Border.NO_BORDER);
middleCell.setBorderBottom(new SolidBorder(0.5f));
middleCell.setWidth(UnitValue.createPercentValue(33.3f));
paragraph = new Paragraph("Main Header");
paragraph.setTextAlignment(TextAlignment.CENTER);
paragraph.setBold();
paragraph.setFontSize(12);
middleCell.add(paragraph);
String programString = "Sample header";
paragraph = new Paragraph(programString);
paragraph.setTextAlignment(TextAlignment.CENTER);
paragraph.setBold();
paragraph.setFontSize(10);
middleCell.add(paragraph);
table.addCell(middleCell);
Cell rightCell = new Cell();
rightCell.setFont(font.get("NORMAL"));
rightCell.setPaddingTop(20);
rightCell.setWidth(UnitValue.createPercentValue(33.3f));
rightCell.setHorizontalAlignment(HorizontalAlignment.RIGHT);
rightCell.setBorder(Border.NO_BORDER);
rightCell.setBorderBottom(new SolidBorder(0.5f));
rightCell.setPaddingRight(20);
//Write text at position
Image img;
try {
img = new Image(ImageDataFactory.create(header));
img.setHorizontalAlignment(HorizontalAlignment.RIGHT);
Style style = new Style();
style.setWidth(91);
style.setHeight(25);
img.addStyle(style);
rightCell.add(img);
table.addCell(rightCell);
table.setMarginLeft(15);
table.setMarginRight(15);
canvas.add(table);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
class PageEndEvent implements IEventHandler {
protected PdfFormXObject placeholder;
protected float side = 20;
protected float x = 300;
protected float y = 10;
protected float space = 4.5f;
private String bar;
protected float descent = 3;
Map<String, PdfFont> font;
public PageEndEvent(String bar, Map<String, PdfFont> font) {
this.bar = bar;
this.font = font;
placeholder =new PdfFormXObject(new Rectangle(0, 0, side, side));
}
@Override
public void handleEvent(Event event) {
Table table = new Table(3);
table.setBorder(Border.NO_BORDER);
table.setWidth(UnitValue.createPercentValue(100));
Cell confCell = new Cell();
confCell.setFont(font.get("NORMAL"));
confCell.setPaddingTop(15);
confCell.setPaddingLeft(20);
confCell.setBorder(Border.NO_BORDER);
confCell.setBorderBottom(new SolidBorder(0.5f));
confCell.setWidth(UnitValue.createPercentValue(100));
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdf = docEvent.getDocument();
PdfPage page = docEvent.getPage();
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(
page.getLastContentStream(), page.getResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
Image img;
try {
img = new Image(ImageDataFactory.create(bar));
img.setHorizontalAlignment(HorizontalAlignment.LEFT);
Style style = new Style();
style.setWidth(UnitValue.createPercentValue(100));
style.setHeight(50);
img.addStyle(style);
Paragraph p = new Paragraph().add("Test: Confidential");
p.setFont(font.get("NORMAL"));
p.setFontSize(8);
p.setFontColor(com.itextpdf.kernel.colors.ColorConstants.GRAY);
canvas.showTextAligned(p, x, y, TextAlignment.CENTER);
pdfCanvas.addXObject(placeholder, x + space, y - descent);
pdfCanvas.release();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public void writeTotal(PdfDocument pdf) {
Canvas canvas = new Canvas(placeholder, pdf);
canvas.showTextAligned(String.valueOf(pdf.getNumberOfPages()),
0, descent, TextAlignment.LEFT);
}
}
}
导入java.io.File;
导入java.io.FileOutputStream;
导入java.net.MalformedURLException;
导入java.nio.file.path;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.UUID;
导入com.itextpdf.io.font.font程序;
导入com.itextpdf.io.font.FontProgramFactory;
导入com.itextpdf.io.font.PdfEncodings;
导入com.itextpdf.io.image.ImageDataFactory;
导入com.itextpdf.kernel.events.Event;
导入com.itextpdf.kernel.events.IEventHandler;
导入com.itextpdf.kernel.events.PdfDocumentEvent;
导入com.itextpdf.kernel.font.PdfFont;
导入com.itextpdf.kernel.font.PdfFontFactory;
导入com.itextpdf.kernel.geom.PageSize;
导入com.itextpdf.kernel.geom.Rectangle;
导入com.itextpdf.kernel.pdf.PdfDocument;
导入com.itextpdf.kernel.pdf.PdfPage;
导入com.itextpdf.kernel.pdf.PdfWriter;
导入com.itextpdf.kernel.pdf.canvas.PdfCanvas;
导入com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
导入com.itextpdf.layout.Canvas;
导入com.itextpdf.layout.Document;
导入com.itextpdf.layout.Style;
导入com.itextpdf.layout.borders.Border;
导入com.itextpdf.layout.borders.SolidBorder;
导入com.itextpdf.layout.element.Cell;
导入com.itextpdf.layout.element.Image;
导入com.itextpdf.layout.element.paragration;
导入com.itextpdf.layout.element.Table;
导入com.itextpdf.layout.element.Text;
导入com.itextpdf.layout.font.FontProvider;
导入com.itextpdf.layout.property.HorizontalAlignment;
导入com.itextpdf.layout.property.TextAlignment;
导入com.itextpdf.layout.property.UnitValue;
导入com.itextpdf.layout.property.VerticalAlignment;
公共类测试PDF{
公共静态void main(字符串[]args){
字符串uuid=uuid.randomUUID().toString();
试试{
@抑制警告(“资源”)
PdfWriter writer=new PdfWriter(新文件outputStream(新文件(path.get(“Output”).toabsolutionPath()+“/final.pdf”)))。setSmartMode(true);
PdfDocument pdfDoc=新的PdfDocument(writer);
setDefaultPageSize(PageSize.A4.rotate());
字符串字体[]={Paths.get(“字体”).toAbsolutePath()+“/TREBUC.TTF”,Paths.get(“字体”).toAbsolutePath()+“/TREBUCBD.TTF”,Paths.get(“字体”).toAbsolutePath()+“/TREBUCBI.TTF”,Paths.get(“字体”).toAbsolutePath()+“/TREBUCIT.TTF”};
FontProvider FontProvider=新FontProvider();
Map pdfFontMap=newhashmap();
用于(字符串字体:字体){
FontProgram FontProgram=FontProgramFactory.createFont(字体);
if(font.endsWith(“TREBUC.TTF”)){
pdfFontMap.put(“正常”,PdfFontFactory.createFont(fontProgram,PdfEncodings.WINANSI,true));
}else if(font.endsWith(“TREBUCBD.TTF”)){
pdfFontMap.put(“粗体”,PdfFontFactory.createFont(fontProgram,PdfEncodings.WINANSI,true));
}else if(font.endsWith(“TREBUCBI.TTF”)){
pdfFontMap.put(“粗体”,PdfFontFactory.createFont(fontProgram,PdfEncodings.WINANSI,true));
}else if(font.endsWith(“TREBUCIT.TTF”)){
pdfFontMap.put(“ITALIC”,PdfFontFactory.createFont(fontProgram,PdfEncodings.WINANSI,true));
}
addFont(fontProgram);
}
TestPdf TestPdf=新的TestPdf();
NormalPageHeader headerHandler=testPdf.new NormalPageHeader(path.get(“images”).toabsolutionPath()+“\\logo.png”,pdfFontMap);
pdfDoc.addEventHandler(PdfDocumentEvent.START_页面,标题处理程序);
PageEndEvent PageEndEvent=testPdf.new PageEndEvent(path.get(“images”).toabsolutionPath()+“\\FooterLineExternal.png”,pdfFontMap);
pdfDoc.addEventHandler(PdfDocumentEvent.END_第页,第EndEvent页);
单据单据=新单据(pdfDoc);
doc.getPageEffectiveArea(PageSize.A4.rotate());
表imageTable=新表(1);
imageTable.setBorder(边框,无边框);
设置宽度(UnitValue.createPercentValue(100));
单元格=新单元格();
段落=新段落(“标题”);
段落.设置垂直对齐(垂直对齐.顶部);
添加(第段);
单元格顺序(边框,无边框);
单元格。设置填充顶部(50);
imageTable.addCell(cell);
单据新增(影像表);
doc.close();
System.out.println(“成功转换为PDF>>转换为SVG_u“+uuid+”.PDF”);
}捕获(例外e){
e、 printStackTrace();
System.out.println(“转换为PDF=“+e.getMessage()”时出错);
}
}
类NormalPageHeader实现IEventHandler{
字符串头;
地图字体;
公共NormalPageHeader(字符串标题、地图字体){
this.header=头;
this.font=font;
}
@凌驾
公共无效handleEvent(事件){
//检索文档和
PdfDocumentEvent docEvent=(PdfDocumentEvent)事件;
PdfDocument pdf=docEvent.getDocument();
PdfPage page=docEvent.getPage();
矩形页