我下载了个作为示例的PDF文件:
代码
利用PDFBox
<dependency> <groupId>org.apache.pdfboxgroupId> <artifactId>pdfboxartifactId> <version>2.0.23version> dependency>
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class PDFWaterMark {
public static void main(String[] args) throws Exception {
usePDFBox();
}
private static void usePDFBox() throws Exception {
File sourcePDF = new File("20210331165837838.pdf");
File targetPDF = new File("20210331165837838-watermark.pdf");
PDDocument doc = PDDocument.load(sourcePDF);
doc.setAllSecurityToBeRemoved(true);
// 水印文字
String ts = "给PDF加水印";
for(PDPage page : doc.getPages()){
// 透明度
PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
graphicsState.setNonStrokingAlphaConstant(0.2f);
graphicsState.setAlphaSourceFlag(true);
PDPageContentStream cs = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);
cs.setGraphicsStateParameters(graphicsState);
cs.setNonStrokingColor(100,0,40, 0); // CMYK颜色
cs.beginText();
// 引入外部字体
cs.setFont(PDType0Font.load(doc, new File("C:\\Windows\\Fonts\\simhei.ttf")), 30);
// cs.setFont(PDType1Font.TIMES_ROMAN, 30);
// 旋转的角度,用弧度表示;水平移动300;纵向移动200
cs.setTextMatrix(Matrix.getRotateInstance(0.6,300f,200f));
cs.showText(ts);
cs.endText();
cs.close();
}
doc.save(targetPDF);
}
}
结果:
文件体积:
利用IText
<dependency> <groupId>com.itextpdfgroupId> <artifactId>itextpdfartifactId> <version>5.5.13.1version> dependency> <dependency> <groupId>com.itextpdfgroupId> <artifactId>itext-asianartifactId> <version>5.2.0version> dependency>
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class PDFWaterMark {
public static void main(String[] args) throws Exception {
useIText();
}
private static void useIText() throws Exception {
// 水印文字
String ts = "给PDF加水印";
FileInputStream sourcePDF = new FileInputStream("20210331165837838.pdf");
FileOutputStream targetPDF = new FileOutputStream("20210331165837838-watermark-itext.pdf");
PdfReader reader = new PdfReader(sourcePDF);
PdfStamper stamp = new PdfStamper(reader, targetPDF);
// 用自定义字体
BaseFont font = BaseFont.createFont("华康少女文字简W5.ttc,1", BaseFont.IDENTITY_H, true);
// 源PDF文件的总页数
int pageSize = reader.getNumberOfPages();
for (int i = 1; i ) {
// 水印在之前文本下
PdfContentByte under = stamp.getUnderContent(i);
under.beginText();
// 颜色 RGBA
under.setColorFill(new BaseColor(197f,0f,35f,50));
// 字体
under.setFontAndSize(font, 38);
// under.setTextMatrix(300, 200);
// 文字居中;水印文字;X坐标;Y坐标;旋转角度
under.showTextAligned(Element.ALIGN_CENTER, ts, 300, 200, 45);
under.endText();
}
stamp.close();
}
}
结果
文件体积:
IText比PDFBox要好,即使引入外部字体文件,最终生成的PDF体积没有明显变化
扩展,关于颜色
参考:https://www.colormatters.com/color-and-design/color-systems-rgb-and-cmyk
印刷颜色选择:https://htmlcolors.com/
CMYK配色表:http://www.wahart.com.hk/cmyk.htm
Original: https://www.cnblogs.com/LUA123/p/14633622.html
Author: 露娜妹
Title: Java给PDF上水印
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538110/
转载文章受原作者版权保护。转载请注明原作者出处!