ওয়ার্ড ডকুমেন্টে পাওয়া সাবস্ক্রিপ্ট, সুপারস্ক্রিপ্ট এবং সমীকরণের মাধ্যমে প্রোগ্রামিয়ালি কীভাবে পুনরাবৃত্তি করা যায়


12

আমার কাছে কয়েকটি ওয়ার্ড ডকুমেন্ট রয়েছে, প্রতিটিটিতে কয়েকশ পৃষ্ঠার বৈজ্ঞানিক ডেটা রয়েছে যার মধ্যে রয়েছে:

  • রাসায়নিক সূত্র (সমস্ত সঠিক সাবস্ক্রিপ্ট এবং সুপারস্ক্রিপ্ট সহ H2SO4)
  • বৈজ্ঞানিক সংখ্যা (এক্সপ্লোর্টস সুপারস্ক্রিপ্ট ব্যবহার করে ফর্ম্যাট করা)
  • প্রচুর গাণিতিক সমীকরণ। শব্দে গাণিতিক সমীকরণ সম্পাদক ব্যবহার করে রচনা।

সমস্যাটি হচ্ছে, ওয়ার্ডে এই ডেটা সংরক্ষণ করা আমাদের পক্ষে কার্যকর নয়। সুতরাং আমরা এই সমস্ত তথ্য একটি ডাটাবেসে (মাইএসকিউএল) সংরক্ষণ করতে চাই। আমরা ফর্ম্যাটটি LaTex এ রূপান্তর করতে চাই।

ভিবিএ ব্যবহার করে কোনও ওয়ার্ড ডকুমেন্টের মধ্যে সমস্ত সাবস্ক্রিপ্ট, সুপারস্ক্রিপ্ট এবং সমীকরণের মাধ্যমে পুনরাবৃত্তি করার কোনও উপায় আছে কি?


আপনি কি ডকুমেন্টটি নিজে থেকেই এই এক্সএমএল ডেটা বের করার বিষয়ে চিন্তা করেছেন? সমস্ত মাইক্রোসফ্ট ডকুমেন্টস 2007+ (.docx) মূলত এক্সএমএল ফাইলগুলি সংকুচিত করা হয়। আপনি যারা এক্সএমএল পার্সার ব্যবহার করছেন তাদের পুনরুদ্ধার করতে পারেন।
জেমস মের্টজ

একটি মন্তব্য হিসাবে পোস্ট করা খুব দীর্ঘ ছিল, তাই আমি একটি উত্তর হিসাবে যুক্ত।
জেমস মের্টজ

উত্তর:


12

হ্যা এখানে. ওয়ার্ড ফাইলগুলি বেশ ভাল পরিচালনা করে এমনভাবে আমি পাওয়ারশেল ব্যবহার করে সাজিস্ট করব। আমি মনে করি আমি সবচেয়ে সহজ উপায় হব।

এখানে PowerShell আরও বনাম ওয়ার্ড অটোমেশন: 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 ফাইল সংরক্ষণ করবে। সুতরাং আমার একটি ডক ফাইল রয়েছে যাতে আমার সাবস্ক্রিপ্ট সহ আপনার 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>

আপনি দেখতে পাচ্ছেন যে সাবস্ক্রিপ্টগুলির নিজস্ব ট্যাগ এইচটিএমএলতে রয়েছে তাই কেবলমাত্র বাকী বা সি ++ এ ফাইলটি পার্স করা থেকে শরীর থেকে / দেহে কেটে ফেলতে হবে, ল্যাটেক্সে পরিবর্তন করতে হবে এবং তারপরে বাকী এইচটিএমএল ট্যাগগুলি সরিয়ে ফেলতে হবে।

Http://blogs.technet.com/b/bshukla/archive/2011/09/27/3347395.aspx থেকে কোড


সুতরাং আমি এইচটিএমএল সাবস্ক্রিপ্ট সন্ধান করতে এবং এটিকে ল্যাটেক্স সাবস্ক্রিপ্টের সাথে প্রতিস্থাপন করতে সি ++ এ একটি পার্সার তৈরি করেছি।

কোড:

#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>

<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

আপনি 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 দ্বারা অনুসরণ করা থেকে আলাদা পদ্ধতির দিকে তাকিয়ে আছি।

এইচটিএমএল হিসাবে একটি পরীক্ষার ওয়ার্ড ডকুমেন্ট সংরক্ষণের আমার প্রচেষ্টা সফল হয়নি। আমি অতীতে খুঁজে পেয়েছি যে অফিসে উত্পাদিত এইচটিএমএল এতটা ভরা হয়ে গেছে যে আপনি যে বিটগুলি চান তা বাছাই করা অসম্ভবের কাছাকাছি। আমি বিষয়টি এখানে দেখতে পেয়েছি। সমীকরণ নিয়ে আমারও সমস্যা ছিল। শব্দ চিত্র হিসাবে সমীকরণ সংরক্ষণ করে। প্রতিটি সমীকরণের জন্য দুটি চিত্র থাকবে যার একটি ডাব্লুএমজেডের এক্সটেনশন এবং একটি জিআইএফ-এর এক্সটেনশন সহ থাকবে। আপনি যদি গুগল ক্রোমের সাথে এইচটিএমএল ফাইলটি প্রদর্শন করেন তবে সমীকরণগুলি ঠিক আছে তবে অসাধারণ নয়; স্বচ্ছ চিত্রগুলি পরিচালনা করতে পারে এমন কোনও চিত্র প্রদর্শন / সম্পাদনা সরঞ্জামের সাথে প্রদর্শিত হলে উপস্থিতি জিআইএফ ফাইলটির সাথে মেলে। আপনি যদি ইন্টারনেট এক্সপ্লোরার সহ এইচটিএমএল ফাইলটি প্রদর্শন করেন তবে সমীকরণগুলি নিখুঁত দেখাচ্ছে।

অতিরিক্ত তথ্য

আমার এই উত্তরটি মূল উত্তরে অন্তর্ভুক্ত করা উচিত ছিল।

আমি একটি ছোট ওয়ার্ড ডকুমেন্ট তৈরি করেছি যা আমি এইচটিএমএল হিসাবে সংরক্ষণ করেছি। নীচের চিত্রের তিনটি প্যানেল মূল ওয়ার্ড ডকুমেন্ট, মাইক্রোসফ্ট ইন্টারনেট এক্সপ্লোরার দ্বারা প্রদর্শিত এইচটিএমএল নথি এবং গুগল ক্রোম দ্বারা প্রদর্শিত এইচটিএমএল নথি প্রদর্শন করে।

মূল শব্দ, আইটি দ্বারা প্রদর্শিত এইচটিএমএল এবং ক্রোম দ্বারা প্রদর্শিত এইচটিএমএল

যেমনটি আগেই ব্যাখ্যা করা হয়েছে যে আইআই এবং ক্রোম চিত্রগুলির মধ্যে পার্থক্য হল সমীকরণগুলি দুবার, একবার ডাব্লুএমজেড ফর্ম্যাটে এবং একবার জিআইএফ ফর্ম্যাটে সংরক্ষণের ফলাফল। এইচটিএমএল এখানে দেখানোর জন্য খুব বড়।

ম্যাক্রোর তৈরি এইচটিএমএল হ'ল:

<!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>

যা প্রদর্শিত হয়:

আইটি দ্বারা প্রদর্শিত ম্যাক্রো দ্বারা তৈরি এইচটিএমএল

ফ্রি ম্যাথটাইপ সফটওয়্যার ডেভলপমেন্ট কিটে দৃশ্যত লাটেক্সে রূপান্তরিত রুটিন অন্তর্ভুক্ত করার পরে আমি সমীকরণগুলিকে রূপান্তর করার চেষ্টা করিনি have

কোডটি বেশ বেসিক তাই অনেক মন্তব্য নয়। কিছু অস্পষ্ট কিনা জিজ্ঞাসা করুন। দ্রষ্টব্য: এটি মূল কোডটির একটি উন্নত সংস্করণ।

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। ধন্যবাদ. আমি মনে করি আপনার সমাধানটি ইমপ্রেশন, যদিও এটি সম্ভবত পরিষ্কার যে মাইক্রোসফ্ট এইচটিএমএল দিয়ে শুরু হওয়া কোনও সমাধান কাজ করবে তা আমি বিশ্বাস করি না। স্ট্যাক ওভারফ্লো প্রশ্নটির ফলস্বরূপ, আমি এক্সেলকে এইচটিএমএল রূপান্তর করতে কাজ করছি কারণ মাইক্রোসফ্টের পাবলিকোবজেক্টস এইচটিএমএলকে বেশিরভাগ (সমস্ত?) স্মার্টফোনে গ্রহণযোগ্য নয় creates ওয়ার্ড ভিবিএ নিয়ে আমার খুব কম অভিজ্ঞতা আছে; আমি এক্সেল এবং আউটলুক ভিবিএর সাথে সেরা এবং আমি এসিসি ভিবিএর সাথে ভাল ছিলাম। এগুলি সমস্ত এক ফাইলের ম্যাক্রোকে অন্য ফাইলগুলিতে অ্যাক্সেস করার অনুমতি দেয় তাই আমি নিশ্চিত যে ওয়ার্ডের ক্ষেত্রেও এটি একই।
টনি ডালিমোর

0

এটি করার সহজতম উপায় হ'ল ভিবিএতে কেবল নিম্নলিখিত লাইনগুলি:

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

End Sub

এটি সমস্ত সুপারস্ক্রিপ্টযুক্ত পাঠ্যটি খুঁজে পাবে। আপনি যদি এটির সাথে কিছু করতে চান তবে কেবল এটি পদ্ধতিতে sertোকান। উদাহরণস্বরূপ, একটি সুপারস্ক্রিপ্টে "সুপার" শব্দটি খুঁজে পেতে এবং এটিকে "সুপার পাওয়া" ব্যবহারে রূপান্তর করতে:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.