nodejs 워드 문서 해석 기 아이디어 상세 설명 실현

5773 단어 nodejsword해석 기
이전 항목 에서 필요 한 것 이 있 습 니 다.전단 에 워드 문 서 를 업로드 한 다음 백 엔 드 에서 이 문서 의 지정 한 위치의 내용 을 추출 하여 저장 해 야 합 니 다.여기 백 엔 드 는 nodejs 를 사 용 했 습 니 다.이 요 구 를 받 기 시 작 했 는데 손 댈 수가 없 었 습 니 다.주로 워드 와 같은 유형의 문 서 를 처리 하지 않 았 습 니 다.어떻게 해석 합 니까?Excel 은 관련 라 이브 러 리 가 있 고 간단 합 니 다.
사고의 방향
한참 동안 검색 한 결과 npm 에서 adm-zip 이라는 가방 을 발 견 했 습 니 다.이 가방 은 워드 문 서 를 압축 할 수 있 습 니 다.원래 워드 문서 도 압축 을 풀 수 있 었 습 니 다.그 전에 몰 랐 습 니 다.다음 코드 를 통 해 워드 문 서 를 압축 을 풀 고 내용 을 추출 할 수 있 습 니 다.

var admZip = require('adm-zip');
const zip = new admZip('test.docx');
//  docx        result 
zip.extractAllTo("./result", /*overwrite*/true);
우선 docx 문 서 를 새로 만 듭 니 다.내용 은 다음 과 같 습 니 다.
 
그 다음 에 상기 코드 를 실행 하여 압축 을 풀 고 다음 과 같은 파일 을 얻 을 수 있 습 니 다.아래 그림 에서 여러 개의 폴 더 가 생 성 되 었 음 을 알 수 있 습 니 다.워드 의 내용 은 워드 폴 더 에 있 는 document.xml 파일 안에 있 습 니 다.
 
워드 폴 더 에 들 어간 내용
 
우 리 는 document.xml 파일 을 계속 열 어서 도대체 안에 무엇이 있 는 지 알 아 보 겠 습 니 다.브 라 우 저 로 직접 열 어야 합 니 다.id 로 열 면 표 시 된 모든 내용 이 한 줄 에 있 으 면 읽 을 수 없습니다!
 
위의 그림 은 워드 문서 의 일부분 일 뿐 워드 문서 에 몇 개의 문자 만 있 는 것 을 발견 할 수 있 습 니 다.그러나 xml 에 서 는 장광설 입 니 다.자세히 분석 해 보면 정상 적 입 니 다.xml 는 모두 확장 가능 한 태그 언어 라 고 부 릅 니 다.이 는 전송 과 데 이 터 를 저장 하 는 것 으로 설계 되 었 습 니 다.이것 은 순수한 텍스트 의 표시 일 뿐 워드 의 내용 형식 은 다양 합 니 다.이러한 내용 을 효과적으로 묘사 하 는 방법 이 필요 할 것 이 므 로 xml 로 설명 하 였 다.
테스트 문서 의 네 글 자 를 굵게 변색 시 키 는 경사 글꼴 을 시도 해 보 겠 습 니 다.다음 그림 입 니 다.
 
그 다음 에 압축 을 풀 고 document.xml 를 얻 으 며 해당 하 는 내용 을 확인 합 니 다.다음 과 같 습 니 다.
 
이것 은 매우 뚜렷 하 다.는 문자 의 굵기 를 나타 내 고,는 문자 의 기울 기 를 나타 내 며,
문자 의 색 을 나타 내기 때문에 이 네 글 자 는 이 몇 줄 의 xml 로 묘사 해 야 하기 때문에 장황 한 xml 도 이상 하지 않다.
내용 추출
위 에서 말 한 xml 는 단지 하나의 텍스트 의 표시 일 뿐 입 니 다.우 리 는 아래 코드 로 전체 xml 의 내용 을 읽 을 수 있 습 니 다.결 과 는 string 입 니 다.

var contentXml = zip.readAsText("word/document.xml");
다음은 우리 가 원 하 는 내용 을 어떻게 추출 하 느 냐 에 중점 을 두 었 습 니 다.정 답 은 정규 표현 식 입 니 다.먼저 워드 문서 의 구 조 를 분석 해 야 합 니 다.워드 문 서 는 사실은 Paragraph 라 는 단락 으로 구성 되 어 있 습 니 다.vb 에서 단락 을 쉽게 얻 고 수정 할 수 있 습 니 다.홈 페이지 전송 문이것 을 지적 하 다
 
그렇다면 도대체 어떻게 해 야 하나의 단락 일 까요?사실은 간단 합 니 다.워드 문 서 를 자세히 살 펴 보면 다음 그림 의 작은 화살 표를 보 았 습 니까?모든 작은 화살표 앞의 내용 은 하나의 단락 입 니 다.그러면 아래 그림 에는 모두 16 개의 단락 이 있 습 니 다.물론 일부 단락 은 비어 있 고 내용 이 없습니다.
 
우 리 는 xml 의 구 조 를 다시 연구 하고 펼 쳐 진 xml 를 접 습 니 다.다음 그림 에서라 는 라벨 이 바로 표 시 된 단락 이 고 중간 에가 있 습 니 다.
표 안에 숨 어 있 습 니 다.이렇게 보면 표 앞의 세 단락,뒤의 세 단락 이 위의 그림 과 대응 합 니 다.
 
따라서 우 리 는 각 단락 의 텍스트 를 추출 하고 하나의 배열 로 돌아 갈 수 있 습 니 다.모든 항목 은 하나의 단락 의 내용 입 니 다.그러면 전체 워드 의 내용 을 완전 하 게 해석 할 수 있 습 니 다.관건 은 각의 내용 을 어떻게 추출 하 느 냐 에 있 습 니 다.우 리 는 계속 하나의를 전개 하여 관찰 합 니 다.다음 그림 에서 내용 이 많 지만 사실은 텍스트 는중간 에 저장 되 어 있 습 니 다.따라서 사고방식 이 뚜렷 해 졌 다.먼저 정규 표현 식 으로 모든의 내용 을 추출 한 다음 에 각의 내용 에 대해 진일보 한 정규 추출 을 하고 그 안의 모든의 내용 을 추출 하여 한 단락 의 전체 내용 을 한데 묶 어 구성한다.
 
구체 코드
다음은 구체 적 인 추출 코드 입 니 다.

//   word   ,              
var parser = function parseWordDocument(absoluteWordPath,callback){
 //       
 var resultList = [];
 //      
 fs.exists(absoluteWordPath, function(exists){
 if(exists){
 //   
 const zip = new admZip(absoluteWordPath);
 // document.xml(         )   text  
 var contentXml = zip.readAsText("word/document.xml");
 //        <w:p>     ,      <w:p>,      <w:t>,          
 //  ?       (        ),         <w:p></w:p>
 var matchedWP = contentXml.match(/<w:p.*?>.*?<\/w:p>/gi);
 //      <w:p></w:p>   <w:t>,      matchedWP      
 if(matchedWP){
 matchedWP.forEach(function(wpItem){
  //    <w:t>   ,    <w:t xml:space="preserve">    ,      
  var matchedWT = wpItem.match(/(<w:t>.*?<\/w:t>)|(<w:t\s.[^>]*?>.*?<\/w:t>)/gi);
  var textContent = '';
  if(matchedWT){
  matchedWT.forEach(function(wtItem){
  //    <w:t xml:space="preserve">  
  if(wtItem.indexOf('xml:space')===-1){
  textContent+=wtItem.slice(5,-6);
  }else{
  textContent+=wtItem.slice(26,-6);
  }
  });
  resultList.push(textContent)
  }
 });
 //    
 callback(resultList)
 }
 }else{
 callback(resultList)
 }
 });
};
단락 앞 에 빈 칸 이 있 으 면의 형식 이 다 릅 니 다.다음 과 같 습 니 다.이 space 설명 이 많아 서 특별한 처리 가 필요 합 니 다.
코드 양 이 적 습 니 다.관건 은 정규 작성 에 있 습 니 다.상기 docx 문서 추출 후의 출력 결 과 는 다음 과 같 습 니 다.
 
마지막 으로 나 는 이 도 구 를 npm 가방,주소 점여기,이곳으로 썼 다.

좋은 웹페이지 즐겨찾기