converter.vue 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308
  1. <template>
  2. <div class="page-converter">
  3. <div class="date-tips flex content-center justify-center py-6px">
  4. <img src="http://cn-file.17pdf.com/website/common/ic_notice.svg" class="align-middle">
  5. <div class="text-container">
  6. <span class="text">
  7. 转档后的文件支持在云端保留24小时<span v-if="userInfo.name">,<span v-if="userInfo?.subscriberType === 1">会员尊享5G容量,</span>请在24小时内下载文件至本地永久保存</span>
  8. </span>
  9. <span v-if="userInfo?.subscriberType === 1" class="vip tip">
  10. <img src="http://cn-file.17pdf.com/website/common/ic_info.svg" alt="">
  11. <div class="tip-text">
  12. 若已有文件大小超出5G,将按转档时间计算(从最近一次转档往过去推算),即保留最近的5G容量文件,超出部分文件将不再保留
  13. </div>
  14. </span>
  15. </div>
  16. </div>
  17. <h1 class="text-48px text-opacity-100 font-500 text-[#3333] mt-48px mb-10px text-center">文件转换器</h1>
  18. <h2 class="text-20px text-center text-[#666] mt-20px font-normal">PDF文件格式转换器,一键转档,支持批量转换,精准快速。</h2>
  19. <div class="text-center mb-80px">
  20. <a
  21. class="mt-20px text-[#4D4D4D] text-16px font-600 inline-flex items-center leading-22px hover:text-$btn-color-primary hover:underline"
  22. href="https://www.compdf.com/pdf-conversion-sdk?utm_source=anroidapp&utm_medium=17pdfweb&utm_campaign=pdfsdk" target="_blank">由 ComPDFKit Conversion SDK 提供技术支持
  23. <svg class="ml-8px" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  24. <path d="M6 12.9567L10.714 8.24261L6 3.52856" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
  25. </svg>
  26. </a>
  27. </div>
  28. <div class="transfer-container-wrap">
  29. <div class="index-converter w-[80%] h-700px relative top-0 left-[50%] -ml-[40%]">
  30. <div class="transfer-container absolute w-full h-auto my-0 -mx-15px bg-white pb-60px">
  31. <button type="button" class="close hidden" data-dismiss="modal" aria-label="Close">
  32. <span aria-hidden="true">×</span>
  33. </button>
  34. <div class="recharge py-0 px-[10%] h-48px mx-0 mt-24px mb-14px absolute right-0 -top-70px z-2">
  35. <span @click="handlSubmit($event, 'buy')" class="recharge-btn float-right bg-white border border-[#ff4f4f] boder-solid text-16px py-7px px-18px rounded-4px mt-4px cursor-pointer hover:bg-[#ff4f4f]">
  36. <a class="text-[#ff4f4f] no-underline leading-normal">充值</a>
  37. </span>
  38. <div class="need-volume float-right right-48px text-16px text-[#666] leading-48px mr-20px">
  39. 所需券:
  40. <span class="text-[#0dd299] text-16px" :class="{'text-red-500': requiredCoupon > userInfo?.points}">
  41. {{ requiredCoupon }}券
  42. </span>
  43. / 剩余券:
  44. <span class="text-[#0dd299] text-16px">
  45. {{ Object.keys(this.userInfo).length === 0 ? 0 : userInfo.points }}券
  46. </span>
  47. </div>
  48. </div>
  49. <div class="transfer-panel">
  50. <div>
  51. <form enctype="multipart/form-data">
  52. <input type="hidden" name="folder" value="converter/input"/>
  53. <!-- 转档框 -->
  54. <div class="file-input theme-explorer file-input-ajax-new h-380px mt-17px py-0 px-[10%]">
  55. <div class="file-preview rounded-5px w-[100%] h-[100%]">
  56. <div ref="drag" @drop="handleEvent" @dragleave="handleEvent" @dragenter="handleEvent" @dragover="handleEvent"
  57. class="file-drop-zone border border-dashed border-[#d1d1d1] rounded-4px h-[100%] text-center align-middle overflow-y-auto">
  58. <div v-show="fileList.length <= 0" class="file-drop-zone-title text-[#999] text-16px leading-[1.428571429] pt-222px cursor-default">
  59. <div></div>
  60. 点击从电脑上传文件或把文件拖到这里
  61. <p class="text-14px leading-[1.428571429]">(支持PDF to Word、PPT、Excel、TXT、JPG/PNG无限次数转换)</p>
  62. </div>
  63. <table id="table-fileinput" class="table table-hover w-[100%] max-w-[100%]">
  64. <thead v-show="fileList.length > 0">
  65. <tr class="h-40px bg-[#eee]">
  66. <th class="!w-[5.5%]"></th>
  67. <th class="!text-left w-[40.5%]">文档名</th>
  68. <th class="!w-[13%]">大小</th>
  69. <th class="!w-[13%]">所需券</th>
  70. <th class="!w-[9.5%]">转为</th>
  71. <th class="!w-[13%]">状态</th>
  72. <th class="!w-[4.5%]"></th>
  73. </tr>
  74. </thead>
  75. <tbody v-show="fileList.length > 0" class="file-preview-thumbnails cursor-default">
  76. <tr v-for="(item, index) in fileList" id="preview-1668340925733-0" :key="index" class="file-preview-frame explorer-frame kv-preview-thumb w-100px h-38px hover:bg-[#f5f5f5]" data-fileindex="0" data-template="pdf" :title="item.name">
  77. <td class="file-details-cell">{{ index+1 }}</td>
  78. <td class="file-details-cell !text-left">
  79. <div class="explorer-caption max-w-260px truncate block text-[#777]" :title="item.name">{{ item.name }}</div>
  80. </td>
  81. <td class="file-details-cell text-[#999]">{{ getfilesize(item.size) }}</td>
  82. <td class="file-details-cell points">{{ userInfo?.subscriberType === 1 ? 0 : item.price }}</td>
  83. <td class="file-details-cell select w-106px">
  84. <select v-show="item.status !== 6" v-model="item.output" class="transfer-select appearance-none min-w-90px" @change="changeOutput(item, index)" :disabled =" !changeFileFlag">
  85. <option value="docx" class="text-center">DOCX</option>
  86. <option value="pptx" class="text-center">PPTX</option>
  87. <option value="xlsx" class="text-center">XLSX</option>
  88. <option value="txt" class="text-center">TXT</option>
  89. <option value="jpg" class="text-center">JPG</option>
  90. <option value="png" class="text-center">PNG</option>
  91. </select>
  92. <span v-show="item.status == 6">{{ item.output.toUpperCase() }}</span>
  93. </td>
  94. <td class="file-details-cell state text-14px text-[#878787]" v-html="fileStatus(item, index)"></td>
  95. <!-- <td v-else class="file-details-cell state text-14px text-red-500">转换失败<img src="/converter/menu_ic_pdfconvert.png" @click="rechangeFile" /></td> -->
  96. <td class="file-actions-cell w-50px p-0">
  97. <div class="file-actions text-center">
  98. <div class="file-footer-buttons" @click="deleteFile(index,item)" v-if="changeFileFlag">
  99. <button type="button" class="kv-file-remove btn btn-xs btn-default bg-inherit !border-none pr-7px py-1px pl-5px text-12px leading-normal rounded-3px" title="删除文件"><i class="pdf-removeicon"></i></button>
  100. </div>
  101. </div>
  102. </td>
  103. </tr>
  104. </tbody>
  105. </table>
  106. <div class="clearfix"></div>
  107. <div class="file-preview-status text-success text-center text-[#3c763d]"></div>
  108. </div>
  109. </div>
  110. <div class="kv-upload-progress hide">
  111. <div class="progress overflow-hidden h-20px mb-20px bg-[#f5f5f5] rounded-4px ring-inset-2 ring-[rgba(0,0,0/10%)]">
  112. <div class="progress-bar progress-bar-success progress-bar-striped active w-0 bg-[#5cb85c]" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
  113. 0%
  114. </div>
  115. </div>
  116. </div>
  117. <div class="input-group file-caption-main w-[100%] -top-450px relative table border-separate">
  118. <div v-show="changeFileFlag" class="input-group-btn relative text-0px whitespace-nowrap !flex">
  119. <div tabindex="500" class="btn btn-file" :class="{'btn-file-left' : fileList.length > 0}" v-if="changeFileFlag">
  120. <div class="add-file" :class="{'add-file-left':(fileList.length > 0)}">
  121. {{ fileList.length > 0 ? '添加文件' : '' }}
  122. </div>
  123. <!-- 未登录时 -->
  124. <input id="fileinput-explorer" ref="file" name="file" accept=".pdf" title="上传文件" type="file" multiple=""
  125. class="absolute top-0 right-0 p-0 m-0 min-w-[100%] h-[100%] w-90px text-right opacity-0 bg-none bg-repeat bg-scroll block outline-none border-0 cursor-not-allowed"
  126. :disabled='true' v-if = " showInputDisable "/>
  127. <!-- 登录 -->
  128. <input id="fileinput-explorer" ref="file" name="file" accept=".pdf" title="上传文件" type="file" multiple=""
  129. class="absolute top-0 right-0 p-0 m-0 min-w-[100%] h-[100%] w-90px text-right opacity-0 bg-none bg-repeat bg-scroll block outline-none border-0 cursor-pointer"
  130. @change="addFile($event)" @click="handlSubmit($event, '')" @drop="handleEvent" @dragleave="handleEvent" @dragenter="handleEvent" @dragover="handleEvent" v-if = " !showInputDisable "/>
  131. </div>
  132. <div v-show="fileList.length > 0 && changeFileFlag" class="inline-block ml-30px bg-white border border-[#ff4f4f] boder-solid text-16px py-7px px-18px rounded-4px mt-4px cursor-pointer text-[#ff4f4f] leading-normal hover:bg-[#ff4f4f] hover:text-white"
  133. @click="deleteAllFile">清空</div>
  134. </div>
  135. </div>
  136. </div>
  137. </form>
  138. </div>
  139. <div class="transfer-btn mt-30px h-64px text-center">
  140. <div class="cursor-not-allowed inline-block">
  141. <span :class="{'disabledBtn' : !checkbox || !changeFileFlag||fileList.length === 0 }" class="btn transfer-start-btn bg-[#ff524f] text-20px py-0 px-150px rounded-4px h-60px w-386px text-white hover:bg-[#f34545]"
  142. @click="handlSubmit($event, 'change')">
  143. <a class="text-white leading-60px">{{ !changeFileFlag ? '转换中...' : '开始转换' }}</a>
  144. <span v-show="!changeFileFlag" class="loading"></span>
  145. </span>
  146. </div>
  147. <span class="hide btn btn-down small w-240px h-60px bg-[#0dd299] rounded-4px text-20px ml-15px hover:bg-[#0fc993]"><a class="leading-60px text-white">下载全部</a></span>
  148. </div>
  149. </div>
  150. <div class="transfer-remember mt-23px text-center">
  151. <div class="checkbox checkbox-danger relative block mt-10px mb-10px">
  152. <label for="remember" class="text-12px font-normal text-[#999] min-h-20px pl-20px mb-0 inline-block max-w-[100%]">
  153. <input v-model="checkbox" type="checkbox" name="remember" class="remember_pass cursor-pointer" :disabled="!changeFileFlag" :class="{'cursor-not-allowed' : !changeFileFlag }" />确保上传的文档不涉及版权问题及违法内容
  154. </label>
  155. </div>
  156. </div>
  157. </div>
  158. <div class="modal verifi-modal top-[20%!important]" d="verifiPayModal" tabindex="-1" role="dialog" aria-labelledby="verifiPayModal">
  159. <div class="modal-dialog verifi-dialog w-480px h-426px my-50px" role="document">
  160. <div class="modal-content relative bg-white rounded-6px border border-solid border-[rgba(0,0,0,0.2)] outline-0 bg-clip-padding ring-[rgba(0,0,0/50%)] ring-offseet-3px ring-9px md:ring-offset-5 md:ring-15px">
  161. <div class="">
  162. <button id="verifi-close" type="button" class="close pompt_close py-5px px-10px outline-none" data-dismiss="modal" aria-label="Close">
  163. <span aria-hidden="true">×</span>
  164. </button>
  165. </div>
  166. <div class="verifi-content text-center pt-60px px-0 pb-35px">
  167. <img src="http://cn-file.17pdf.com/website/converter/pic_trans_diomands.png"/>
  168. <p>该功能为付费套餐专属</p>
  169. <p>订阅解锁更多特权</p>
  170. <a href="javascript:;" class="now_pricing" value="0"
  171. >立即订阅</a
  172. >
  173. </div>
  174. </div>
  175. </div>
  176. </div>
  177. </div>
  178. <div class="file_num w-[100%] h-120px text-center text-white leading-120px text-30px mb-76px">
  179. 17PDF Reader,当前已转换了<span class="text-32px"> {{ fileAllNum }} </span> 个文件
  180. </div>
  181. <div id="more_type" class="pdf_converter clear w-[80%] my-0 mx-auto">
  182. <div class="package_type">
  183. <h3 class="text-24px text-[#333] font-normal mx-0 mt-0 mb-49px h-30px leading-30px">会员专享格式</h3>
  184. <ul class="flex justify-center w-[100%] min-w-340px p-0 mt-0 mb-10">
  185. <li>
  186. <a href=' /converter?type=docx'>
  187. <img src="/converter/ic_pdf_word.png" />
  188. <span>PDF To Word</span>
  189. </a>
  190. </li>
  191. <li>
  192. <a href=' /converter?type=pptx'>
  193. <img src="/converter/ic_pdf_ppt.png"/>
  194. <span>PDF to PowerPoint</span>
  195. </a>
  196. </li>
  197. <li>
  198. <a href=' /converter?type=xlsx'>
  199. <img src="/converter/ic_pdf_execl.png"/>
  200. <span>PDF to EXCEL</span>
  201. </a>
  202. </li>
  203. <li>
  204. <a href=' /converter?type=txt'>
  205. <img src="/converter/ic_pdf_txt.png" />
  206. <span>PDF to TXT</span>
  207. </a>
  208. </li>
  209. <li>
  210. <a href=' /converter?type=jpg'>
  211. <img src="/converter/imagePDFtoJPG.png" />
  212. <span>PDF to JPG</span>
  213. </a>
  214. </li>
  215. <li>
  216. <a href=' /converter?type=png'>
  217. <img src="/converter/pngPDFtoPNG.png" />
  218. <span>PDF to PNG</span>
  219. </a>
  220. </li>
  221. </ul>
  222. </div>
  223. </div>
  224. <div class="about_converter w-[100%] bg-[#fafafa] py-60px px-[10%] mt-102px">
  225. <h3 class="name text-24px text-[#333] font-normal mx-0 mt-0 mb-49px h-30px leading-30px">关于转档</h3>
  226. <ul class="clear p-0">
  227. <li>
  228. <img src="http://cn-file.17pdf.com/website/converter/ic_way.png" />
  229. <div class="content">
  230. <h3>如何转档</h3>
  231. <p>
  232. 进入“文件转换器”区域。点击下方“添加文件”选择添加本地目标文件,然后在“转为”栏选择转换目标格式,最后点击“开始转换”即可。
  233. </p>
  234. </div>
  235. </li>
  236. <li>
  237. <img
  238. src="http://cn-file.17pdf.com/website/converter/ic_quality.png"
  239. />
  240. <div class="content">
  241. <h3>领先品质</h3>
  242. <p>
  243. 行业领先的转换品质,经过转换的文件版面清晰、保持格式的一致,支持一键转档,批量转换,精准快速的文件格式转换,稳定的转换品质,是您处理转格式转换的首选。
  244. </p>
  245. </div>
  246. </li>
  247. <li>
  248. <img src="http://cn-file.17pdf.com/website/converter/ic_safe.png" />
  249. <div class="content">
  250. <h3>文件安全</h3>
  251. <p>
  252. 我们尊重每位用户的隐私信息和文件安全。转档后的文件仅在云端保留24小时,让您免去后顾之忧。
  253. </p>
  254. </div>
  255. </li>
  256. <li>
  257. <img src="http://cn-file.17pdf.com/website/converter/ic_more.png" />
  258. <div class="content">
  259. <h3>多平台支持</h3>
  260. <p>
  261. 文件格式转换器可以在所有计算机(Mac、Windows及Linux)上使用,也可下载App
  262. 17PDF Reader在移动端使用,让您在手机上也能轻松转档文件。
  263. </p>
  264. </div>
  265. </li>
  266. </ul>
  267. </div>
  268. <div class="converter_question px-[10%] pt-76px pb-60px text-center">
  269. <h3 class="name text-24px text-[#333] font-normal m-0 h-30px leading-30px text-left">常见问题</h3>
  270. <table class="w-[100%] p-0 bg-transparent">
  271. <tbody>
  272. <tr>
  273. <td>
  274. <h3>1. 支持哪些格式转换?</h3>
  275. <p>
  276. <span></span>支持PDF to
  277. Word、PPT、Excel、TXT、JPG/PNG无限次数转换
  278. </p>
  279. </td>
  280. <td>
  281. <h3>2. 为什么图片格式的文件转档效果不好?</h3>
  282. <p>
  283. 如原文件为图片格式或者通过扫描文档保存为PDF文件的,转档后的文件可能无法选取文字进行高亮等编辑。
  284. </p>
  285. </td>
  286. </tr>
  287. <tr>
  288. <td>
  289. <h3>3. 文件转档后出现乱码?</h3>
  290. <p>
  291. 如果是原文件就有乱码问题,先处理好文件再提交转档;如果原文件正常而转档后目标文件乱码,请联系我们处理。
  292. </p>
  293. </td>
  294. </tr>
  295. </tbody>
  296. </table>
  297. <a class="more w-auto h-30px leading-30px text-[#666] inline-block text-center mx-auto mt-48px mb-0 link:no-underline hover:(!border-[#ff4f4f] text-[#ff4f4f])" href="/question#convert">更多问题请查看帮助</a>
  298. </div>
  299. <div class="download_code fixed right-14px bottom-50px bg-white w-134px py-12px px-0 rounded-6px text-center ">
  300. <span class="large text-16px inline-block w-[100%] my-6px mx-0">下载APP</span>
  301. <img src="http://cn-file.17pdf.com/website/download/android_code.png" class="w-110px border-0 align-middle inline-block" />
  302. <span class="inline-block w-[100%] text-14px my-6px mx-0">使用更便捷</span>
  303. </div>
  304. </div>
  305. <client-only>
  306. <el-dialog :visible.sync="visiable" :close-on-click-modal="true" :close-on-press-escape="false" width="480px" append-to-body center top="25vh">
  307. <div class="changepwd-tittle">
  308. <p class="text-20px text-center text-$btn-color-primary">提示</p>
  309. </div>
  310. <div class="text-16px text-[#707070] text-center my-30px">
  311. 您还未登录或注册,请先
  312. <span class="text-$btn-color-primary cursor-pointer" @click="login">登录</span>
  313. <span class="text-$btn-color-primary cursor-pointer" @click="register">注册</span>
  314. </div>
  315. </el-dialog>
  316. <el-dialog :visible.sync="noMia" width="480px" append-to-body center top = "25vh" >
  317. <div class="modal-content">
  318. <div class="less-tittle w-full h-64px leading-64px text-[20px] text-[#ff4f4f] text-center mt-[-50px] mb-30px">劵不足</div>
  319. <div class="less-content text-center mb-30px">
  320. <img src="~/assets/images/converter/pic.svg" class="mb-26px mx-auto">
  321. <p class="text-[14px] text-[#00000099]">您的券不足了,请尽快充值</p>
  322. </div>
  323. <div class="flex justify-center">
  324. <button class="block w-128px h-40px text-[16px] text-[#FF4F4F] leading-20px ml-0px mt-10px text-center border border-[#FF4F4F] border-solid rounded-4px" @click="changeNoMia">返回</button>
  325. <button class="block w-128px h-40px text-[16px] text-[#fff] bg-[#FF4F4F] leading-20px ml-50px mt-10px text-center border border-[#FF4F4F] border-solid rounded-4px" @click="handlSubmit($event, 'buy')">立即充值</button>
  326. </div>
  327. </div>
  328. </el-dialog>
  329. </client-only>
  330. </div>
  331. </template>
  332. <script>
  333. import { mapState } from 'vuex'
  334. export default {
  335. data() {
  336. return {
  337. fileList: [],
  338. uniqFileArr: [],
  339. checkbox: true,
  340. // 转档中,默认没在
  341. changeFileFlag: true,
  342. uploadNum: 0,
  343. uploadErrNum: 0,
  344. uploadSuccessNum: 0,
  345. getFileStatusTimer: null,
  346. changeSucesssNumTotal: 0,
  347. changeSucesssFileList: [],
  348. visiable: false,
  349. noMia:false,
  350. showInputDisable:false,
  351. fileAllNum: ""
  352. };
  353. },
  354. middleware: "user",
  355. head() {
  356. return {
  357. title: "PDF转换器免费在线转档",
  358. meta: [
  359. {
  360. hid: "description",
  361. content: "17PDF Reader免费提供在线PDF格式转换文件转档服务,支持PDF转word,PDF转doc,PDF转PPT,PDF转png,PDF转html,PDF转epub,PDF转xls,psd转ai等。轻松拖曳,一键转档,批量转换,支持多种常用格式相互转档。先进的转换引擎,极速转换,精准度高达99.99%。",
  362. },
  363. {
  364. name: "keywords",
  365. content: "格式转换,文件转档,pdf convert,converter, word to pdf"
  366. }
  367. ]
  368. };
  369. },
  370. computed: {
  371. ...mapState([
  372. 'token',
  373. "userInfo"
  374. ]),
  375. // 所需券数
  376. requiredCoupon() {
  377. let total = 0;
  378. for (let i = 0; i < this.fileList.length; i++) {
  379. total += this.fileList[i].price;
  380. }
  381. for (const file of this.fileList) {
  382. if (file.status === 6) {
  383. total -= file.price;
  384. }
  385. }
  386. if (this.userInfo && this.userInfo.subscriberType === 1) {
  387. total = 0;
  388. }
  389. return total;
  390. }
  391. },
  392. mounted() {
  393. if (localStorage.getItem("file") !== null) {
  394. this.fileList = JSON.parse(localStorage.getItem("file"));
  395. this.changeSucesssFileList = JSON.parse(localStorage.getItem("file"));
  396. }
  397. this.getFileAllNum()
  398. },
  399. methods: {
  400. getFileAllNum(){
  401. this.$axios.get("/missionFile/getTotalConvertFile").then((res)=>{
  402. if(res.code === 200) {
  403. var num = res.data.toString()
  404. let result = '';
  405. while (num.length > 3) {
  406. //此处用数组的slice方法,如果是负数,那么它规定从数组尾部开始算起的位置
  407. result = ',' + num.slice(-3) + result;
  408. num = num.slice(0, num.length - 3);
  409. }
  410. this.fileAllNum = result.slice(1,result.length)
  411. if (num){
  412. result = num + result
  413. this.fileAllNum = result.slice(0,result.length)
  414. }
  415. }
  416. })
  417. },
  418. getUserInfo() {
  419. this.$axios.get('members/getMemberInfo').then((res)=> {
  420. if(res.code === 200) {
  421. this.$store.commit('setUser',res.result.memberInfo)
  422. }
  423. })
  424. },
  425. handlSubmit(event, type) {
  426. if (!this.$store.state.token) {
  427. event.preventDefault();
  428. this.visiable = true;
  429. this.showInputDisable = true
  430. return;
  431. }
  432. if (type === "buy") {
  433. this.noMia = false
  434. this.handlerBuy("ticket");
  435. }
  436. else if (type === "change") {
  437. this.createFileMission();
  438. }
  439. // this.$store.commit('OPEN_LOGIN', true)
  440. // this.$store.commit('SET_INTERFACE', 'vip')
  441. },
  442. login() {
  443. this.visiable = false;
  444. this.showInputDisable = false;
  445. this.$store.commit("OPEN_LOGIN", true);
  446. this.$store.commit("SET_INTERFACE", "login");
  447. },
  448. register() {
  449. this.visiable = false;
  450. this.showInputDisable = false;
  451. this.$store.commit("OPEN_LOGIN", true);
  452. this.$store.commit("SET_INTERFACE", "register");
  453. },
  454. // 充值弹框
  455. handlerBuy(type) {
  456. this.$store.commit("OPEN_LOGIN", true);
  457. this.$store.commit("SET_INTERFACE", type);
  458. },
  459. //拖拽事件
  460. handleEvent(event) {
  461. // 阻止事件的默认行为
  462. event.preventDefault();
  463. if (event.type === 'drop') {
  464. // 文件进入并松开鼠标,文件边框恢复正常
  465. this.$refs.drag.style.background = '#fff'
  466. this.$refs.drag.style.border = "thin dashed #d1d1d1"
  467. if (!this.$store.state.token) {
  468. event.preventDefault();
  469. this.visiable = true;
  470. return;
  471. }
  472. if( !this.changeFileFlag ){
  473. return;
  474. }
  475. //传递拖拽的文件,限制只能传pdf文件
  476. let dropFile = event.dataTransfer.files
  477. let newArr= [];
  478. for(var item of dropFile){
  479. if(item.type.indexOf('pdf') !== -1){
  480. newArr.push(item);
  481. }
  482. }
  483. dropFile = newArr
  484. this.addFile(dropFile)
  485. } else if (event.type === 'dragleave') {
  486. // 离开时
  487. this.$refs.drag.style.background = '#fff'
  488. this.$refs.drag.style.border = "thin dashed #d1d1d1"
  489. } else {
  490. // 进入时
  491. this.$refs.drag.style.background = '#f0f0f0'
  492. this.$refs.drag.style.border = "3px dashed #d1d1d1"
  493. }
  494. },
  495. // 添加文件
  496. async addFile(event) {
  497. let array = {}
  498. if(event.target){
  499. array = event.target.files
  500. }else{
  501. array = event
  502. }
  503. //获取用户选择要转的格式
  504. const urlObj = new URL(document.URL);
  505. let [a] = urlObj.searchParams.values();
  506. if(a != "docx" && a != "pptx" && a != "xlsx" && a != "txt" && a != "jpg" && a != "png"){
  507. a = "docx"
  508. }
  509. //不是pdf文件不上传
  510. let newArrs= [];
  511. for(var item of array){
  512. if(item.type.indexOf('pdf') !== -1){
  513. newArrs.push(item);
  514. }
  515. }
  516. array = newArrs
  517. const defaultPrice = await this.getFilePrice("pdf", a);
  518. for (let i = 0; i < array.length; i++) {
  519. const id = Date.now() + Math.random().toString(36).slice(-8)
  520. const fileObj = {
  521. name: array[i].name,
  522. size: array[i].size,
  523. price: defaultPrice,
  524. input: "pdf",
  525. output: a,
  526. status: 0,
  527. id: id
  528. };
  529. array[i].output = a
  530. array[i].id = id
  531. this.fileList.push(fileObj);
  532. this.uniqFileArr.push(array[i]);
  533. }
  534. // this.fileList,this.uniqFileArr数组去重
  535. for(var item of this.fileList){
  536. for(var i=0; i<this.fileList.length - 1; i++){
  537. for(var j = i+1; j<this.fileList.length; j++){
  538. //对名字一致但是状态不为下载的展示文件去除
  539. if(this.fileList[i].name == this.fileList[j].name && (this.fileList[i].status !== 6)){
  540. this.fileList.splice(j,1);
  541. // splice删除了一个元素,下标要减一,否则循环会漏掉一个元素(多个相邻的元素 可能会漏掉删除元素)
  542. j--;
  543. }
  544. }
  545. }
  546. }
  547. let newArr= [];
  548. let arrName = [];
  549. for(var item of this.uniqFileArr){
  550. if(arrName.indexOf(item['name']) == -1){
  551. arrName.push(item['name']);
  552. newArr.push(item);
  553. }
  554. }
  555. this.uniqFileArr=newArr
  556. if(event.target){
  557. event.target.value=''
  558. }
  559. },
  560. // 查询文件所需券数
  561. async getFilePrice(input, output) {
  562. let price = 0;
  563. await this.$axios.get(`/convertType/getConvertTypeList?input=${input}&output=${output}`).then((res) => {
  564. if (res.code === 200) {
  565. price = res.result[0].price;
  566. }
  567. });
  568. return price;
  569. },
  570. // 改变要转换的格式
  571. async changeOutput(item, index) {
  572. const price = await this.getFilePrice(item.input, item.output);
  573. this.$set(this.fileList[index], "price", price);
  574. this.$set(this.fileList[index], "output", item.output);
  575. for(let i=0;i<this.uniqFileArr.length;i++){
  576. if(item.id === this.uniqFileArr[i].id){
  577. this.$set(this.uniqFileArr[i], "output", item.output);
  578. }
  579. }
  580. },
  581. // 计算文件大小函数(保留两位小数),Size为字节大小
  582. getfilesize(size) {
  583. if (!size)
  584. return "";
  585. const num = 1024; // byte
  586. if (size < num) {
  587. return size + "B";
  588. }
  589. if (size < Math.pow(num, 2)) {
  590. return (size / num).toFixed(2) + "KB";
  591. }
  592. if (size < Math.pow(num, 3)) {
  593. return (size / Math.pow(num, 2)).toFixed(2) + "MB";
  594. }
  595. if (size < Math.pow(num, 4)) {
  596. return (size / Math.pow(num, 3)).toFixed(2) + "GB";
  597. }
  598. else {
  599. return (size / Math.pow(num, 4)).toFixed(2) + "TB";
  600. }
  601. },
  602. // 删除文件
  603. deleteFile(index, item) {
  604. for(let i=0;i<this.uniqFileArr.length;i++){
  605. if(item.id === this.uniqFileArr[i].id){
  606. this.uniqFileArr.splice(i,1)
  607. }
  608. }
  609. this.fileList.splice(index, 1);
  610. this.changeSucesssFileList = [];
  611. localStorage.removeItem("file");
  612. this.fileList.forEach(item => {
  613. if (item.status === 6) {
  614. this.changeSucesssFileList.push(item);
  615. }
  616. });
  617. localStorage.setItem("file", JSON.stringify(this.changeSucesssFileList));
  618. },
  619. // 清空
  620. deleteAllFile() {
  621. this.fileList = [];
  622. this.uniqFileArr = [];
  623. this.changeFileStatus("all", 5);
  624. this.changeSucesssFileList = [];
  625. localStorage.removeItem("file");
  626. this.showFileBig = false
  627. },
  628. // 修改文件状态
  629. changeFileStatus(fileName, status,outputType) {
  630. if (fileName === "all") {
  631. this.fileList.forEach(item => {
  632. if (item.status !== 6) {
  633. this.$set(item, "status", status);
  634. }
  635. });
  636. } else {
  637. this.fileList.forEach(item => {
  638. if (item.name === fileName && item.output === outputType && item.status !=6) {
  639. this.$set(item, "status", status);
  640. }
  641. });
  642. }
  643. },
  644. // 文件状态: 0未转换,1上传中,2上传完成,3转换中,4转换成功,5转换失败,6已转档
  645. fileStatus(item, index) {
  646. switch (item.status) {
  647. case 0:
  648. this.$set(this.fileList[index], "status", 0);
  649. return "未转换";
  650. case 1:
  651. this.$set(this.fileList[index], "status", 1);
  652. return "上传中...";
  653. case 2:
  654. this.$set(this.fileList[index], "status", 2);
  655. return "<span style=\"color: #666666\">上传完成</span>";
  656. case 3:
  657. this.$set(this.fileList[index], "status", 3);
  658. return "<span style=\"color: #FEA92D\">转换中</span>";
  659. case 4:
  660. this.$set(this.fileList[index], "status", 4);
  661. return "<span style=\"color: orange\">转换成功</span>";
  662. case 5:
  663. this.$set(this.fileList[index], "status", 5);
  664. return "<span style=\"color: red\">转换失败</span>";
  665. case 6:
  666. //获取输出的目标文件名
  667. // let name = item.name
  668. // let num= name.lastIndexOf(".")
  669. // let output = ""
  670. // if(item.output === "png" || item.output === "jpg"){
  671. // output = "zip"
  672. // }else {
  673. // output = item.output
  674. // }
  675. // const outFilename = name.slice(0,num)+"."+output
  676. this.$set(this.fileList[index], "status", 6);
  677. // return `<a href="${item.path}" download="${outFilename}" style="color: #0dd299">下载</a>`;
  678. return `<a href="${item.path}" style="color: #0dd299">下载</a>`;
  679. }
  680. },
  681. // 转档第一步,根据文件列表创建任务和插入文件信息
  682. createFileMission() {
  683. // if (this.fileList.length === 0) return
  684. const points = this.userInfo.points;
  685. if (this.requiredCoupon > points) {
  686. // alert("券数不足,请充值");
  687. this.noMia = true
  688. return;
  689. }
  690. const filterFileList = this.fileList.filter(function (item) {
  691. return item.status !== 6;
  692. });
  693. let fileArr = [];
  694. for (let i = 0; i < filterFileList.length; i++) {
  695. const file = {};
  696. file.sourceType = 0;
  697. file.size = filterFileList[i].size;
  698. file.input = "pdf";
  699. file.output = filterFileList[i].output;
  700. file.filename = filterFileList[i].name;
  701. fileArr[i] = file;
  702. }
  703. if(fileArr.length === 0){
  704. return;
  705. }
  706. fileArr = JSON.stringify(fileArr);
  707. this.changeFileFlag = false;
  708. this.changeFileStatus("all", 1);
  709. const config = {
  710. method: "post",
  711. url: "/mission/create",
  712. headers: {
  713. "Accept": "*/*",
  714. "Content-Type": "application/json"
  715. },
  716. data: fileArr
  717. };
  718. this.uploadSuccessNum = 0
  719. this.uploadErrNum = 0
  720. this.$axios("/mission/create", config).then((res) => {
  721. if (res.code === 200) {
  722. const missionFiles = res.result.missionFilePoJos;
  723. for (let i = 0; i < missionFiles.length; i++) {
  724. this.changeFileStatus(missionFiles[i].fileName, 1, missionFiles[i].outputType);
  725. this.uploadFile(this.uniqFileArr[i], missionFiles[i].id, res.result.id);
  726. }
  727. }
  728. else {
  729. this.changeFileFlag = true;
  730. this.changeFileStatus("all", 5);
  731. }
  732. });
  733. },
  734. // 转档第二步,上传文件download="${item.name}"
  735. uploadFile(file, id, missionId) {
  736. this.uploadNum = 0;
  737. const formData = new FormData();
  738. formData.append("file", file);
  739. formData.append("missionFileId", id);
  740. const config = {
  741. headers: {
  742. "Content-Type": "multipart/form-data;boundary = " + new Date().getTime()
  743. }
  744. };
  745. this.$axios.post("/missionFile/upload", formData, config).then((res) => {
  746. if (res.code === 200) {
  747. this.changeFileStatus(file.name, 2,file.output);
  748. this.uploadNum++;
  749. this.uploadSuccessNum++;
  750. let uploadAllNum = this.uploadErrNum + this.uploadSuccessNum
  751. if (uploadAllNum === this.uniqFileArr.length) {
  752. this.convertFile(file.name, missionId);
  753. }
  754. // if(uploadAllNum === this.uniqFileArr.length && this.uploadErrNum > 0){
  755. // this.changeFileFlag = true;
  756. // this.changeFileStatus("all", 5);
  757. // }
  758. }
  759. else {
  760. this.uploadErrNum++;
  761. let uploadAllNum = this.uploadErrNum + this.uploadSuccessNum
  762. if(uploadAllNum === this.uniqFileArr.length){
  763. // this.changeFileFlag = true;
  764. // this.changeFileStatus(file.name, 5,file.output);
  765. this.convertFile(file.name, missionId);
  766. }
  767. }
  768. });
  769. },
  770. // 转档第三步,开始转档
  771. convertFile(file, missionId) {
  772. const formData = new FormData();
  773. formData.append("missionId", missionId);
  774. const config = {
  775. headers: {
  776. "Content-Type": "multipart/form-data;boundary = " + new Date().getTime()
  777. }
  778. };
  779. this.$axios.post("/mission/convertFile", formData, config).then((res) => {
  780. if (res.code === 200) {
  781. this.changeFileStatus("all", 3);
  782. this.getFileStatusTimer = window.setInterval(() => {
  783. setTimeout(this.getFileStatus(formData, config), 0);
  784. }, 5000);
  785. }
  786. else {
  787. this.uploadNum = 0;
  788. this.changeFileStatus("all", 5);
  789. this.changeFileFlag = true;
  790. }
  791. });
  792. },
  793. // 转档最后一步,轮询文件状态和下载链接
  794. getFileStatus(formData, config) {
  795. this.$axios.post("/mission/queryFileStatus", formData, config).then((res) => {
  796. if (res.code === 200) {
  797. // 转档文件列表
  798. const getFileList = res.result[0].missionFilePoJos;
  799. // 转档成功与失败的数量
  800. let changeSucesssNum = 0;
  801. let changeErrNum = 0;
  802. for (let i = 0; i < getFileList.length; i++) {
  803. if (getFileList[i].status === 2) {
  804. this.changeFileStatus(getFileList[i].fileName, 4, getFileList[i].targetType);
  805. this.fileList.forEach(item => {
  806. //获取输出的目标文件名
  807. let name = item.name
  808. let num= name.lastIndexOf(".")
  809. let output = ""
  810. if(item.output === "png" || item.output === "jpg"){
  811. output = "zip"
  812. }else {
  813. output = item.output
  814. }
  815. const outFilename = name.slice(0,num)+"."+output
  816. if(item.status !==6){
  817. if (outFilename === getFileList[i].outFilename) {
  818. this.changeFileStatus(getFileList[i].fileName, 6, getFileList[i].targetType);
  819. this.$set(item, "path", getFileList[i].path);
  820. // 对相同文件名与相同转换后文件进行去重
  821. this.changeSucesssFileList.forEach((iten,index)=>{
  822. if(iten.id.indexOf(item.id) !== -1){
  823. this.changeSucesssFileList.splice(index,1)
  824. }
  825. })
  826. this.changeSucesssFileList.push(item);
  827. }
  828. }
  829. });
  830. changeSucesssNum++;
  831. }
  832. else if (getFileList[i].status === 3) {
  833. this.changeFileStatus(getFileList[i].fileName, 5, getFileList[i].targetType);
  834. changeErrNum++;
  835. }
  836. }
  837. let changeAllNum = changeSucesssNum + changeErrNum
  838. if (changeAllNum === getFileList.length) {
  839. clearInterval(this.getFileStatusTimer);
  840. this.getFileStatusTimer = null;
  841. this.changeSucesssNumTotal += changeSucesssNum;
  842. let failedFileList = getFileList.filter((val) => val.status === 3);
  843. let failedFileNameArr = failedFileList.map(val => val.fileName);
  844. let result = [];
  845. for (let i = 0; i < failedFileNameArr.length; i++) {
  846. this.uniqFileArr.forEach(item => {
  847. if (item.name === failedFileNameArr[i]) {
  848. result.unshift(item);
  849. }
  850. });
  851. }
  852. this.uniqFileArr = result;
  853. this.getUserInfo()
  854. this.getFileAllNum()
  855. this.uploadNum = 0;
  856. this.changeFileFlag = true;
  857. }
  858. localStorage.setItem("file", JSON.stringify(this.changeSucesssFileList));
  859. }
  860. else {
  861. this.changeFileStatus("all", 5);
  862. // 多失败就关闭查询
  863. clearInterval(this.getFileStatusTimer);
  864. this.uploadNum = 0;
  865. this.changeFileFlag = true;
  866. }
  867. });
  868. },
  869. //改变劵不足弹出框
  870. changeNoMia(){
  871. this.noMia = false
  872. }
  873. },
  874. watch: {
  875. token(newValue){
  876. if(newValue){
  877. this.showInputDisable = false;
  878. }
  879. }
  880. }
  881. }
  882. </script>
  883. <style lang="scss" scoped>
  884. ::v-deep body {
  885. min-width: 1200px !important;
  886. }
  887. ::v-deep .el-dialog {
  888. border-radius: 10px;
  889. box-shadow: 0 5px 15px rgb(0, 0 ,0 ,.5)
  890. }
  891. .page-converter {
  892. .date-tips {
  893. background: linear-gradient(0deg, #fff2f6, #fff2f6),
  894. linear-gradient(90deg, snow 10.37%, rgba(255, 243, 243, 0) 91.75%),
  895. linear-gradient(90deg, #fff2f6 2.26%, rgba(255, 242, 246, 0.21) 101.41%);
  896. .text-container {
  897. display: flex;
  898. align-items: center;
  899. margin-left: 16px;
  900. img {
  901. margin-left: 8px;
  902. }
  903. }
  904. span {
  905. font-size: 14px;
  906. line-height: 24px;
  907. vertical-align: middle;
  908. }
  909. .text {
  910. display: inline-flex;
  911. align-items: center;
  912. }
  913. .tip {
  914. position: relative;
  915. font-size: 0;
  916. .tip-text {
  917. display: none;
  918. position: absolute;
  919. left: -3px;
  920. width: 258px;
  921. padding: 15px 14px 10px 10px;
  922. background: url('http://cn-file.17pdf.com/website/members/ic_tip.svg')
  923. left top no-repeat;
  924. background-size: auto 100%;
  925. font-size: 12px;
  926. line-height: 18px;
  927. color: #fff;
  928. border-radius: 4px;
  929. }
  930. &:hover .tip-text {
  931. display: block;
  932. }
  933. }
  934. }
  935. .transfer-container {
  936. .hide {
  937. display: none !important;
  938. }
  939. button {
  940. padding-right: 7px;
  941. }
  942. .close {
  943. float: right;
  944. font-size: 21px;
  945. font-weight: bold;
  946. line-height: 1;
  947. color: #000;
  948. text-shadow: 0 1px 0 #fff;
  949. opacity: 0.2;
  950. filter: alpha(opacity=20);
  951. }
  952. button.close {
  953. padding: 0;
  954. cursor: pointer;
  955. background: transparent;
  956. border: 0;
  957. -webkit-appearance: none;
  958. }
  959. button:focus {
  960. outline: none;
  961. }
  962. .close:hover,
  963. .close:focus {
  964. color: #000;
  965. text-decoration: none;
  966. cursor: pointer;
  967. opacity: 0.5;
  968. filter: alpha(opacity=50);
  969. }
  970. .recharge .recharge-btn:hover a {
  971. color: #fff;
  972. }
  973. .transfer-btn .loading {
  974. display: inline-block;
  975. border: 3px solid #fff;
  976. border-bottom: 3px solid #cccccc;
  977. height: 35px;
  978. width: 35px;
  979. border-radius: 50%;
  980. position: relative;
  981. top: 10px;
  982. left: 100px;
  983. -webkit-animation: loading 1s infinite linear;
  984. -moz-animation: loading 1s infinite linear;
  985. -o-animation: loading 1s infinite linear;
  986. animation: loading 1s infinite linear;
  987. }
  988. }
  989. .table>caption+thead>tr:first-child>th, .table>caption+thead>tr:first-child>td, .table>colgroup+thead>tr:first-child>th, .table>colgroup+thead>tr:first-child>td, .table>thead:first-child>tr:first-child>th, .table>thead:first-child>tr:first-child>td {
  990. border-top: 0;
  991. }
  992. .file-drop-zone .table thead tr th {
  993. color: #666666;
  994. text-align: center;
  995. }
  996. .table>thead>tr>th {
  997. vertical-align: bottom;
  998. border-bottom: 2px solid #ddd;
  999. }
  1000. .table>thead>tr>th, .table>thead>tr>td, .table>tbody>tr>th, .table>tbody>tr>td, .table>tfoot>tr>th, .table>tfoot>tr>td {
  1001. padding: 8px;
  1002. line-height: 1.428571429;
  1003. vertical-align: top;
  1004. border-top: 1px solid #ddd;
  1005. }
  1006. .table th, .table td {
  1007. vertical-align: middle;
  1008. box-sizing: border-box;
  1009. }
  1010. th {
  1011. text-align: left;
  1012. }
  1013. td, th {
  1014. padding: 0;
  1015. }
  1016. .input-group-btn {
  1017. position: relative;
  1018. font-size: 0;
  1019. white-space: nowrap;
  1020. }
  1021. .input-group-addon, .input-group-btn {
  1022. white-space: nowrap;
  1023. vertical-align: middle;
  1024. }
  1025. .input-group-addon, .input-group-btn, .input-group .form-control {
  1026. display: table-cell;
  1027. }
  1028. .clearfix:before, .clearfix:after {
  1029. content: " ";
  1030. display: table;
  1031. }
  1032. .input-group-btn:last-child>.btn, .input-group-btn:last-child>.btn-group {
  1033. z-index: 2;
  1034. margin-left: -1px;
  1035. }
  1036. .input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group {
  1037. margin-right: -1px;
  1038. }
  1039. .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child>.btn, .input-group-btn:last-child>.btn-group>.btn, .input-group-btn:last-child>.dropdown-toggle, .input-group-btn:first-child>.btn:not(:first-child), .input-group-btn:first-child>.btn-group:not(:first-child)>.btn {
  1040. border-bottom-left-radius: 0;
  1041. border-top-left-radius: 0;
  1042. }
  1043. .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child>.btn-group:not(:last-child)>.btn {
  1044. border-bottom-right-radius: 0;
  1045. border-top-right-radius: 0;
  1046. }
  1047. .input-group-btn>.btn {
  1048. position: relative;
  1049. }
  1050. .btn.disabled, .btn[disabled], fieldset[disabled] .btn {
  1051. cursor: not-allowed;
  1052. opacity: 0.65;
  1053. filter: alpha(opacity=65);
  1054. -webkit-box-shadow: none;
  1055. box-shadow: none;
  1056. }
  1057. .btn-file {
  1058. position: relative;
  1059. overflow: hidden;
  1060. margin: 0;
  1061. top: 170px;
  1062. left: 50%;
  1063. margin-left: -45px !important;
  1064. outline: none;
  1065. cursor: pointer;
  1066. }
  1067. .btn {
  1068. display: inline-block;
  1069. margin-bottom: 0;
  1070. font-weight: normal;
  1071. text-align: center;
  1072. vertical-align: middle;
  1073. touch-action: manipulation;
  1074. cursor: pointer;
  1075. background-image: none;
  1076. border: 1px solid transparent;
  1077. white-space: nowrap;
  1078. border-radius: 4px;
  1079. -webkit-user-select: none;
  1080. -moz-user-select: none;
  1081. -ms-user-select: none;
  1082. user-select: none;
  1083. }
  1084. .btn-file .add-file {
  1085. background: url(http://cn-file.17pdf.com/website/fileinput/ic_file_add.png) no-repeat;
  1086. width: 90px;
  1087. height: 100px;
  1088. }
  1089. .btn-file .add-file-left {
  1090. background: url(http://cn-file.17pdf.com/website/fileinput/ic_add.png) no-repeat;
  1091. width: 120px;
  1092. height: 30px;
  1093. margin-top: 10px;
  1094. margin-left: 10px;
  1095. padding-left: 38px;
  1096. font-size: 16px;
  1097. line-height: 30px;
  1098. color: #666666;
  1099. }
  1100. .btn-file-left {
  1101. position: relative;
  1102. top: 0px;
  1103. left: 20px;
  1104. }
  1105. .transfer-container .transfer-remember .checkbox input[type="checkbox"] {
  1106. top: 3px;
  1107. }
  1108. .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] {
  1109. position: absolute;
  1110. margin-left: -20px;
  1111. }
  1112. input[type="radio"], input[type="checkbox"] {
  1113. margin: 4px 0 0;
  1114. line-height: normal;
  1115. }
  1116. .modal {
  1117. display: none;
  1118. overflow: hidden;
  1119. position: fixed;
  1120. top: 0;
  1121. right: 0;
  1122. bottom: 0;
  1123. left: 0;
  1124. z-index: 1050;
  1125. -webkit-overflow-scrolling: touch;
  1126. outline: 0;
  1127. }
  1128. .file-drop-zone .table tbody tr:hover td {
  1129. background: #dfdfdf;
  1130. }
  1131. .file-drop-zone .table tbody tr td {
  1132. border-top: 0px;
  1133. }
  1134. .theme-explorer .explorer-frame td {
  1135. vertical-align: middle;
  1136. text-align: center;
  1137. }
  1138. .file-drop-zone .table tbody tr:hover td .transfer-select {
  1139. border-color: #ff4f4f;
  1140. background: url(http://cn-file.17pdf.com/website/converter/ic_trans_xiala_hover.png) no-repeat 72px 6px;
  1141. }
  1142. .file-drop-zone .table tbody tr .transfer-select {
  1143. width: 100%;
  1144. height: 22px;
  1145. border: 1px solid #dadada;
  1146. padding: 0px;
  1147. outline: none;
  1148. font-size: 14px;
  1149. color: #ff4f4f;
  1150. line-height: 22px;
  1151. padding-left: 20px;
  1152. padding-right: 20px;
  1153. border-radius: 2px;
  1154. background: url(http://cn-file.17pdf.com/website/converter/ic_trans_xiala_nor.png) no-repeat 72px 6px;
  1155. }
  1156. .theme-explorer .file-actions-cell .file-actions .file-footer-buttons .pdf-removeicon:before {
  1157. content: url(https://cn-file.17pdf.com/website/converter/ic_delet_red.png) !important;
  1158. display: none;
  1159. }
  1160. .file-drop-zone .table tbody tr:hover td .file-actions .file-footer-buttons .pdf-removeicon:before {
  1161. display: block;
  1162. }
  1163. .btn.disabledBtn {
  1164. background-color: rgb(204, 204, 204);
  1165. pointer-events: none;
  1166. }
  1167. .file_num {
  1168. background: url(http://cn-file.17pdf.com/website/converter/pic_account_bg.png) repeat -10px 0px;
  1169. }
  1170. .clear {
  1171. zoom: 1;
  1172. }
  1173. .clear:after {
  1174. visibility: hidden;
  1175. display: block;
  1176. font-size: 0;
  1177. content: " ";
  1178. clear: both;
  1179. height: 0;
  1180. }
  1181. .pdf_converter .package_type h3:before,
  1182. .about_converter .name:before,
  1183. .converter_question .name:before {
  1184. content: '';
  1185. display: inline-block;
  1186. width: 5px;
  1187. height: 22px;
  1188. background: #ff4f4f;
  1189. margin-right: 10px;
  1190. margin-top: 4px;
  1191. vertical-align: top;
  1192. }
  1193. .pdf_converter .package_type ul li {
  1194. width: 120px;
  1195. list-style: none;
  1196. text-align: center;
  1197. margin-right: 30px;
  1198. cursor: pointer;
  1199. a {
  1200. display: block;
  1201. font-size: 14px;
  1202. color: #333333;
  1203. img {
  1204. display: inline-block;
  1205. width: 80px;
  1206. height: 80px;
  1207. margin-bottom: 20px;
  1208. vertical-align: middle;
  1209. }
  1210. span {
  1211. display: block;
  1212. white-space: nowrap;
  1213. transition: all .5s;
  1214. }
  1215. &:hover{
  1216. img {
  1217. box-shadow: 0px 0px 6px rgb(255 79 79 / 25%);
  1218. }
  1219. span {
  1220. color: #ff4f4f;
  1221. }
  1222. }
  1223. }
  1224. }
  1225. .about_converter ul li {
  1226. width: 50%;
  1227. float: left;
  1228. list-style: none;
  1229. margin-bottom: 85px;
  1230. img {
  1231. width: 70px;
  1232. height: 70px;
  1233. float: left;
  1234. margin: 10px 36px 0px 0px;
  1235. }
  1236. .content {
  1237. width: 330px;
  1238. float: left;
  1239. h3 {
  1240. font-size: 20px;
  1241. color: #333333;
  1242. margin: 0px 0px 10px;
  1243. font-weight: normal;
  1244. }
  1245. p {
  1246. font-size: 16px;
  1247. color: #4c4c4c;
  1248. margin: 0px !important;
  1249. }
  1250. }
  1251. }
  1252. table {
  1253. border-collapse: collapse;
  1254. border-spacing: 0;
  1255. }
  1256. .converter_question table td {
  1257. width: 50%;
  1258. vertical-align: top;
  1259. h3 {
  1260. font-size: 18px;
  1261. color: #333333;
  1262. margin: 54px 0px 14px;
  1263. font-weight: normal;
  1264. text-align: left;
  1265. }
  1266. p {
  1267. width: 75%;
  1268. font-size: 16px;
  1269. color: #4c4c4c;
  1270. text-align: left;
  1271. span {
  1272. width: 8px;
  1273. height: 8px;
  1274. display: inline-block;
  1275. border-radius: 100%;
  1276. background: #333333;
  1277. margin-right: 12px;
  1278. margin-left: 4px;
  1279. }
  1280. }
  1281. }
  1282. .converter_question .more {
  1283. border-bottom: 1px solid #999999;
  1284. }
  1285. .download_code {
  1286. box-shadow: 0px 1px 5px rgb(0 0 0 / 12%);
  1287. }
  1288. .file-details-cell.state img {
  1289. display: inline-block;
  1290. cursor: pointer;
  1291. }
  1292. }
  1293. </style>