1.
```java
public void setTextColor(PDDocument document, File file, String r, String g, String b) выдает IOException {
PDPageTreepages = 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
Мобильная версия