वर्ड डॉक्यूमेंट में पाए जाने वाले सब्सक्राइबर्स, सुपरस्क्रिप्ट्स और इक्वेशन के माध्यम से प्रोग्रामेटिकली इट्रिएट कैसे करें


12

मेरे पास कुछ वर्ड दस्तावेज़ हैं, जिनमें से प्रत्येक में कुछ सौ पृष्ठों के वैज्ञानिक डेटा शामिल हैं:

  • रासायनिक सूत्र (H2SO4 सभी उचित सदस्यता और सुपरस्क्रिप्ट के साथ)
  • वैज्ञानिक संख्याएँ (प्रतिपादक का उपयोग करते हुए प्रतिपादक)
  • गणितीय समीकरणों के बहुत सारे। वर्ड में गणितीय समीकरण संपादक का उपयोग करके लिखा गया।

समस्या यह है कि, Word में इस डेटा को संग्रहीत करना हमारे लिए कारगर नहीं है। इसलिए हम एक डेटाबेस (MySQL) में यह सारी जानकारी संग्रहीत करना चाहते हैं। हम स्वरूपण को LaTex में बदलना चाहते हैं।

क्या वीबीए का उपयोग करते हुए किसी वर्ड डॉक्यूमेंट के भीतर सभी उपखंडों, सुपरस्क्रिप्ट और समीकरणों के माध्यम से पुनरावृति करने का कोई तरीका है?


क्या आपने दस्तावेज़ के भीतर से xml डेटा निकालने के बारे में सोचा है? सभी Microsoft दस्तावेज़ 2007+ (.docx) मूल रूप से xml फ़ाइलें संपीड़ित हैं। आप एक xml पार्सर का उपयोग करने वालों को पुनः प्राप्त कर सकते हैं।
जेम्स मर्ट्ज़

यह एक टिप्पणी के रूप में पोस्ट करने के लिए बहुत लंबा था, इसलिए मैंने एक उत्तर के रूप में जोड़ा।
जेम्स मेर्ट्ज़

जवाबों:


12

हाँ वहाँ है। मैं Powershell का उपयोग करके सबसे सफल होगा क्योंकि यह Word फ़ाइलों को काफी अच्छी तरह से संभालता है। मुझे लगता है कि मैं सबसे आसान तरीका होगा।

पॉवर्सशेल बनाम वर्ड ऑटोमेशन के बारे में अधिक जानकारी यहाँ: http://www.simple-talk.com/dotnet/.net-tools/com-automation-of-office-applications-via-powershell/

मैंने थोड़ी गहरी खुदाई की है और मुझे यह पॉवरशेल स्क्रिप्ट मिली:

param([string]$docpath,[string]$htmlpath = $docpath)

$srcfiles = Get-ChildItem $docPath -filter "*.doc"
$saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat], "wdFormatFilteredHTML");
$word = new-object -comobject word.application
$word.Visible = $False

function saveas-filteredhtml
    {
        $opendoc = $word.documents.open($doc.FullName);
        $opendoc.saveas([ref]"$htmlpath\$doc.fullname.html", [ref]$saveFormat);
        $opendoc.close();
    }

ForEach ($doc in $srcfiles)
    {
        Write-Host "Processing :" $doc.FullName
        saveas-filteredhtml
        $doc = $null
    }

$word.quit();

इसे .ps1 के रूप में सहेजें और इसे इसके साथ शुरू करें:

convertdoc-tohtml.ps1 -docpath "C:\Documents" -htmlpath "C:\Output"

यह HTML फ़ाइलों के रूप में निर्दिष्ट निर्देशिका से सभी .doc फ़ाइल को बचाएगा। इसलिए मेरे पास एक doc फाइल है जिसमें मैं आपका H2SO4 सबस्क्राइब करता हूँ और पावरस्लेव कन्वर्सेशन के बाद आउटपुट निम्न है:

<html>

<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
<meta name=Generator content="Microsoft Word 14 (filtered)">
<style>
<!--
 /* Font Definitions */
 @font-face
    {font-family:Calibri;
    panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
    {margin-top:0in;
    margin-right:0in;
    margin-bottom:10.0pt;
    margin-left:0in;
    line-height:115%;
    font-size:11.0pt;
    font-family:"Calibri","sans-serif";}
.MsoChpDefault
    {font-family:"Calibri","sans-serif";}
.MsoPapDefault
    {margin-bottom:10.0pt;
    line-height:115%;}
@page WordSection1
    {size:8.5in 11.0in;
    margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
    {page:WordSection1;}
-->
</style>

</head>

<body lang=EN-US>

<div class=WordSection1>

<p class=MsoNormal><span lang=PL>H<sub>2</sub>SO<sub>4</sub></span></p>

</div>

</body>

</html>

जैसा कि आप देख सकते हैं कि HTML में सब्सक्राइब के अपने टैग हैं इसलिए केवल एक चीज जो बची है वह है बॉश / c ++ में फ़ाइल को पार्स करने के लिए बॉडी / बॉडी से कटने के लिए, LATEX में बदलें और बाद में बाकी HTML टैग को हटा दें।

Http://blogs.technet.com/b/bshukla/archive/2011/09/27/3347395.aspx से कोड


इसलिए मैंने HTML सबस्क्रिप्ट देखने और इसे LATEX सबस्क्रिप्ट के साथ बदलने के लिए C ++ में एक पार्सर विकसित किया है।

कोड:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

 vector < vector <string> > parse( vector < vector <string> > vec, string filename )
{
        /*
                PARSES SPECIFIED FILE. EACH WORD SEPARATED AND
                PLACED IN VECTOR FIELD.

                REQUIRED INCLUDES:
                                #include <iostream>
                                #include <fstream>
                                #include <string>
                                #include <sstream>
                                #include <vector>

            EXPECTS: TWO DIMENTIONAL VECTOR
                     STRING WITH FILENAME
            RETURNS: TWO DIMENTIONAL VECTOR
                     vec[lines][words]
        */
        string vword;
        ifstream vfile;
        string tmp;

         // FILENAME CONVERSION FROM STING
        //  TO CHAR TABLE

        char cfilename[filename.length()+1];
        if( filename.length() < 126 )
        {
                for(int i = 0; i < filename.length(); i++)
                                cfilename[i] = filename[i];
                cfilename[filename.length()] = '\0';
        }
        else return vec;

         // OPENING FILE
        //
        vfile.open( cfilename );
        if (vfile.is_open())
        {
                while ( vfile.good() )
                {
                        getline( vfile, vword );
                        vector < string > vline;
                        vline.clear();

                        for (int i = 0; i < vword.length(); i++)
                        {
                                tmp = "";
                                 // PARSING CONTENT. OMITTING SPACES AND TABS
                                //
                                while (vword[i] != ' ' && vword[i] != ((char)9) && i < vword.length() )
                                        tmp += vword[i++];
                                if( tmp.length() > 0 ) vline.push_back(tmp);
                        }
                        if (!vline.empty())
                                vec.push_back(vline);
                }
                vfile.close();
        }
        else cout << "Unable to open file " << filename << ".\n";
        return vec;
}

int main()
{
        vector < vector < string > > vec;
        vec = parse( vec, "parse.html" );

        bool body = false;
        for (int i = 0; i < vec.size(); i++)
        {
                for (int j = 0; j < vec[i].size(); j++)
                {
                        if ( vec[i][j] == "<body") body=true;
                        if ( vec[i][j] == "</body>" ) body=false;
                        if ( body == true )
                        {
                                for ( int k=0; k < vec[i][j].size(); k++ )
                                {
                                        if (k+4 < vec[i][j].size() )
                                        {
                                                if (    vec[i][j][k]   == '<' &&
                                                        vec[i][j][k+1] == 's' &&
                                                        vec[i][j][k+2] == 'u' &&
                                                        vec[i][j][k+3] == 'b' &&
                                                        vec[i][j][k+4] == '>' )
                                                {

                                                        string tmp = "";
                                                        while (vec[i][j][k+5] != '<')
                                                        {
                                                                tmp+=vec[i][j][k+5];
                                                                k++;
                                                        }
                                                        tmp = "_{" + tmp + "}";
                                                        k=k+5+5;
                                                        cout << tmp << endl;;
                                                }
                                                else cout << vec[i][j][k];
                                        }
                                        else cout << vec[i][j][k];
                                }
                                cout << endl;
                        }
                }
        }
        return 0;
}

Html फ़ाइल के लिए:

<html>

<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
<meta name=Generator content="Microsoft Word 14 (filtered)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin-top:0in;
        margin-right:0in;
        margin-bottom:10.0pt;
        margin-left:0in;
        line-height:115%;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {font-family:"Calibri","sans-serif";}
.MsoPapDefault
        {margin-bottom:10.0pt;
        line-height:115%;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
-->
</style>

</head>

<body lang=EN-US>

<div class=WordSection1>

<p class=MsoNormal><span lang=PL>H<sub>2</sub>SO<sub>4</sub></span></p>

</div>

</body>

</html>

आउटपुट है:

<body
lang=EN-US>
<div
class=WordSection1>
<p
class=MsoNormal><span
lang=PL>H_{2}
SO_{4}
</span></p>
</div>

यह निश्चित रूप से आदर्श नहीं है, लेकिन उपचार अवधारणा के प्रमाण के रूप में है।


3

आप किसी भी कार्यालय दस्तावेज़ से सीधे xml निकाल सकते हैं जो 2007+ है। यह निम्नलिखित फैशन में किया जाता है:

  1. .docx से .zip तक फ़ाइल का नाम बदलें
  2. 7zip (या कुछ अन्य निष्कर्षण कार्यक्रम) का उपयोग करके फ़ाइल निकालें
  3. दस्तावेज़ की वास्तविक सामग्री के लिए wordसबफ़ोल्डर और document.xmlफ़ाइल के तहत निकाले गए फ़ोल्डर में देखें । जिसमें दस्तावेज़ की सभी सामग्री होनी चाहिए।

यहाँ छवि विवरण दर्ज करें

मैंने एक नमूना दस्तावेज़ बनाया, और बॉडी टैग में मुझे यह मिला (ध्यान दें कि मैंने इसे जल्दी से एक साथ रखा है, इसलिए प्रारूपण थोड़ा बंद हो सकता है:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<w:body>
    -<w:p w:rsidRDefault="000E0C3A" w:rsidR="008B5DAA">
        -<w:r>
            <w:t xml:space="preserve">This </w:t>
        </w:r>
-       <w:r w:rsidRPr="000E0C3A">
            -<w:rPr>
                <w:vertAlign w:val="superscript"/>
            </w:rPr>
            <w:t>is</w:t>
        </w:r>
-       <w:r>
            <w:t xml:space="preserve"> a </w:t>
        </w:r>
            -<w:r w:rsidRPr="000E0C3A">
                -<w:rPr>
                    <w:vertAlign w:val="subscript"/>
                </w:rPr>
                <w:t>test</w:t>
            </w:r>
        -<w:r>
            <w:t>.</w:t>
        </w:r>
    </w:p>
</w:body>

ऐसा प्रतीत होता है कि <w:t>टैग पाठ के लिए <w:rPr>है, फ़ॉन्ट की परिभाषा है और <w:p>एक नया पैराग्राफ है।

समतुल्य शब्द इस तरह दिखता है:

यहाँ छवि विवरण दर्ज करें


2

मैं mnmnc द्वारा पीछा किया गया है कि एक अलग दृष्टिकोण को देख रहा हूँ।

HTML के रूप में परीक्षण Word दस्तावेज़ को सहेजने के मेरे प्रयास सफल नहीं थे। मैंने अतीत में पाया है कि Office जेनरेट किया गया HTML इतना अधिक भरा हुआ है कि आपके द्वारा इच्छित बिट्स को निकालना असंभव के निकट है। मैंने पाया है कि यहाँ मामला है। मुझे समीकरणों की भी समस्या है। Word छवियों के रूप में समीकरणों को बचाता है। प्रत्येक समीकरण के लिए WMZ के विस्तार के साथ दो चित्र होंगे और एक GIF के विस्तार के साथ। यदि आप Google क्रोम के साथ html फ़ाइल प्रदर्शित करते हैं, तो समीकरण ठीक दिखते हैं लेकिन अद्भुत नहीं; जब कोई छवि डिस्प्ले / एडिट टूल जो पारदर्शी छवियों को संभाल सकता है, के साथ प्रदर्शित होने पर उपस्थिति जीआईएफ फ़ाइल से मेल खाती है। यदि आप Internet Explorer के साथ HTML फ़ाइल प्रदर्शित करते हैं, तो समीकरण परिपूर्ण दिखते हैं।

अतिरिक्त जानकारी

मुझे इस जानकारी को मूल उत्तर में शामिल करना चाहिए था।

मैंने एक छोटा सा वर्ड डॉक्यूमेंट बनाया, जिसे मैंने Html के रूप में सेव किया। नीचे दी गई छवि के तीन पैनल मूल वर्ड डॉक्यूमेंट, Html डॉक्यूमेंट को Microsoft इंटरनेट एक्सप्लोरर द्वारा प्रदर्शित और Html डॉक्यूमेंट को Google Chrome द्वारा प्रदर्शित के रूप में दिखाता है।

मूल शब्द, एचटीएम द्वारा प्रदर्शित IE और HTML क्रोम द्वारा प्रदर्शित किया गया है

जैसा कि पहले बताया गया है कि IE और क्रोम छवियों के बीच का अंतर दो बार बचाया जा रहा है, एक बार WMZ प्रारूप में और एक बार GIF प्रारूप में। यहाँ दिखाने के लिए Html बहुत बड़ी है।

मैक्रो द्वारा बनाया गया Html है:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" 
                   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head><body>
<p>Some ordinary text.</p>
<p>H<sub>2</sub>SO<sub>4</sub>.</p>
<p>Abc &amp; def &gt; ghi &lt; jkl</p>
<p>x<sup>3</sup>+ x<sup>2</sup>+3x+4=0.</p><p></p>
<p><i>Equation</i>  </p>
<p>Mno</p>
<p><i>Equation</i></p>
</body></html>

जो के रूप में प्रदर्शित करता है:

IE द्वारा प्रदर्शित के रूप में मैक्रो द्वारा बनाई गई एचटीएमएल

मैंने समीकरणों को परिवर्तित करने का प्रयास नहीं किया है क्योंकि फ्री मैथ टाइप सॉफ्टवेयर डेवलपमेंट किट में स्पष्ट रूप से रूटीन शामिल हैं जो लाटेक्स में परिवर्तित होते हैं

कोड बहुत बुनियादी है तो कई टिप्पणियां नहीं हैं। अगर कुछ अस्पष्ट है, तो पूछें। नोट: यह मूल कोड का एक उन्नत संस्करण है।

Sub ConvertToHtml()

  Dim FileNum As Long
  Dim NumPendingCR As Long
  Dim objChr As Object
  Dim PathCrnt As String
  Dim rng As Word.Range
  Dim WithinPara As Boolean
  Dim WithinSuper As Boolean
  Dim WithinSub As Boolean

  FileNum = FreeFile
  PathCrnt = ActiveDocument.Path
  Open PathCrnt & "\TestWord.html" For Output Access Write Lock Write As #FileNum

  Print #FileNum, "<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Frameset//EN""" & _
                  " ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"">" & _
                  vbCr & vbLf & "<html xmlns=""http://www.w3.org/1999/xhtml"" " & _
                  "xml:lang=""en"" lang=""en"">" & vbCr & vbLf & _
                  "<head><meta http-equiv=""Content-Type"" content=""text/html; " _
                  & "charset=utf-8"" />" & vbCr & vbLf & "</head><body>"

  For Each rng In ActiveDocument.StoryRanges

    NumPendingCR = 0
    WithinPara = False
    WithinSub = False
    WithinSuper = False

    Do While Not (rng Is Nothing)
      For Each objChr In rng.Characters
        If objChr.Font.Superscript Then
          If Not WithinSuper Then
            ' Start of superscript
            Print #FileNum, "<sup>";
            WithinSuper = True
          End If
        ElseIf WithinSuper Then
          ' End of superscript
          Print #FileNum, "</sup>";
          WithinSuper = False
        End If
        If objChr.Font.Subscript Then
          If Not WithinSub Then
            ' Start of subscript
            Print #FileNum, "<sub>";
            WithinSub = True
          End If
        ElseIf WithinSub Then
          ' End of subscript
          Print #FileNum, "</sub>";
          WithinSub = False
          End If
          Select Case objChr
            Case vbCr
              NumPendingCR = NumPendingCR + 1
            Case "&"
              Print #FileNum, CheckPara(NumPendingCR, WithinPara) & "&amp;";
            Case "<"
              Print #FileNum, CheckPara(NumPendingCR, WithinPara) & "&lt;";
            Case ">"
              Print #FileNum, CheckPara(NumPendingCR, WithinPara) & "&gt;";
            Case Chr(1)
              Print #FileNum, CheckPara(NumPendingCR, WithinPara) & "<i>Equation</i>";
            Case Else
              Print #FileNum, CheckPara(NumPendingCR, WithinPara) & objChr;
          End Select
      Next
      Set rng = rng.NextStoryRange
    Loop
  Next

  If WithinPara Then
    Print #FileNum, "</p>";
    withpara = False
  End If

  Print #FileNum, vbCr & vbLf & "</body></html>"

  Close FileNum

End Sub
Function CheckPara(ByRef NumPendingCR As Long, _
                   ByRef WithinPara As Boolean) As String

  ' Have a character to output.  Check paragraph status, return
  ' necessary commands and adjust NumPendingCR and WithinPara.

  Dim RtnValue As String

  RtnValue = ""

  If NumPendingCR = 0 Then
    If Not WithinPara Then
      CheckPara = "<p>"
      WithinPara = True
    Else
      CheckPara = ""
    End If
    Exit Function
  End If

  If WithinPara And (NumPendingCR > 0) Then
    ' Terminate paragraph
    RtnValue = "</p>"
    NumPendingCR = NumPendingCR - 1
    WithinPara = False
  End If
  Do While NumPendingCR > 1
    ' Replace each pair of CRs with an empty paragraph
    RtnValue = RtnValue & "<p></p>"
    NumPendingCR = NumPendingCR - 2
  Loop
  RtnValue = RtnValue & vbCr & vbLf & "<p>"
  WithinPara = True
  NumPendingCR = 0

  CheckPara = RtnValue

End Function

अच्छा कार्य। क्या यह एकाधिक फ़ाइलों के लिए काम करेगा या क्या आपको इसे उस फ़ाइल के भीतर रखना होगा जिसे आप कनवर्ट करना चाहते हैं?
mnmnc

@mnmnc। धन्यवाद। मुझे लगता है कि आपका समाधान छाप है, हालांकि यह स्पष्ट है कि मुझे विश्वास नहीं है कि Microsoft Html के साथ शुरू होने वाला समाधान काम करेगा। एक स्टैक ओवरफ्लो प्रश्न के परिणामस्वरूप, मैं एक्सेल को एचटीएमएल में परिवर्तित करने पर काम कर रहा हूं, क्योंकि माइक्रोसॉफ्ट के पब्लिशऑब्जेक्ट सबसे ज्यादा (सभी?) स्मार्टफोन के लिए एचटीएमएल को अस्वीकार्य बनाता है। मुझे वर्ड वीबीए के साथ बहुत कम अनुभव है; मैं एक्सेल और आउटलुक VBA के साथ सबसे अच्छा हूं और मैं Acess VBA के साथ अच्छा रहा करता था। ये सभी एक फ़ाइल में एक मैक्रो को अन्य फ़ाइलों तक पहुंचने की अनुमति देते हैं इसलिए मुझे यकीन है कि वर्ड के लिए भी यही सच है।
टोनी डालिमोर

0

ऐसा करने का सबसे सरल तरीका VBA में निम्नलिखित पंक्तियाँ हैं:

Sub testing()
With ActiveDocument.Content.Find
 .ClearFormatting
 .Format = True
 .Font.Superscript = True
 .Execute Forward:=True
End With

End Sub

इसमें सभी सुपरस्क्रिप्ट किए गए टेक्स्ट मिल जाएंगे। यदि आप इसके साथ कुछ करना चाहते हैं, तो इसे विधि में डालें। उदाहरण के लिए, सुपरस्क्रिप्ट में "सुपर" शब्द को खोजने के लिए, और इसे "सुपर फाउंड" उपयोग में बदल दें:

Sub testing()

With ActiveDocument.Content.Find
 .ClearFormatting
 .Format = True
 .Font.Superscript = True
 .Execute Forward:=True, Replace:=wdReplaceAll, _
 FindText:="super", ReplaceWith:="super found"
End With

End Sub
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.