Нужно заменить текст в pdf на другой язык.На первом этапе я пытался найти и заменить текст в файле pdf с помощью itextpdf ad pdfbox API.
Используйте приведенный ниже фрагмент кода, который использует itextpdf api, для поиска и замены текста «Hello» на «Hi» из исходного файла PDF.Новый PDF создается без каких-либо текстовых замен.
public void manipulatePdf(String src, String dest) throws Exception {
PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(DEST));
int noOfPages = pdfDoc.getNumberOfPages();
for (int i = 1; i < noOfPages; i++) {
PdfPage page = pdfDoc.getPage(i);
PdfDictionary dict = page.getPdfObject();
PdfObject object = dict.get(PdfName.Contents);
if (object instanceof PdfStream) {
PdfStream stream = (PdfStream) object;
byte[] data = stream.getBytes();
stream.setData(new String(data).replace("Hello", "Hi").getBytes("UTF-8"));
}
}
pdfDoc.close();
}
Также используется apache pdfbox для достижения того же, но в этом не повезло.Ниже приведен фрагмент кода для справки.
public static PDDocument replaceText(PDDocument document, String searchString, String replacement)
throws IOException {
for (PDPage page : document.getPages()) {
PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List tokens = parser.getTokens();
for (int j = 0; j < tokens.size(); j++) {
Object next = tokens.get(j);
if (next instanceof Operator) {
Operator op = (Operator) next;
// Tj and TJ are the two operators that display strings in a PDF
if (op.getName().equals("Tj")) {
// Tj takes one operator and that is the string to display
// so lets update that operator
COSString previous = (COSString) tokens.get(j - 1);
String string = previous.getString();
//System.out.println(new String(string.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8));
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();
//System.out.println("22::"+new String(string.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8));
string = StringUtils.replaceOnce(string, searchString, replacement);
cosString.setValue(string.getBytes());
}
}
}
}
}
PDStream updatedStream = new PDStream(document);
OutputStream out = updatedStream.createOutputStream(COSName.FLATE_DECODE);
ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
tokenWriter.writeTokens(tokens);
// save content
page.setContents(updatedStream);
out.close();
}
Любое решение / предложение высоко ценится.