Метод 1:
Код: Выделить всё
public void setTextColor(PDDocument document, File file, String r, String g, String b) throws IOException {
PDPageTree pages = document.getPages();
for (PDPage page : pages) {
Iterator
streams = page.getContentStreams();
List newStreams = new ArrayList();
while(streams.hasNext()) {
PDStream stream = streams.next();
PDFStreamParser parser = new PDFStreamParser(page);
List streamObjects = parser.parse();
List newTokens = new ArrayList();
for(Object object : streamObjects) {
if (object instanceof Operator) {
Operator o = (Operator)object;
if ("BT".equals(o.getName())) {
float R = Float.parseFloat(r + "f");
float G = Float.parseFloat(g + "f");
float B = Float.parseFloat(b + "f");
newTokens.add(new COSFloat(R));
newTokens.add(new COSFloat(G));
newTokens.add(new COSFloat(B));
newTokens.add(Operator.getOperator("rg"));
System.out.println("found ");
}
}
newTokens.add(object);
}
// PDStream newStream = new PDStream(document);
// try (OutputStream out = newStream.createOutputStream(COSName.FLATE_DECODE)) {
// ContentStreamWriter writer = new ContentStreamWriter(out);
// writer.writeTokens(newTokens);
// }
// newStreams.add(newStream);
try (OutputStream out = stream.createOutputStream(COSName.FLATE_DECODE)) {
ContentStreamWriter writer = new ContentStreamWriter(out);
writer.writeTokens(newTokens);
}
newStreams.add(stream);
}
page.setContents(newStreams);
}
// String outputFile = new File("output_" + System.nanoTime() + ".pdf").getAbsolutePath();
document.save(file);
// System.out.println("Saved to: " + outputFile);
}
Код: Выделить всё
public void applyTextColor(PDDocument document, File file, String r, String b, String g) throws IOException {
PDPageTree pages = document.getPages();
for (PDPage page : pages) {
Iterator
streams = page.getContentStreams();
//PDStream stream = streams.next();
PDFStreamParser parser = new PDFStreamParser(page);
List streamObjects = parser.parse();
List newStreamObjects = new ArrayList();
boolean inTextBlock = false;
for (int i = 0; i < streamObjects.size(); i++) {
Object newObject = streamObjects.get(i);
if (newObject instanceof Operator) {
Operator op = (Operator)newObject;
if ("BT".equals(op.getName())) {
inTextBlock = true;
newStreamObjects.add(newObject);
float R = Float.parseFloat(r + "f");
float G = Float.parseFloat(g + "f");
float B = Float.parseFloat(b + "f");
newStreamObjects.add(new COSFloat(R));
newStreamObjects.add(new COSFloat(G));
newStreamObjects.add(new COSFloat(B));
newStreamObjects.add(Operator.getOperator("rg"));
continue;
}else if ("ET".equals(op.getName())) {
inTextBlock = false;
}
}
newStreamObjects.add(newObject);
}
PDStream newStream = new PDStream(document);
try (OutputStream out = newStream.createOutputStream(COSName.FLATE_DECODE)) {
ContentStreamWriter writer = new ContentStreamWriter(out);
writer.writeTokens(newStreamObjects);
}
page.setContents(newStream);
parser.close();
}
}
Я попробовал разобрать PDF-файл на токены, а затем сначала вставить красный цвет перед блоком BT, а затем отредактировать исходный поток, но это сломало шрифт
затем я попытался написать красный цвет, используя «rg» после просто «BT», а затем я скопировал каждый объект после BT в свой новый поток, а затем попытался добавить новый поток на страницу.
Я использую Java и Apache PDFBox 3.0
Подробнее здесь: https://stackoverflow.com/questions/797 ... -a-new-fil
Мобильная версия