我正嘗試創建一個將PDF文件轉換爲XML文件的原型。結果有點奇怪,所有的角色都變成了符號。我認爲這個bug是StringBuffer
從字節數組中獲取數據的地方。有人可以用Java知識來幫忙嗎?使用Java將PDF轉換爲XML
該原型軟件使用iText
API。要閱讀PDF文件,我們使用了PDFReader
類。數據首先轉換爲字節數組,然後使用Stringbuffer
,它將再次轉換爲字符串。然後我們使用StreamResult
作爲XML中轉換結果的持有者。
之後,Transformer
類處理來自各種源的XML並將轉換輸出寫入各種接收器。然後TransformerHandler
監聽SAX ContentHandler
,解析事件並將它們轉換爲結果。
方法startElement()
和endElement()
的TransformerHandler
類已經在xml文件中創建了標籤。解析器在每個元素的開始處調用startElement()
方法,並在XML文檔中的每個元素的末尾調用endElement()
。
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();
}
}
「結果有點奇怪,所有的字符都變成符號」看起來像編碼問題。在將字節數組轉換爲字符串時傳遞編碼。取決於用例,可以使用StringBuilder而不是StingBuffer。 – sudmong 2013-02-12 12:58:09
您也忽略了XObjects中存在的所有內容;你將如何捕獲這些XML?另外:你只是閱讀String對象,而沒有考慮文本的實際順序。爲什麼使用iText的過時版本? iText的當前版本具有更好的解析器。它甚至可以使用TaggedPdfReaderTool將標記PDF轉換爲XML文件:http://itextpdf.com/examples/iia.php?id=281(如果您的PDF已標記,顯然只會生成XML)。 – 2013-02-12 13:47:36