문제

그래서 저는 텍스트를 추출하여 DB 테이블에 삽입하려고 하는 약 4,000개의 단어 문서를 가지고 있습니다.이는 프로세서가 다음과 같은 문서를 만날 때까지 원활하게 작동합니다. *.doc 파일 확장자를 지정했지만 파일이 실제로 RTF인지 확인합니다.이제 POI가 RTF를 지원하지 않는다는 것을 알았습니다. 하지만 POI가 RTF를 지원하는지 확인할 수 있는 방법이 필요합니다. *.doc 파일은 실제로 RTF이므로 파일을 무시하고 계속 처리하도록 선택할 수 있습니다.

이 문제를 극복하기 위해 ColdFusion의 MimeTypeUtils 사용을 포함하여 여러 기술을 시도했지만 파일 확장자에 대한 MIME 유형 가정을 기반으로 하고 여전히 RTF를 응용 프로그램/msword로 분류하는 것 같습니다.여부를 판단하는 다른 방법이 있나요? *.doc RTF인가요?어떤 도움이라도 대단히 감사하겠습니다.

도움이 되었습니까?

해결책

CF8 및 호환 가능:

<cffunction name="IsRtfFile" returntype="Boolean" output="false">
    <cfargument name="FileName" type="String" />
    <cfreturn Left(FileRead(Arguments.FileName),5) EQ '{\rtf' />
</cffunction>


이전 버전의 경우:

<cffunction name="IsRtfFile" returntype="Boolean" output="false">
    <cfargument name="FileName" type="String" />
    <cfset var FileData = 0 />
    <cffile variable="FileData" action="read" file="#Arguments.FileName#" />
    <cfreturn Left(FileData,5) EQ '{\rtf' />
</cffunction>


업데이트: 더 나은 CF8/호환 답변입니다.전체 파일을 메모리에 로드하지 않으려면 다음을 수행하여 처음 몇 문자만 로드할 수 있습니다.

<cffunction name="IsRtfFile" returntype="Boolean" output="false">
    <cfargument name="FileName" type="String" />
    <cfset var FileData = 0 />

    <cfloop index="FileData" file="#Arguments.FileName#" characters="5">
        <cfbreak/>
    </cfloop>

    <cfreturn FileData EQ '{\rtf' />
</cffunction>


의견을 바탕으로 :
다음은 "이 형식이 무엇인지" 유형의 함수를 생성하는 매우 빠른 방법입니다.완벽하지는 않지만 아이디어를 제공합니다 ...

<cffunction name="determineFileFormat" returntype="String" output="false"
    hint="Determines format of file based on header of the file's data."
    >
    <cfargument name="FileName" type="String"/>
    <cfset var FileData = 0 />
    <cfset var CurFormat = 0 />
    <cfset var MaxBytes = 8 />
    <cfset var Formats =
        { WordNew  : 'D0,CF,11,E0,A1,B1,1A,E1'
        , WordBeta : '0E,11,FC,0D,D0,CF,11,E0'
        , Rtf      : '7B,5C,72,74,66' <!--- {\rtf --->
        , Jpeg     : 'FF,D8'
        }/>

    <cfloop index="FileData" file="#Arguments.FileName#" characters="#MaxBytes#">
        <cfbreak/>
    </cfloop>

    <cfloop item="CurFormat" collection="#Formats#">
        <cfif Left( FileData , ListLen(Formats[CurFormat]) ) EQ convertToText(Formats[CurFormat]) >
            <cfreturn CurFormat />
        </cfif>
    </cfloop>

    <cfreturn "Unknown"/>
</cffunction>


<cffunction name="convertToText" returntype="String" output="false">
    <cfargument name="HexList" type="String" />
    <cfset var Result = "" />
    <cfset var CurItem = 0 />

    <cfloop index="CurItem" list="#Arguments.HexList#">
        <cfset Result &= Chr(InputBaseN(CurItem,16)) />
    </cfloop>

    <cfreturn Result />
</cffunction>

물론 이 모든 것이 일반적인 텍스트 기반 형식(CFM, CSS, JS 등)을 포함하여 '헤더 없는' 형식에서는 작동하지 않는다는 점을 지적할 가치가 있습니다.

다른 팁

RTF 파일의 처음 5바이트는 다음과 같아야 합니다.

{\rtf

그렇지 않은 경우 RTF 파일이 아닙니다.

외부 링크 섹션은 위키피디아 기사 다양한 버전의 RTF 사양에 대한 링크입니다.

Doc 파일(적어도 Word '97 이후의 파일)은 "Windows 복합 바이너리 형식"이라는 형식을 사용합니다. 여기 PDF에서.이에 따르면 이러한 Doc 파일은 다음 순서로 시작됩니다.

0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1

또는 이전 베타 파일의 경우:

0x0e, 0x11, 0xfc, 0x0d, 0xd0, 0xcf, 0x11, 0xe0

Word의 Wikipedia 기사에 따르면 97년 이전에는 최소한 5가지 형식이 있었습니다.

{ tf를 찾는 것이 최선의 방법이 될 것입니다.

행운을 빕니다. 이것이 도움이 되기를 바랍니다.

byteArray를 문자열로 변환할 수 있습니다.

<cfset str = createObject("java", "java.lang.String").init(bytes)>

POI 소스에서 hasxxxHeader 메소드를 사용해 볼 수도 있습니다.입력 파일이 POI가 처리할 수 있는 파일인지 확인합니다.OLE 또는 OOXML.하지만 다른 누군가가 문제 파일을 건너뛰기 위해 간단한 try/catch를 사용하도록 제안했다고 생각합니다.그렇게 하고 싶지 않은 이유가 있나요?더 간단한 옵션처럼 보일 것입니다.

업데이트:CF 8의 기능을 사용하겠다는 Peter의 제안도 효과가 있을 것입니다.

<cfset input = FileOpen(pathToYourFile)>
<cfset bytes = FileRead(input , 8)>
<cfdump var="#bytes#">
<cfset FileClose(input)>

다음을 사용하여 파일을 식별해 볼 수 있습니다. 드로이드 도구(디지털 기록 개체 식별)에 대한 액세스를 제공합니다. 대명사 기술 등록.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top