Вопрос по java – Как получить цвет шрифта с помощью pdfbox

7

Я пытаюсь извлечь текст со всей информацией из PDF, используя pdfbox. Я получил всю информацию, которую хочу, кроме цвета. Я пробовал разные способы получить цвет шрифта (в том числеПолучение цвета текста с помощью PDFBox). Но не работает. А теперь я скопировал код из класса PageDrawer в pdfBox. Но тогда также значение RGB не является правильным.

protected void processTextPosition(TextPosition text) {

        Composite com;
        Color col;
        switch(this.getGraphicsState().getTextState().getRenderingMode()) {
        case PDTextState.RENDERING_MODE_FILL_TEXT:
            com = this.getGraphicsState().getNonStrokeJavaComposite();
            int r =       this.getGraphicsState().getNonStrokingColor().getJavaColor().getRed();
            int g = this.getGraphicsState().getNonStrokingColor().getJavaColor().getGreen();
            int b = this.getGraphicsState().getNonStrokingColor().getJavaColor().getBlue();
            int rgb = this.getGraphicsState().getNonStrokingColor().getJavaColor().getRGB();
            float []cosp = this.getGraphicsState().getNonStrokingColor().getColorSpaceValue();
            PDColorSpace pd = this.getGraphicsState().getNonStrokingColor().getColorSpace();
            break;
        case PDTextState.RENDERING_MODE_STROKE_TEXT:
            System.out.println(this.getGraphicsState().getStrokeJavaComposite().toString());
            System.out.println(this.getGraphicsState().getStrokingColor().getJavaColor().getRGB());
           break;
        case PDTextState.RENDERING_MODE_NEITHER_FILL_NOR_STROKE_TEXT:
            //basic support for text rendering mode "invisible"
            Color nsc = this.getGraphicsState().getStrokingColor().getJavaColor();
            float[] components = {Color.black.getRed(),Color.black.getGreen(),Color.black.getBlue()};
            Color  c1 = new Color(nsc.getColorSpace(),components,0f);
            System.out.println(this.getGraphicsState().getStrokeJavaComposite().toString());
            break;
        default:
            System.out.println(this.getGraphicsState().getNonStrokeJavaComposite().toString());
            System.out.println(this.getGraphicsState().getNonStrokingColor().getJavaColor().getRGB());
    }

Я использую приведенный выше код. Получаемые значения r = 0, g = 0, b = 0, внутри косп объекта значение равно [0.0], внутри массива объектов pd = null и colorSpace = null. и значение RGB всегда равно -16777216. Пожалуйста, помогите мне. Заранее спасибо.

Я вижу, ты становишься черным, какого цвета ты ожидаешь? Aviram Segal

Ваш Ответ

4   ответа
5

которую вы разместили, и это сработало для меня. Я получаю цвета 148,92, 179,01001 и 214,965. Я хотел бы дать вам свой PDF для работы, может быть, если я сохраню его внешне для SO? В моем PDF-файле использовался неяркий синий цвет, и это похоже на совпадение. Это была всего лишь одна страница текста, созданная в Word 2010 и экспортированная, ничего особенного.

Пара предложений ....

Recall that the value returned is a float between 0 and 1. If a value is accidentally cast to int, then of course the values will end up containing nearly all 0. The linked to code multiples by 255 to get a range of 0 to 255. As the commenter said, the most common color for a PDF file is black which is 0 0 0

Это все, что я могу думать сейчас, в противном случае у меня есть версия 1.7.1 для pdfbox и fontbox, и, как я уже сказал, я в значительной степени перешел по ссылке, которую вы дали.

EDIT

Основываясь на моих комментариях, здесь, возможно, малоинвазивный способ сделать это для PDF-файлов, таких какcolor.pdf?

ВPDFStreamEngine.java вprocessOperator метод можно сделать внутри блока try

if (operation.equals("RG")) {
   // stroking color space
   System.out.println(operation);
   System.out.println(arguments);
} else if (operation.equals("rg")) {
   // non-stroking color space
   System.out.println(operation);
   System.out.println(arguments);
} else if (operation.equals("BT")) {
   System.out.println(operation);    
} else if (operation.equals("ET")) {
   System.out.println(operation);           
}

Это покажет вам информацию, а затем вы сможете обработать информацию о цвете для каждого раздела в соответствии с вашими потребностями. Вот фрагмент из начала вывода приведенного выше кода при запуске наcolor.pdf ...

BT rG [COSInt(1), COSInt(0), CosInt(0)] RG [COSInt(1), COSInt(0), CosInt(0)] ET BT ET BT rG [COSFloat{0.573}, COSFloat{0.816}, COSFloat{0.314}] RG [COSFloat{0.573}, COSFloat{0.816}, COSFloat{0.314}] ET ......

В приведенном выше выводе вы видите пустой раздел BT ET, этот раздел помечен DEVICEGRAY. Все остальные дают вам [0,1] значения для компонентов R, G и B

Error: User Rate Limit Exceeded Neeraj
Error: User Rate Limit Exceeded Neeraj
Error: User Rate Limit Exceeded Neeraj
Error: User Rate Limit Exceededstackoverflow.com/questions/5861471/… Neeraj
dropbox.com/s/vh2mf3oxl9f8bkx/color.pdfError: User Rate Limit Exceeded Neeraj
3


Я не знаю, работает это у вас или нет, пожалуйста, попробуйте. Также проверьте эту ссылкуhttp://pdfbox.apache.org/apidocs/org/apache/pdfbox/pdmodel/common/class-use/PDStream.html

Это может помочь вам

PDDocument doc = null;
try {
    doc = PDDocument.load("C:/Path/To/Pdf/Sample.pdf");
    PDFStreamEngine engine = new PDFStreamEngine(ResourceLoader.loadProperties("org/apache/pdfbox/resources/PageDrawer.properties"));
    PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(0);
    engine.processStream(page, page.findResources(), page.getContents().getStream());
    PDGraphicsState graphicState = engine.getGraphicsState();
    System.out.println(graphicState.getStrokingColor().getColorSpace().getName());
    float colorSpaceValues[] = graphicState.getStrokingColor().getColorSpaceValue();
    for (float c : colorSpaceValues) {
        System.out.println(c * 255);
    }
}
finally {
    if (doc != null) {
        doc.close();
    }
5

что делал что-то подобное. Вставьте код ниже, надеюсь, он кому-нибудь поможет.

import java.io.IOException;
import java.util.List;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState;
import org.apache.pdfbox.util.PDFTextStripper;
import org.apache.pdfbox.util.ResourceLoader;
import org.apache.pdfbox.util.TextPosition;

public class Parser extends PDFTextStripper {

public Parser() throws IOException {
    super(ResourceLoader.loadProperties(
            "org/apache/pdfbox/resources/PageDrawer.properties", true));
    super.setSortByPosition(true);
}

public void parse(String path) throws IOException{
    PDDocument doc = PDDocument.load(path);
    List<PDPage> pages = doc.getDocumentCatalog().getAllPages();
    for (PDPage page : pages) {
        this.processStream(page, page.getResources(), page.getContents().getStream());
    }
}

@Override
protected void processTextPosition(TextPosition text) {
    try {
        PDGraphicsState graphicsState = getGraphicsState();
        System.out.println("R = " + graphicsState.getNonStrokingColor().getJavaColor().getRed());
        System.out.println("G = " + graphicsState.getNonStrokingColor().getJavaColor().getGreen());
        System.out.println("B = " + graphicsState.getNonStrokingColor().getJavaColor().getBlue());
    }
    catch (IOException ioe) {}

}

public static void main(String[] args) throws IOException, COSVisitorException {
    Parser p = new Parser();
    p.parse("/Users/apple/Desktop/123.pdf");
}

}
1

торе перезаписанного PDFTextStripper:

addOperator(new SetStrokingColorSpace());
addOperator(new SetNonStrokingColorSpace());
addOperator(new SetStrokingDeviceCMYKColor());
addOperator(new SetNonStrokingDeviceCMYKColor());
addOperator(new SetNonStrokingDeviceRGBColor());
addOperator(new SetStrokingDeviceRGBColor());
addOperator(new SetNonStrokingDeviceGrayColor());
addOperator(new SetStrokingDeviceGrayColor());
addOperator(new SetStrokingColor());
addOperator(new SetStrokingColorN());
addOperator(new SetNonStrokingColor());
addOperator(new SetNonStrokingColorN());

Только тогда getGraphicsState () вернет правильную информацию.

Увидетьhttps://pdfbox.apache.org/2.0/migration.html

Похожие вопросы