如何使用IText7将源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

我正在使用iText7。我有两个PDF文件。源PDF有一些内容。目标PDF具有页眉和页脚。我有一个要求,将内容从源PDF添加到目的地PDF在页面中间,而不重叠的页眉和页脚的目的地PDF。有人能帮我查一下密码吗

下面是我的代码,所附文档是需要嵌入final.PDF中的源PDF的屏幕截图

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();
矩形页