42 votes

PDF savoir si le texte est souligné ou une cellule de tableau

J'ai été jouer avec PdfBox et PDFTextStripperByArea méthode.

J'ai été en mesure d'extraire de l'information si le texte est en gras ou en italique, mais je ne suis pas en mesure d'obtenir le soulignement de l'information.

Aussi loin que je le comprends en PDF, le soulignement est fait par le dessin des lignes. Donc, en théorie, je devrais être en mesure d'obtenir une sorte de d'informations sur les lignes, quelque part dans le texte. En donnant cette information, j'ai pu alors de savoir si le texte est souligné ou dans un tableau.

Voici mon code pour l'instant:

List<TextPosition> textPos = charactersByArticle.get(index);

for (TextPosition t : textPos)
{               
    if (t.getFont().getFontDescriptor() != null)
    {                           
        if (t.getFont().getFontDescriptor().getFontWeight() > BOLD_WEIGHT ||
            t.getFont().getFontDescriptor().isForceBold())
        {
            isBold = true;
        }

        if (t.getFont().getFontDescriptor().isItalic())
        {
            isItalic = true;
        }
    }
}

J'ai essayé de jouer autour de la PDGraphicsState objet qui est traitée dans les processEncodedText méthode dans PDFStreamEngine classe, mais aucune information de lignes s'y trouvent.

Toutes les suggestions où ces informations peuvent être récupérées à partir ?

5voto

Drejc Points 5424

Voici ce que j'ai trouvé jusqu'à présent:

PDFBox utilise un fichier de ressources lié PDF opérateurs/instructions pour certaines classes qui ensuite traiter les informations.

Si nous prenons un coup d'oeil à la PDFTextStripper.les propriétés de fichier de ressources en vertu de:

pdfbox\src\main\ressources\org\apache\pdfbox\ressources\

nous pouvons voir que, par exemple, la BT opérateur est lié à l' org.apache.pdfbox.util.de l'opérateur.BeginText classe et ainsi de suite.

Le PDFTextStripper en vertu de

pdfbox\src\main\java\org\apache\pdfbox\util\

prend cela en compte et utilise le traitement du PDF avec ce cours.

MAIS tous les objets graphiques sont ignorés, donc d'aucune information de souligner ou de la structure de la table!

Maintenant, si nous prenons un coup d'oeil à la PageDrawer.les propriétés de fichier de ressources, nous pouvons voir que celui-ci limite à presque tous les opérateurs disponibles. Qui est utilisé par PageDrawer classe en vertu de

pdfbox\src\main\java\org\apache\pdfbox\pdfviewer\

Le "truc" est maintenant à savoir qui graphique opérateurs sont ceux qui représentent le soulignement et les tables et de les utiliser en combinaison avec PDFTextStripper.

Maintenant, cela signifierait la lecture du fichier PDF cahier des charges, qui est actuellement de façon de beaucoup de travail.

Si quelqu'un sait où les opérateurs sont responsables pour lesquels des actions pour attirer l'souligne et de la table de lignes s'il vous plaît laissez-moi savoir.

2voto

Ravi Points 21

vous pouvez utiliser Itext pour générer des rapports pdf.

en utilisant itext, vous pouvez mettre les lignes de manière simple.

essayez ce qui suit.

document.add (new LineSeparator (0.5f, 50, null, 0, 198));

le code ci-dessus est utilisé pour générer des lignes dans un rapport pdf. et définir les dimensions en fonction de votre choix.

J'espère que ceci vous aidera.

2voto

user2118422 Points 21

Pour autant que j'ai compris la pdfbox, il n’existe aucune option permettant de lire le soulignement. Peut-être que vous pouvez essayer itextpdf à cette fin.

1voto

Thomas W Points 7179

Comme vous le mentionnez -- PDFBox utilise des fichiers de ressources, de se lier PDF opérateurs/ instructions pour les visiteurs qui permettra de traiter l'information.

Vous auriez probablement le meilleur démarrage par copie PDFBox existant du visiteur dans votre propre source-dossier, puis ajout/ étendre la mise en œuvre à partir de là.

Mon il y a longtemps PostScript expérience rappelle "moveto" et " lineto opérateurs. Depuis PDF est à peu près PS, vous serez à la recherche de quelque chose de similaire.

http://learnpostscript.wordpress.com/category/lineto/

Le format PDF est un b*tch -- c'est le HTML, le fait de mal. Il représente le graphique de la mise en œuvre, pas de la sémantique. Même la reconstruction de phrases est difficile-des mots ou même des caractères sont placés, l'espace ou saut de ligne " doit être algorithmiquement reconstruit. En résumé, Adobe, un*trous. Et le Lecteur est un non-ergonomique, bug criblé, d'insécurité, de ballonnement de porc.

Toutefois, vous pouvez effectuer votre condition -- si vous êtes prêt à mettre, disons, 12+ heures de travail. Ainsi que de la détection par position, souligne généralement être émis dans le PDF immédiatement après leur texte.. de sorte que vous pouvez verrouiller votre détection par document PDF-ordre, et pas seulement la page de la position.

Aussi, essayez de construire un trivial deux ligne de PDF avec le texte souligné. Puis voir ce que vous pouvez faire, l'analyse de la lire dans! Le soulignement doit tenir comme chien de bananes, et une fois que vous pouvez détecter que, vous serez bien sur le chemin.

PDFBox n'est pas très bon pour l'extensibilité, c'est essentiellement juste un gros tas d'algorithmes. Pour cette raison, il suffit de copier le PDFTextStripper source (et peut-être avoir PageDrawer pour référence) et d'un prototype à partir de là.

Espérons que cette aide!

-2voto

prium Points 122

Selon l'api, getfont () renvoie La taille de la police.

Vous pouvez utiliser la méthode getStyle () et elle renverra STYLE_UNDERLINE pour la police soulignée. Ainsi, vous pouvez récupérer le style souligné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X