12、使用 pdfbox 操作pdf文件(工具类)
package com.lingxu.base.common.util;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.contentstream.operator.Operator;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.pdfparser.PDFStreamParser;
import org.apache.pdfbox.pdfwriter.ContentStreamWriter;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class WordTransitionPdf {
public static void replaceText(PDPage page, String searchString, String replacement) throws IOException {
PDFStreamParser parser = new PDFStreamParser(page);
List<?> tokens = parser.parse();
for (int j = 0; j < tokens.size(); j++) {
Object next = tokens.get(j);
if (next instanceof Operator) {
Operator op = (Operator) next;
String pstring = "";
int prej = 0;
if (op.getName().equals("Tj")) {
COSString previous = (COSString) tokens.get(j - 1);
String string = previous.getString();
string = string.replaceFirst(searchString, replacement);
previous.setValue(string.getBytes());
} else if (op.getName().equals("TJ")) {
COSArray previous = (COSArray) tokens.get(j - 1);
for (int k = 0; k < previous.size(); k++) {
Object arrElement = previous.getObject(k);
if (arrElement instanceof COSString) {
COSString cosString = (COSString) arrElement;
String string = cosString.getString();
if (j == prej) {
pstring += string;
} else {
prej = j;
pstring = string;
}
}
}
if (searchString.equals(pstring.trim())) {
COSString cosString2 = (COSString) previous.getObject(0);
cosString2.setValue(replacement.getBytes());
int total = previous.size() - 1;
for (int k = total; k > 0; k--) {
previous.remove(k);
}
}
}
}
}
List<PDStream> contents = new ArrayList<>();
Iterator<PDStream> streams = page.getContentStreams();
while (streams.hasNext()) {
PDStream updatedStream = streams.next();
OutputStream out = updatedStream.createOutputStream(COSName.FLATE_DECODE);
ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
tokenWriter.writeTokens(tokens);
contents.add(updatedStream);
out.close();
}
page.setContents(contents);
}
public static void removeImage(PDPage page, String cosName) {
PDResources resources = page.getResources();
COSDictionary dict1 = resources.getCOSObject();
resources.getXObjectNames().forEach(e -> {
if (resources.isImageXObject(e)) {
COSDictionary dict2 = dict1.getCOSDictionary(COSName.XOBJECT);
if (e.getName().equals(cosName)) {
dict2.removeItem(e);
}
}
page.setResources(new PDResources(dict1));
});
}
public static boolean removeWatermark(File file) {
try {
PDDocument document = Loader.loadPDF(file);
PDPageTree pages = document.getPages();
Iterator<PDPage> iter = pages.iterator();
while (iter.hasNext()) {
PDPage page = iter.next();
replaceText(page, "Evaluation Only. Created with Aspose.Words. Copyright 2003-2021 Aspose Pty Ltd.", "");
replaceText(page, "Created with an evaluation copy of Aspose.Words. To discover the full versions of our APIs", "");
replaceText(page, "please visit: https://products.aspose.com/words/", "");
replaceText(page, "This document was truncated here because it was created in the Evaluation Mode.", "");
removeImage(page, "X1");
}
file.delete();
document.save(file);
document.close();
return true;
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
}
public static String doc2pdf(String wordPath) {
long old = System.currentTimeMillis();
String pdfPath = null;
try {
pdfPath = wordPath.substring(0, wordPath.lastIndexOf(".")) + ".pdf";
File file = new File(pdfPath);
FileOutputStream os = new FileOutputStream(file);
Document doc = new Document(wordPath);
doc.save(os, SaveFormat.PDF);
os.close();
removeWatermark(new File(pdfPath));
long now = System.currentTimeMillis();
System.out.println("Word 转 Pdf 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
System.out.println("Word 转 Pdf 失败...");
e.printStackTrace();
}
return pdfPath;
}
public static void watermarkPDF(File fileStored) throws Exception {
File tmpPDF;
PDDocument doc;
tmpPDF = new File(fileStored.getParent() + System.getProperty("file.separator") + "Tmp_" + fileStored.getName());
doc = Loader.loadPDF(fileStored);
doc.setAllSecurityToBeRemoved(true);
for (PDPage page : doc.getPages()) {
PDPageContentStream cs = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);
String ts = "0000";
PDFont font = PDType1Font.HELVETICA_OBLIQUE;
float fontSize = 30.0f;
PDResources resources = page.getResources();
PDExtendedGraphicsState r0 = new PDExtendedGraphicsState();
r0.setNonStrokingAlphaConstant(0.2f);
r0.setAlphaSourceFlag(true);
cs.setGraphicsStateParameters(r0);
cs.beginText();
cs.setFont(font, fontSize);
float h = ts.length() * fontSize;
for (int i = 0; i <= 10; i++) {
cs.setTextMatrix(Matrix.getRotateInstance(-150, i * 100, 0));
cs.showText(ts);
for (int j = 0; j < 20; j++) {
cs.setTextMatrix(Matrix.getRotateInstance(-150, i * 100, j * h));
cs.showText(ts);
}
}
cs.endText();
cs.restoreGraphicsState();
cs.close();
}
doc.save(tmpPDF);
}
public static void watermarkPDF(File fileStored, String textContent) throws Exception {
File tmpPDF;
PDDocument doc;
tmpPDF = new File(fileStored.getParent() + System.getProperty("file.separator") + "SQ_" + fileStored.getName());
doc = Loader.loadPDF(fileStored);
doc.setAllSecurityToBeRemoved(true);
for (PDPage page : doc.getPages()) {
PDPageContentStream cs = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);
String ts = textContent;
PDFont font = PDType1Font.HELVETICA_OBLIQUE;
float fontSize = 13;
PDResources resources = page.getResources();
PDExtendedGraphicsState r0 = new PDExtendedGraphicsState();
r0.setNonStrokingAlphaConstant(0.1f);
r0.setAlphaSourceFlag(true);
cs.setGraphicsStateParameters(r0);
cs.beginText();
cs.setFont(font, fontSize);
float pageHeight = page.getMediaBox().getHeight();
float pageWidth = page.getMediaBox().getWidth();
for (int h = 10; h < pageHeight; h = h + 150) {
for (int w = -10; w < pageWidth; w = w + 150) {
cs.setTextMatrix(Matrix.getRotateInstance(0.3, w, h));
cs.showText(ts);
}
}
cs.endText();
cs.restoreGraphicsState();
cs.close();
}
doc.save(tmpPDF);
}
}