Как изменить цвет текста в PDF-файле на месте, а не создавать новый файл (с помощью Apache PDFBox)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как изменить цвет текста в PDF-файле на месте, а не создавать новый файл (с помощью Apache PDFBox)

Сообщение Anonymous »

Я не могу редактировать или изменить цвет текста на красный в моем PDF-файле. Шрифт сломается. Я попробовал два метода, оба из которых не работают:
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();
    }
    }
    
в приведенном выше методе save() документ вызывается в основном (я думал, что это будет лучше для моего проекта)
Снимок экрана файла, который я получаю после выполнения двух вышеуказанных функций:
Изображение

Я попробовал разобрать PDF-файл на токены, а затем сначала вставить красный цвет перед блоком BT, а затем отредактировать исходный поток, но это сломало шрифт.
Затем я попытался написать красный цвет, используя «rg» после просто «BT», и затем я скопировал каждый объект после BT в свой новый поток, а затем попытался добавить новый поток на страницу.
Я использую Java и Apache PDFBox 3.0

Подробнее здесь: https://stackoverflow.com/questions/797 ... -a-new-fil
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»