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

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

Сообщение Anonymous »

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

}
Метод 2:

Код: Выделить всё

    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 document вызывается в основном тексте (я думал, что это будет лучше для моего проекта)
Я попробовал разобрать 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»