1.
```java
public void setTextColor(PDDocument document, File file, String r, String g, String b) throws IOException {
PDPageTree seiten = document.getPages();
Code: Select all
    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);
}
```
- 
Code: Select all 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(); } }
Screenshot einer Datei, die ich nach der Ausführung der beiden oben genannten Funktionen erhalte:

Ich habe versucht, das PDF in Token zu analysieren und dann zuerst die rote Farbe vor dem BT-Block einzufügen und dann den ursprünglichen Stream zu bearbeiten, aber das hat die Schriftart kaputt gemacht.
Dann habe ich versucht, rote Farbe mit „rg“ nach nur „BT“ zu schreiben, und Dann habe ich jedes Objekt nach BT in meinen neuen Stream kopiert und dann versucht, den neuen Stream zur Seite hinzuzufügen.
Ich verwende Java und Apache PDFBox 3.0
 Mobile version
 Mobile version