C# 将数据更改为xml
我的任务是为客户完成一个演示,因为我们的主要开发人员目前不可用。我所有的编程经验都是,5年前我曾与C#发生过短暂的冲突,但此后就再也没有使用过它 如果有意义的话,我需要帮助将导出的数据转换为XML。目前,我们有一个构建,它采用PDF格式提取所需的数据,并通过命令提示符显示这些数据。我需要能够将这些数据转换成XML,以便可以查询到数据库。该程序的思想是从PDF中获取所需的数据,将其转换为XML,并查询到存储数据的数据库中。我们将C语言与iTextsharp库结合使用。我会发布代码,但不允许发布C# 将数据更改为xml,c#,xml,xml-serialization,pdf-generation,C#,Xml,Xml Serialization,Pdf Generation,我的任务是为客户完成一个演示,因为我们的主要开发人员目前不可用。我所有的编程经验都是,5年前我曾与C#发生过短暂的冲突,但此后就再也没有使用过它 如果有意义的话,我需要帮助将导出的数据转换为XML。目前,我们有一个构建,它采用PDF格式提取所需的数据,并通过命令提示符显示这些数据。我需要能够将这些数据转换成XML,以便可以查询到数据库。该程序的思想是从PDF中获取所需的数据,将其转换为XML,并查询到存储数据的数据库中。我们将C语言与iTextsharp库结合使用。我会发布代码,但不允许发布 所
所以我在问有人能帮我吗?也许可以给我举一个例子,说明如何做到这一点,或者尽可能简单地解释我将如何做到这一点?我通常不会向别人寻求帮助,但因为我已经多年没有编写代码了,这让我感到害怕。这可能对你有用。。。取自
使用iTextSharp.text.pdf;
使用iTextSharp.text;
私有void openPDF()
{
字符串str=“”;
string newFile=“c:\\New Document.pdf”;
单据单据=新单据();
PdfReader reader=新的PdfReader(“c:\\new Document.pdf”);
对于(int i=1;i),一个选项是创建模拟数据的类(即字段/属性),为PDF数据中的每个“实体”创建对象,并将对象序列化为XML。StackOverflow和MSDN上的XML序列化有大量示例。主要思想是创建缓冲区(类对象)你可以在那里组织你从PDF接收的数据。如果你的客户想要的最终产品是数据库中的数据,为什么你要先将其放入XML?我真的无法告诉你为什么,因为这是一个更大的图景的一部分,这样做可以让我们将代码用于其他更重要的事情。数据总是表格化吗?Just a p.s.我会确保pdf解析符合要求,例如,解析pdf时,粗体文本有时会出现两次。最后一点……您应该说您打算在哪个数据库中存储XML,是希望存储XML文件本身还是仅存储数据?
using iTextSharp.text.pdf;
using iTextSharp.text;
private void openPDF()
{
string str = "";
string newFile = "c:\\New Document.pdf";
Document doc = new Document();
PdfReader reader = new PdfReader("c:\\New Document.pdf");
for (int i = 1; i <= reader.NumberOfPages; i++)
{
byte[] bt = reader.GetPageContent(i);
str += ExtractTextFromPDFBytes(bt);
}
}
private string ExtractTextFromPDFBytes(byte[] input)
{
if (input == null || input.Length == 0) return "";
try
{
string resultString = "";
// Flag showing if we are we currently inside a text object
bool inTextObject = false;
// Flag showing if the next character is literal
// e.g. '\\' to get a '\' character or '\(' to get '('
bool nextLiteral = false;
// () Bracket nesting level. Text appears inside ()
int bracketDepth = 0;
// Keep previous chars to get extract numbers etc.:
char[] previousCharacters = new char[_numberOfCharsToKeep];
for (int j = 0; j < _numberOfCharsToKeep; j++) previousCharacters[j] = ' ';
for (int i = 0; i < input.Length; i++)
{
char c = (char)input[i];
if (inTextObject)
{
// Position the text
if (bracketDepth == 0)
{
if (CheckToken(new string[] { "TD", "Td" }, previousCharacters))
{
resultString += "\n\r";
}
else
{
if (CheckToken(new string[] { "'", "T*", "\"" }, previousCharacters)) {
resultString += "\n";
}
else
{
if (CheckToken(new string[] { "Tj" }, previousCharacters))
{
resultString += " ";
}
}
}
}
// End of a text object, also go to a new line.
if (bracketDepth == 0 && CheckToken(new string[] { "ET" }, previousCharacters))
{
inTextObject = false;
resultString += " ";
}
else
{
// Start outputting text
if ((c == '(') && (bracketDepth == 0) && (!nextLiteral))
{
bracketDepth = 1;
}
else
{
// Stop outputting text
if ((c == ')') && (bracketDepth == 1) && (!nextLiteral))
{
bracketDepth = 0;
}
else
{
// Just a normal text character:
if (bracketDepth == 1)
{
// Only print out next character no matter what.
// Do not interpret.
if (c == '\\' && !nextLiteral)
{
nextLiteral = true;
}
else
{
if (((c >= ' ') && (c <= '~')) || ((c >= 128) && (c < 255)))
{
resultString += c.ToString();
}
nextLiteral = false;
}
}
}
}
}
}
// Store the recent characters for
// when we have to go back for a checking
for (int j = 0; j < _numberOfCharsToKeep - 1; j++)
{
previousCharacters[j] = previousCharacters[j + 1];
}
previousCharacters[_numberOfCharsToKeep - 1] = c;
// Start of a text object
if (!inTextObject && CheckToken(new string[] { "BT" }, previousCharacters))
{
inTextObject = true;
}
}
return resultString;
}
catch
{
return string.Empty;
}
}
private bool CheckToken(string[] tokens, char[] recent)
{
foreach (string token in tokens)
{
if ((recent[_numberOfCharsToKeep - 3] == token[0]) &&
(recent[_numberOfCharsToKeep - 2] == token[1]) &&
((recent[_numberOfCharsToKeep - 1] == ' ') ||
(recent[_numberOfCharsToKeep - 1] == 0x0d) ||
(recent[_numberOfCharsToKeep - 1] == 0x0a)) &&
((recent[_numberOfCharsToKeep - 4] == ' ') ||
(recent[_numberOfCharsToKeep - 4] == 0x0d) ||
(recent[_numberOfCharsToKeep - 4] == 0x0a)))
{
return true;
}
}
return false;
}