org.apache.http.*工具包出错的问题

Android 6.0 HttpClient 使用指南
本文介绍了在 Android 6.0 (API 23) 中 Google 移除 Apache HttpClient 类的情况,并提供了如何继续使用 HttpClient 的解决方案。推荐使用 HttpUrlConnection 或在项目中手动引入 org.apache.http.legacy.jar 包。

首先:

android 6.0(API 23)中,Google已经移除了移除了Apache HttpClient相关的类
推荐使用HttpUrlConnection,如果要继续使用需要Apache HttpClient,需要在eclipse下libs里添加org.apache.http.legacy.jar,android studio里在相应的module下的build.gradle中加入:
android {
useLibrary 'org.apache.http.legacy'
}
上面的jar包在:**\android-sdk-windows\platforms\android-23\optional下(需要下载android 6.0的SDK)
同时也移除了SSL 和Notification的setLatestEventInfo方法

以上的大体正确,但是要注意:

具体添加的位置是这个:

该目录之下的:


对于这个问题上次已经遇到过一次了,半路退怯,这次又是,遂不能忍,最后编译,ok!

<think> 我们正在讨论的是 Apache POI HWPF 中的 `org.apache.poi.hwpf.usermodel.Paragraph` 类。这个类用于处理 Word 97-2003 文档(.doc 文件)中的段落。 根据引用[3],我们知道 HWPF 是用于处理 MS Word 97-2003 文档的,而 `Paragraph` 就是其中一个核心类,对应于 Word 文档中的一个段落。 下面我将详细介绍 `org.apache.poi.hwpf.usermodel.Paragraph` 的使用方法和功能。 ### 一、Paragraph 类概述 `Paragraph` 类代表 Word 文档中的一个段落。每个段落由多个字符组成,并且具有自己的格式属性(如对齐方式、缩进、行间距等)。 #### 主要功能: 1. **获取段落文本**:提取段落中的文字内容。 2. **获取段落样式**:包括对齐方式、缩进、行间距等。 3. **获取段落中的字符格式**:通过 `CharacterRun` 对象访问段落内不同文本块的格式(如字体、字号、颜色等)。 4. **判断段落类型**:例如,是否是列表的一部分,是否是标题等。 ### 二、基本使用方法 #### 1. 获取段落对象 通常我们从 `Range` 或 `HWPFDocument` 中获取段落: ```java HWPFDocument doc = new HWPFDocument(new FileInputStream("document.doc")); Range range = doc.getRange(); int numParagraphs = range.numParagraphs(); for (int i=0; i<numParagraphs; i++) { Paragraph paragraph = range.getParagraph(i); // 处理段落 } ``` #### 2. 获取段落文本 ```java String text = paragraph.text().trim(); // 获取段落文本并去除首尾空白 ``` #### 3. 获取段落样式 ```java // 获取段落对齐方式 ParagraphAlignment alignment = paragraph.getJustification(); // 注意:这里返回的是 HWPF 定义的 ParagraphAlignment,与 XWPF(处理 .docx)的不同 // 获取段落左缩进(以缇为单位,1缇=1/1440英寸) int leftIndent = paragraph.getIndentFromLeft(); // 获取段前间距 int spaceBefore = paragraph.getSpacingBefore(); // 获取段后间距 int spaceAfter = paragraph.getSpacingAfter(); // 获取行间距(单位:缇) int lineSpacing = paragraph.getLineSpacing(); ``` #### 4. 处理段落中的字符格式(CharacterRun) 一个段落可能包含多个不同格式的文本块,每个文本块由一个 `CharacterRun` 表示: ```java // 遍历段落中的字符运行 for (int j=0; j<paragraph.numCharacterRuns(); j++) { CharacterRun run = paragraph.getCharacterRun(j); String runText = run.text(); boolean isBold = run.isBold(); String fontName = run.getFontName(); int fontSize = run.getFontSize() / 2; // 返回的单位是半磅,所以除以2得到磅值 } ``` #### 5. 段落类型判断 ```java // 检查段落是否在列表中 boolean isInList = paragraph.isInList(); // 检查段落是否是列表项的开始 boolean isListItem = paragraph.isListItem(); ``` ### 三、常见操作场景 #### 1. 读取整个文档的文本(按段落) ```java HWPFDocument doc = ...; Range range = doc.getRange(); for (int i=0; i<range.numParagraphs(); i++) { Paragraph para = range.getParagraph(i); System.out.println("段落" + i + ": " + para.text()); } ``` #### 2. 提取特定格式的段落(如标题) ```java // 假设标题的样式是:字体大小为14磅以上且为粗体 for (int i=0; i<range.numParagraphs(); i++) { Paragraph para = range.getParagraph(i); if (para.numCharacterRuns() > 0) { CharacterRun firstRun = para.getCharacterRun(0); if (firstRun.getFontSize() >= 28 && firstRun.isBold()) { // 28半磅=14磅 System.out.println("标题段落: " + para.text()); } } } ``` #### 3. 修改段落文本和格式 注意:HWPF 修改文档的功能相对有限,且容易出错,但可以尝试以下操作: ```java // 修改段落文本(实际上Paragraph没有直接提供修改方法,通常通过CharacterRun或Range来修改) // 一种间接方式:先删除原有内容,再插入新内容 range.replaceText(paragraph.text(), "新文本", false); // 替换整个段落文本(注意:这可能会破坏格式) // 或者,更精细地操作CharacterRun if (paragraph.numCharacterRuns() > 0) { CharacterRun run = paragraph.getCharacterRun(0); run.replaceText("旧文本", "新文本"); } ``` ### 四、常见问题与解决 #### 1. **文本提取不完整** **原因**:段落中包含特殊对象(如图片、域代码等)。 **解决方案**:需要检查 `CharacterRun` 中是否包含图片或对象: ```java for (int j=0; j<paragraph.numCharacterRuns(); j++) { CharacterRun run = paragraph.getCharacterRun(j); if (run.getPicOffset() > 0) { Picture picture = doc.getPictureAt(run.getPicOffset()); // 处理图片 } } ``` #### 2. **段落样式获取不准确** **原因**:样式继承自文档默认样式或样式表。 **建议**:直接使用 `Paragraph` 的样式方法获取的值是段落自身的属性,如果没有设置则可能返回默认值。若要获取最终渲染样式,需要结合文档的样式表(但HWPF对此支持有限)。 #### 3. **修改段落格式的限制** **注意**:HWPF 对修改文档的支持不如读取完善,修改段落格式可能会导致文档损坏。建议只做读取操作,或备份原文件。 ### 五、最佳实践 1. **遍历段落优先使用 `Range` 对象**:它提供了更完整的段落序列。 2. **处理文本注意编码**:HWPF 文档内部使用 UTF-16LE 编码,Java 字符串会自动处理。 3. **安全关闭资源**:操作完成后关闭 `HWPFDocument` 和输入流。 > 引用[1]中的错误提示是因为误用了 `.docx` 的类(`XWPF`),在 `.doc`(HWPF)中没有 `ParagraphAlignment` 类[^1]。HWPF 中对应的对齐方式方法返回的是 `int` 值,可以通过 `ParagraphAlignment` 的常量(在 `org.apache.poi.hwpf.usermodel.ParagraphAlignment` 中)进行判断[^3]。 §§相关问题§§ 1. 如何通过HWPF提取Word文档中的图片? 2. 如何判断一个段落是否为表格中的段落? 3. HWPF如何修改段落的字体样式? 4. 有哪些工具可以替代HWPF处理较新的Word文档格式? </think> ### `org.apache.poi.hwpf.usermodel.Paragraph` 详解 `org.apache.poi.hwpf.usermodel.Paragraph` 是 Apache POI HWPF 模块中处理 Word 97-2003 格式(.doc)段落的核心类。以下是其主要功能和使用方法: --- #### 一、核心功能 1. **段落内容访问** ```java String text = paragraph.text(); // 获取纯文本内容 int length = paragraph.text().length(); // 文本长度 ``` 2. **段落格式控制** ```java // 对齐方式(LEFT/CENTER/RIGHT/BOTH) int alignment = paragraph.getJustification(); // 缩进设置(单位:缇,1/1440英寸) int leftIndent = paragraph.getIndentFromLeft(); int rightIndent = paragraph.getIndentFromRight(); int firstLineIndent = paragraph.getFirstLineIndent(); // 间距设置 int spacingBefore = paragraph.getSpacingBefore(); // 段前间距 int spacingAfter = paragraph.getSpacingAfter(); // 段后间距 int lineSpacing = paragraph.getLineSpacing(); // 行间距 ``` 3. **样式属性** ```java boolean isTableRowEnd = paragraph.isTableRowEnd(); // 是否表格行结束 boolean isInList = paragraph.isInList(); // 是否在列表中 int styleIndex = paragraph.getStyleIndex(); // 获取样式ID ``` --- #### 二、关键操作指南 ##### 1. 遍历文档段落 ```java HWPFDocument doc = new HWPFDocument(new FileInputStream("document.doc")); Range range = doc.getRange(); for (int i = 0; i < range.numParagraphs(); i++) { Paragraph para = range.getParagraph(i); System.out.println("段落 " + i + ": " + para.text()); } ``` ##### 2. 处理字符格式 ```java // 遍历段落中的字符块 for (int j = 0; j < para.numCharacterRuns(); j++) { CharacterRun run = para.getCharacterRun(j); // 获取格式属性 boolean isBold = run.isBold(); boolean isItalic = run.isItalic(); String fontName = run.getFontName(); int fontSize = run.getFontSize() / 2; // 转换为磅值 System.out.println("文本块: " + run.text() + " | 字体: " + fontName + " " + fontSize + "pt"); } ``` ##### 3. 检测特殊段落 ```java // 检测标题(通过样式ID) if (para.getStyleIndex() >= 1 && para.getStyleIndex() <= 9) { System.out.println("检测到标题: " + para.text()); } // 检测分页符 if (para.isPageBreak()) { System.out.println("分页符段落"); } ``` --- #### 三、常见问题解决 1. **文本提取乱码** ```java // 指定编码读取(适用于非标准编码文档) String text = new String(para.text().getBytes("ISO-8859-1"), "GBK"); ``` 2. **格式信息丢失** 使用 `CharacterRun` 逐块提取格式: ```java StringBuilder formattedText = new StringBuilder(); for (CharacterRun run : para.getCharacterRuns()) { if (run.isBold()) formattedText.append("<b>"); formattedText.append(run.text()); if (run.isBold()) formattedText.append("</b>"); } ``` 3. **空段落处理** ```java if (para.text().trim().isEmpty()) { System.out.println("空段落(可能包含隐藏格式)"); } ``` --- #### 四、高级应用 ##### 修改段落格式 ```java // 创建新段落(文档级操作) Paragraph newPara = range.insertAfter(para); newPara.insertBefore("新增文本").setBold(true); // 修改对齐方式 newPara.setJustification(ParagraphAlignment.CENTER); ``` ##### 提取复杂内容 ```java // 提取图片 for (CharacterRun run : para.getCharacterRuns()) { if (run.getPicOffset() > 0) { Picture pic = doc.getPictureAt(run.getPicOffset()); byte[] imageData = pic.getContent(); // 保存图片文件... } } ``` --- #### 五、最佳实践 1. **安全遍历**:使用 `range.numParagraphs()` 而非固定索引 2. **格式继承**:注意未显式设置的格式会继承文档默认值 3. **资源管理**:文档操作后关闭流: ```java doc.close(); inputStream.close(); ``` 4. **版本适配**:仅支持 Word 97-2003 (.doc) 格式[^4] > 注意:引用[1]的错误是因混淆了 HWPF (.doc) 和 XWPF (.docx) 模块,前者无 `ParagraphAlignment` 类[^1],对齐方式用 `getJustification()` 返回整型值表示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值