J'essaie de créer un prototype pour convertir un fichier PDF en fichier XML. Le résultat est un peu étrange, tous les personnages deviennent des symboles. Je pense que le bug est où le StringBuffer
prend les données du tableau d'octets. Quelqu'un avec des connaissances Java peut-il aider s'il vous plaît?Utilisation de Java pour convertir le PDF en XML
Ce logiciel prototype utilise l'API iText
. Pour lire le fichier PDF, nous avons utilisé la classe PDFReader
. Les données sont d'abord converties en un tableau d'octets, puis avec l'utilisation de Stringbuffer
, elles seront à nouveau converties en chaîne. Ensuite, nous avons utilisé StreamResult
qui sert de support pour le résultat transformé en XML. Par la suite, la classe Transformer
traite le code XML à partir de diverses sources et écrit la sortie de la transformation dans divers récepteurs. Ensuite, TransformerHandler
écoute SAX ContentHandler
, analyse les événements et les transforme en résultat. Les méthodes startElement()
et endElement()
de TransformerHandler
ont créé les balises dans le fichier xml. L'analyseur a appelé la méthode startElement()
au début de chaque élément et endElement()
à la fin de chaque élément du document XML.
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.sax.*;
import javax.xml.transform.stream.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class Cp2x {
static StreamResult streamResult;
static TransformerHandler handler;
static AttributesImpl atts;
public static void main(String[] args) throws IOException {
try {
Document document = new Document();
document.open();
PdfReader reader = new PdfReader("C:\\helloworld.pdf");
PdfDictionary page = reader.getPageN(1);
PRIndirectReference objectReference = (PRIndirectReference) page
.get(PdfName.CONTENTS);
PRStream stream = (PRStream) PdfReader
.getPdfObject(objectReference);
byte[] streamBytes = PdfReader.getStreamBytes(stream);
PRTokeniser tokeniser = new PRTokeniser(streamBytes);
StringBuffer string_buffer = new StringBuffer();
while (tokeniser.nextToken()) {
if (tokeniser.getTokenType() == PRTokeniser.TK_STRING) {
string_buffer.append(tokeniser.getStringValue());
}
}
String test = string_buffer.toString();
streamResult = new StreamResult("test.xml");
initXML();
process(test);
closeXML();
document.add(new Paragraph(".."));
document.close();
} catch (Exception e) {
}
}
public static void initXML() throws ParserConfigurationException,
TransformerConfigurationException, SAXException {
SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory
.newInstance();
handler = tf.newTransformerHandler();
Transformer serializer = handler.getTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
serializer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount", "4");
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
handler.setResult(streamResult);
handler.startDocument();
atts = new AttributesImpl();
handler.startElement("", "", "Document", atts);
}
public static void process(String s) throws SAXException {
String[] elements = s.split("\\|");
atts.clear();
handler.startElement("", "", "Note", atts);
handler.characters(elements[0].toCharArray(), 0, elements[0].length());
handler.endElement("", "", "Note");
}
public static void closeXML() throws SAXException {
handler.endElement("", "", "Document");
handler.endDocument();
}
}
« Le résultat est un peu étrange, tous les personnages deviennent des symboles » semble comme l'encodage question. passez l'encodage lors de la conversion d'un tableau d'octets en String. peut utiliser StringBuilder au lieu de StingBuffer selon le cas d'utilisation. – sudmong
Vous ignorez également tout le contenu présent dans XObjects; comment allez-vous les capturer en XML? Aussi: vous ne lisez que des objets String, et vous ne tenez pas compte de l'ordre réel du texte. Pourquoi utilisez-vous une version obsolète d'iText? La version actuelle de iText a un bien meilleur analyseur. Il peut même convertir un PDF balisé en un fichier XML à l'aide de TaggedPdfReaderTool: http://itextpdf.com/examples/iia.php?id=281 (ce qui, évidemment, ne produira du XML que si votre PDF a été balisé). –