So ändern Sie die Textfarbe in einem PDF direkt, anstatt eine neue Datei zu erstellen (mithilfe von Apache PDFBox)Java

Java-Forum
Anonymous
 So ändern Sie die Textfarbe in einem PDF direkt, anstatt eine neue Datei zu erstellen (mithilfe von Apache PDFBox)

Post by Anonymous »

Ich kann die Textfarbe in meiner PDF-Datei nicht bearbeiten oder in Rot ändern. Die Schriftart wird beschädigt. Ich habe zwei Methoden ausprobiert, die beide nicht funktionieren:
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();
    }
    }
    
in der obigen Methode wird das Dokument save() in main aufgerufen (ich dachte, das wäre besser für mein Projekt)
Screenshot einer Datei, die ich nach der Ausführung der beiden oben genannten Funktionen erhalte:
Image

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post