我是新手在android中渲染文件,我想在我的应用程序中渲染或显示docx文件.
我已经从docx文件中提取了文本,但现在我也想从docx文件中提取图像.
我已经找到了几种用纯Java显示图像的方法,但Android有什么好的例子吗?
我试过这段代码来获取图片但没有工作......
public void extractImages(Document xmlDoc)
{
NodeList binDataList = xmlDoc.getElementsByTagName("w:drawings");
String fileName = "";
Node currentNode;
for(int i = 0; i < binDataList.getLength(); i++)
{
currentNode = binDataList.item(i);
if(currentNode.getNodeType() == Node.ELEMENT_NODE && ((Element)currentNode).hasAttribute("w:name"))
{
File newImageFile = new File(picDirectory, ((Element)currentNode).getAttribute("w:name").replaceFirst("wordml://", ""));
if(newImageFile.exists())
{
}
else
{
if(writeImage(newImageFile, currentNode))
{
//Print some success message
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在寻找一种方法来查找和替换docx文件中的文本而运气不佳.我已经尝试过docx模块而无法使用它.最后,我使用zipfile模块计算了下面描述的方法,并替换了docx存档中的document.xml文件.为此,您需要一个模板文档(docx),其中您要替换的文本作为唯一字符串,无法与文档中的任何其他现有或未来文本匹配(例如,"XXXMEETDATEXXX上与XXXCLIENTNAMEXXX的会议进行得非常顺利. ").
import zipfile
replaceText = {"XXXCLIENTNAMEXXX" : "Joe Bob", "XXXMEETDATEXXX" : "May 31, 2013"}
templateDocx = zipfile.ZipFile("C:/Template.docx")
newDocx = zipfile.ZipFile("C:/NewDocument.docx", "a")
with open(templateDocx.extract("word/document.xml", "C:/")) as tempXmlFile:
tempXmlStr = tempXmlFile.read()
for key in replaceText.keys():
tempXmlStr = tempXmlStr.replace(str(key), str(replaceText.get(key)))
with open("C:/temp.xml", "w+") as tempXmlFile:
tempXmlFile.write(tempXmlStr)
for file in templateDocx.filelist:
if not file.filename == "word/document.xml":
newDocx.writestr(file.filename, templateDocx.read(file))
newDocx.write("C:/temp.xml", "word/document.xml")
templateDocx.close()
newDocx.close()
Run Code Online (Sandbox Code Playgroud)
我的问题是这种方法有什么问题?我对这些东西很陌生,所以我觉得别人应该已经弄明白了.这让我相信这种方法存在一些问题.但它的确有效!我在这里错过了什么?
.
以下是我想要学习这些东西的其他人的思考过程的演练:
步骤1)准备要作为键替换的文本字符串的Python字典和作为项目的新文本(例如{"XXXCLIENTNAMEXXX":"Joe Bob","XXXMEETDATEXXX":"2013年5月31日"}).
步骤2)使用zipfile模块打开模板docx文件.
步骤3)使用追加访问模式打开一个新的docx文件.
步骤4)从模板docx文件中提取document.xml(所有文本都存在),并将xml读取为文本字符串变量.
步骤5)使用for循环将xml文本字符串中字典中定义的所有文本替换为新文本.
步骤6)将xml文本字符串写入新的临时xml文件.
步骤7)使用for循环和zipfile模块将模板docx存档中的所有文件复制到新的docx存档除了word/document.xml文件.
步骤8)将带有替换文本的临时xml文件写入新的docx存档作为新的word/document.xml文件.
步骤9)关闭模板和新的docx存档.
步骤10)打开新的docx文档,享受替换后的文本!
- 编辑 - 第7行和第11行缺少右括号')'
考虑一个需要docx文档文本的用户,而不需要在R中处理页眉和页脚.
如果将file.docx重命名为file.zip并分析文档document.xml - 它是一个格式良好的XML文档及其文本.
Microsfot(或其他开发人员)是否在docx文件的ZIP包中发布了此document.xml子文件的架构?
该文件如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14">
- <w:body>
- <w:p w:rsidR="00F447D7" w:rsidRPr="00C63308" w:rsidRDefault="00F447D7">
- <w:pPr>
Run Code Online (Sandbox Code Playgroud) 我正在尝试了解Apache POI的某些部分.例如,我试图从现有的docx文件中获取文本(或表格等).例如,XWPFDocument中有一个方法getParagraph(.. CTP p):
它返回"带有CTP类p的段落".但什么是CTP类?我查看了文档的xml结构,但没有找到类似的东西.因此,我不知道如何首先调用方法.对于相同的XWPFDocument,还有一个方法getTable(CTTbl CTTbl),它通过其CTtbl-Object返回一个表.
对于ooxml文档中的每个部分/类型的数据,似乎都有一个CP*,所以我想了解如何使用它们.此外,从文档中可以看出,这些方法似乎是获取元素而不将其粘贴到集合中或猜测其位置的唯一直接方法.
使用markdown代码块时,在DOCX文档中生成的等宽字体大小太大.
我可以通过指定自定义template.docx文件来调整段落的字体大小,但由于某种原因,生成的代码块不使用段落样式,而不是大多数其他生成的输出.
有没有办法:
使代码块使用特定样式,以便我可以覆盖template.docx中的样式
覆盖代码块的DOCX表示中使用的等宽字体?
更新以澄清:我正在使用基于先前生成的docx的外部reference.docx,如评论中所述.通过修改heading1等的样式,我可以合理地控制输出.问题是生成的等宽文本不使用命名样式,它只是"正常"有一些变化.所以除非我也改变所有"普通"文本的大小,否则我无法在模板中更改它.
我一直在敲打这个问题几个小时,我确信解决方案很简单,或者根本不存在.
我正在尝试将html文件转换为docx!
<!DOCTYPE html>
<html>
<head>
<style>
body {
background-color: #d0e4fe;
}
h1 {
color: orange;
text-align: center;
}
p {
font-family: "Times New Roman";
font-size: 20px;
}
</style>
</head>
<body>
<h1>My First CSS Example</h1>
<p>This is a paragraph.</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我可以转换它没有问题,但我不能让风格坚持下去.
pandoc -s myfile.html -o test64.docx
pandoc -s -c myfile.css myfile.html -o test64.docx
Run Code Online (Sandbox Code Playgroud)
请救救我
是否有开发工具包/ lib(用c或c ++编写)来编写docx文件?微软有一个开发工具包,但它是用C#编写的.
我正在处理文档存储.因此我计划将SqlServer 2012与文件表一起使用.现在经过一些测试后,似乎SqlServer只索引doc而不是docx文件.
我还安装了Microsoft Filter Pack 2.0.
有人知道如何获得docx支持吗?也许还有一种获得pdf支持的方式?
非常感谢Boas
我有MS word doc保存为.docx.我想通过编辑docx的XML文件在我的文本中插入新行.我已经尝试过
, , ,	,AMD也总是给我唯一的空间不是一个新的生产线.
它能做什么:
(XML代码)
<w:t>hel
lo</w:t>
当我打开.docx文件然后它被更改为:
Hel lo不是因为我想成为Hel一条线和lo一条线.
我有一个docx文件,我想在编辑后返回.我有以下代码......
object useFile = Server.MapPath("~/Documents/File.docx");
object saveFile = Server.MapPath("~/Documents/savedFile.docx");
MemoryStream newDoc = repo.ChangeFile(useFile, saveFile);
return File(newDoc.GetBuffer().ToArray(), "application/docx", Server.UrlEncode("NewFile.docx"));
Run Code Online (Sandbox Code Playgroud)
该文件似乎很好,但我收到错误消息("文件已损坏"和另一个说"Word发现不可读的内容.如果您信任源点击是").有任何想法吗?
提前致谢
编辑
这是我模型中的ChangeFile ......
public MemoryStream ChangeFile(object useFile, object saveFile)
{
byte[] byteArray = File.ReadAllBytes(useFile.ToString());
using (MemoryStream ms = new MemoryStream())
{
ms.Write(byteArray, 0, (int)byteArray.Length);
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(ms, true))
{
string documentText;
using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
{
documentText = reader.ReadToEnd();
}
documentText = documentText.Replace("##date##", DateTime.Today.ToShortDateString());
using (StreamWriter writer = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
writer.Write(documentText);
}
}
File.WriteAllBytes(saveFile.ToString(), ms.ToArray()); …Run Code Online (Sandbox Code Playgroud)