2017-07-18 6 views
0

J'utilise iText pour recréer la fonction Tag Tree d'Acrobat.Obtenir un contenu marqué à l'aide du contenu MCID

Jusqu'à présent, j'ai réussi à obtenir la structure de l'étiquette.

La dernière chose que j'essaie de comprendre est comment obtenir & décoder le "contenu marqué" pour une balise du flux de contenu.

enter image description here

Modifier: but ajouté

Le but de cette question est de savoir comment accéder aux flux de contenu, avec un mcid et décoder le contenu.

Edit 2: Ajouter une référence iText RUPS

Ci-dessous l'image montre où je suis arrivé dans l'arbre, les points de ligne rouge à un MCID, je suis en train d'obtenir son contenu.

enter image description here

Edit 3: ajouter du code actuel qui construit un arbre

private void manipulate(PdfDictionary element, ItemCollection items) 
    { 
     if (element == null) 
     { 
      return; 
     } 

     ICollection<PdfName> val = element.KeySet(); 
     PdfObject tagName = element.Get(PdfName.S); 
     PdfObject elementType = element.Get(PdfName.Type); 

     string tn = ""; 

     if (tagName != null) 
     { 
      tn = ((PdfName)tagName).GetValue(); 
     } 
     else 
     { 
      tn = ((PdfName)elementType).GetValue(); 
     } 

     TreeViewItem tvI = new TreeViewItem() { Header = tn, IsExpanded = true }; 
     items.Add(tvI); 

     PdfArray kids = element.GetAsArray(PdfName.K); 
     if (kids == null) 
     { 
      return; 
     } 
     for (int i = 0; i < kids.Size(); i++) 
     { 
      PdfDictionary child = kids.GetAsDictionary(i); //Code change required here to detect MCID & get content, this line returns null when child is a MCID 
      manipulate(child, tvI.Items); 
     } 
    } 
} 

Edit 4: La raison pour cela est de recréer le "Tag Tree" fonction d'Acrobat.

Répondre

2

D'après les étiquettes que vous avez ajoutées à la question, je vois que vous ajoutez iText 7. iText 7 a une classe nommée TaggedPdfReaderTool. Cette classe peut être utilisé pour convertir des fichiers PDF Tagged XML:

FileOutputStream outXml = new FileOutputStream("pdf_content.xml"); 
TaggedPdfReaderTool tool = new TaggedPdfReaderTool(document); 
tool.setRootTag("root"); 
tool.convertToXml(outXml); 
outXml.close(); 

Le XML aura la même structure sont la « structure de tag » vous étiez déjà en mesure d'extraire. Le contenu des balises XML correspond au contenu marqué comme "partie d'une balise" dans le flux de contenu PDF.

Message important aux autres lecteurs: La capture d'écran dans la question montre clairement que le PDF est balisé. Si vous essayez cet extrait de code sur un fichier PDF non étiqueté, vous ne pourrez pas convertir le contenu en PDF.

Mise à jour: approche de niveau inférieur

Vous pouvez également examiner toutes les parties de l'arbre de la structure comme ceci: process(document.getStructTreeRoot());

Lorsque la méthode process() ressemble à ceci:

public static void process(IPdfStructElem elem) { 
    if (elem == null) return; 
    System.out.println(elem.getRole()); 
    System.out.println(elem.getClass().getName()); 
    if (elem instanceof PdfStructElem) { 
     processStructElem((PdfStructElem) elem); 
    } 
    if (elem.getKids() == null) return; 
    for (IPdfStructElem structElem : elem.getKids()) { 
     process(structElem); 
    } 
} 

public static void processStructElem(PdfStructElem elem) { 
    PdfDictionary page = elem.getPdfObject().getAsDictionary(PdfName.Pg); 
    if (page == null) return; 
    PdfStream contents = page.getAsStream(PdfName.Contents); 
    if (contents != null) { 
     System.out.println(new String(contents.getBytes())); 
    } 
    PdfArray array = page.getAsArray(PdfName.Contents); 
    System.out.println(array); 
} 

Remarque que le /Contents d'une page peut faire référence à un seul flux ou à un tableau de flux. Dans cet extrait court, j'ai ignoré tous les /Contents stockés dans un tableau de flux.

Voici un exemple du contenu qui a été révélé lors d'une exécution sur un fichier PDF étiquetée que nous utilisons pour les tests:

EMC 
/Artifact BMC 
q 
0.01961 0.33333 0.52941 rg 
36 432.34 184.23 27.98 re 
f 
Q 
EMC 
/Span <</MCID 13>> BDC 
q 
BT 
/F2 12 Tf 
42 442.65 Td 
1 1 1 rg 
(The Library)Tj 
ET 
Q 
EMC 
/Artifact BMC 
q 
0.01961 0.33333 0.52941 rg 
36 399.11 184.23 27.98 re 
f 
Q 
EMC 
/Span <</MCID 14>> BDC 
q 
BT 
/F2 12 Tf 
42 409.42 Td 
1 1 1 rg 
(The Company)Tj 
ET 
Q 
EMC 
/Span <</MCID 15>> BDC 
q 
BT 
/F1 20 Tf 
227.73 472.71 Td 
(The Library)Tj 
ET 
Q 
EMC 
/Span <</MCID 16>> BDC 
q 
BT 
/F2 12 Tf 
229.23 440.45 Td 
(iText is a software developer toolkit that allows users to integrate PDF)Tj 
()Tj 
ET 
Q 
EMC 
/Span <</MCID 17>> BDC 
q 
BT 
/F2 12 Tf 
229.23 424.46 Td 
(functionalities within their applications, processes or products.)Tj 
ET 
Q 
EMC 
/Artifact BMC 
q 
0.01961 0.33333 0.52941 rg 
605.03 262.75 191.73 235.31 re 
f 
Q 
EMC 
/Span <</MCID 18>> BDC 
q 
BT 
/F1 16 Tf 
676.45 482.5 Td 
0.97647 0.76078 0.15294 rg 
(What?)Tj 
ET 
Q 
EMC 
/Span <</MCID 19>> BDC 
q 
BT 
/F2 12 Tf 
607.94 453.08 Td 
1 1 1 rg 
(iText is a software developer toolkit)Tj 
()Tj 
ET 
Q 
EMC 
/Span <</MCID 20>> BDC 
q 
BT 
/F2 12 Tf 
611.61 437.09 Td 
1 1 1 rg 
(that allows users to integrate PDF)Tj 
()Tj 
ET 
Q 
EMC 
/Span <</MCID 21>> BDC 
q 
BT 
/F2 12 Tf 
634.95 421.11 Td 
1 1 1 rg 
(functionalities within their)Tj 
()Tj 
ET 
Q 
EMC 
/Span <</MCID 22>> BDC 
q 
BT 
/F2 12 Tf 
669.96 405.12 Td 
1 1 1 rg 
(applications)Tj 
ET 
Q 
EMC 
/Span <</MCID 23>> BDC 
q 
BT 
/F1 16 Tf 
679.12 381.5 Td 
0.97647 0.76078 0.15294 rg 
(How?)Tj 
ET 
Q 
EMC 
/Span <</MCID 24>> BDC 
q 
BT 
/F2 12 Tf 
613.94 352.08 Td 
1 1 1 rg 
(By providing you with the tools to)Tj 
()Tj 
ET 
Q 
EMC 
/Span <</MCID 25>> BDC 
q 
BT 
/F2 12 Tf 
607.59 336.09 Td 
1 1 1 rg 
(create and manipulate a pdf in your)Tj 
()Tj 
ET 
Q 
EMC 
/Span <</MCID 26>> BDC 
q 
BT 
/F2 12 Tf 
668.96 320.11 Td 
1 1 1 rg 
(source code)Tj 
ET 
Q 
EMC 
/Span <</MCID 27>> BDC 
q 
BT 
/F1 16 Tf 
672.44 296.49 Td 
0.97647 0.76078 0.15294 rg 
(Really?)Tj 
ET 
Q 
EMC 
/Span <</MCID 28>> BDC 
q 
BT 
/F2 12 Tf 
673.64 267.06 Td 
1 1 1 rg 
(Yes really!)Tj 
ET 
Q 
EMC 

Tout ce qui est pas entre BMC/EDC ou BDC/EDC opérateurs ne sont pas marqués. Vous recherchez le contenu marqué avec un MCID. Dans un commentaire, j'explique qu'il est préférable d'utiliser une approche différente. Il est préférable d'analyser les flux de contenu de chaque page (une seule fois) et de mapper tous les objets que vous rencontrez avec les éléments dans l'arborescence de la structure. Avec votre approche, vous devez analyser le flux de contenu d'une page encore et encore pour chaque élément de la structure. Cela nécessite beaucoup plus de traitement.

+0

Merci pour votre suggestion. Mais j'aimerais quand même savoir comment accéder aux flux de contenu et décoder leur contenu. – PrivatMamtora

+0

Avez-vous déjà entendu parler de iText RUPS? –

+0

Oui, je l'ai utilisé comme un outil de débogage. Voir éditer. – PrivatMamtora