nbugs commited on
Commit
a83cc14
·
verified ·
1 Parent(s): fd531df

Upload index.html

Browse files
Files changed (1) hide show
  1. index.html +262 -0
index.html ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta name="description" content="PDF OCR与翻译工具 - 使用 Mistral OCR 提取 PDF 文本并转换为 Markdown,可选择使用 AI 模型进行翻译">
7
+ <title>Paper Burner - PDF文档 OCR与翻译工具</title>
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/iconify-icon.min.js"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
11
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/base64.min.js"></script>
12
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js"></script>
14
+ <style>
15
+ @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;500;600;700&display=swap');
16
+ body {
17
+ font-family: 'Nunito', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
18
+ }
19
+ .gradient-bg {
20
+ background: linear-gradient(135deg, #f5f7fa 0%, #e4edf9 100%);
21
+ }
22
+ .gradient-card {
23
+ background: linear-gradient(135deg, #ffffff 0%, #f9fbff 100%);
24
+ }
25
+ .transition-all {
26
+ transition: all 0.3s ease;
27
+ }
28
+ </style>
29
+ </head>
30
+ <body class="gradient-bg min-h-screen">
31
+ <div class="container mx-auto px-4 py-8 max-w-6xl">
32
+ <header class="text-center mb-12">
33
+ <h1 class="text-3xl md:text-4xl font-bold text-gray-800 mb-3">Paper Burner: PDF <span class="text-blue-600">OCR</span> 与翻译工具</h1>
34
+ <p class="text-gray-600 max-w-2xl mx-auto">使用 Mistral OCR 提取 PDF 文本并转换为 Markdown,可选择使用 AI 模型进行全文中文翻译</p>
35
+ <p class="text-gray-600 max-w-2xl mx-auto">完美保持公式、图表格式</p>
36
+ <p class="text-gray-600 max-w-2xl mx-auto text-sm">注意:AI 模型翻译结果仅供参考,最终内容请以原文为准</p>
37
+ </header>
38
+
39
+ <main>
40
+ <div class="bg-white rounded-xl shadow-sm p-6 mb-8">
41
+ <div class="mb-6">
42
+ <h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center">
43
+ <iconify-icon icon="carbon:api" class="mr-2 text-blue-500" width="24"></iconify-icon>
44
+ API 密钥设置
45
+ </h2>
46
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
47
+ <div>
48
+ <label for="mistralApiKey" class="block text-sm font-medium text-gray-700 mb-1">Mistral API Key <span class="text-red-500">*</span></label>
49
+ <div class="relative">
50
+ <input type="password" id="mistralApiKey" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" placeholder="输入您的 Mistral API Key">
51
+ <button id="toggleMistralKey" class="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700">
52
+ <iconify-icon icon="carbon:view" width="20"></iconify-icon>
53
+ </button>
54
+ </div>
55
+ <div class="mt-2 flex items-center">
56
+ <input type="checkbox" id="rememberMistralKey" class="rounded text-blue-500 focus:ring-blue-500 mr-2">
57
+ <label for="rememberMistralKey" class="text-sm text-gray-600">记住此 API Key</label>
58
+ </div>
59
+ </div>
60
+ <div>
61
+ <label for="translationApiKey" class="block text-sm font-medium text-gray-700 mb-1">翻译 API Key (可选)</label>
62
+ <div class="relative">
63
+ <input type="password" id="translationApiKey" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" placeholder="输入翻译服务 API Key (可选)">
64
+ <button id="toggleTranslationKey" class="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700">
65
+ <iconify-icon icon="carbon:view" width="20"></iconify-icon>
66
+ </button>
67
+ </div>
68
+ <div class="mt-2 flex items-center">
69
+ <input type="checkbox" id="rememberTranslationKey" class="rounded text-blue-500 focus:ring-blue-500 mr-2">
70
+ <label for="rememberTranslationKey" class="text-sm text-gray-600">记住此 API Key</label>
71
+ </div>
72
+ </div>
73
+ </div>
74
+ </div>
75
+
76
+ <div class="mb-6">
77
+ <h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center">
78
+ <iconify-icon icon="carbon:translate" class="mr-2 text-blue-500" width="24"></iconify-icon>
79
+ 翻译设置
80
+ </h2>
81
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
82
+ <div>
83
+ <label for="translationModel" class="block text-sm font-medium text-gray-700 mb-1">翻译模型</label>
84
+ <select id="translationModel" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all">
85
+ <option value="none">不需要翻译</option>
86
+ <option value="mistral">Mistral Large</option>
87
+ <option value="deepseek">DeepSeek v3</option>
88
+ <option value="gemini">Gemini 2.0 Flash</option>
89
+ <option value="claude">Claude 3.5 Sonnet</option>
90
+ <option value="tongyi-deepseek-v3">通义百炼 DeepSeek v3</option>
91
+ <option value="volcano-deepseek-v3">火山引擎 DeepSeek v3</option>
92
+ <option value="custom">自定义模型</option>
93
+ </select>
94
+ </div>
95
+ <div id="customModelSettings" class="hidden mt-4 border-t pt-4 border-gray-200">
96
+ <h3 class="text-sm font-medium text-gray-700 mb-3">自定义模型设置</h3>
97
+ <div class="grid grid-cols-1 gap-4">
98
+ <div>
99
+ <label for="customModelName" class="block text-sm font-medium text-gray-700 mb-1">模型名称</label>
100
+ <input type="text" id="customModelName" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" placeholder="例如: Claude 3 Opus">
101
+ </div>
102
+ <div>
103
+ <label for="customApiEndpoint" class="block text-sm font-medium text-gray-700 mb-1">API 端点 URL</label>
104
+ <input type="text" id="customApiEndpoint" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" placeholder="例如: https://api.example.com/v1/chat/completions">
105
+ </div>
106
+ <div>
107
+ <label for="customModelId" class="block text-sm font-medium text-gray-700 mb-1">模型 ID</label>
108
+ <input type="text" id="customModelId" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" placeholder="例如: gpt-4-turbo">
109
+ </div>
110
+ <div>
111
+ <label for="customRequestFormat" class="block text-sm font-medium text-gray-700 mb-1">请求格式</label>
112
+ <select id="customRequestFormat" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all">
113
+ <option value="openai">OpenAI 格式</option>
114
+ <option value="anthropic">Anthropic 格式</option>
115
+ <option value="gemini">Google Gemini 格式</option>
116
+ </select>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ <div>
121
+ <label for="targetLanguage" class="block text-sm font-medium text-gray-700 mb-1">目标语言</label>
122
+ <select id="targetLanguage" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all">
123
+ <option value="chinese">中文</option>
124
+ </select>
125
+ </div>
126
+ </div>
127
+ </div>
128
+
129
+ <div class="mt-4">
130
+ <button id="advancedSettingsToggle" class="text-sm text-gray-500 hover:text-gray-700 flex items-center" type="button">
131
+ <iconify-icon icon="carbon:settings-adjust" class="mr-1" width="16"></iconify-icon>
132
+ <span>高级设置</span>
133
+ <iconify-icon icon="carbon:chevron-down" class="ml-1" width="16" id="advancedSettingsIcon"></iconify-icon>
134
+ </button>
135
+
136
+ <div id="advancedSettings" class="hidden mt-3 pt-3 border-t border-gray-100">
137
+ <div class="grid grid-cols-1 gap-4">
138
+ <div>
139
+ <label for="maxTokensPerChunk" class="block text-sm font-medium text-gray-700 mb-1">每段最大Token数</label>
140
+ <div class="flex items-center">
141
+ <input type="range" id="maxTokensPerChunk" min="500" max="10000" step="100" value="2000"
142
+ class="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer">
143
+ <span id="maxTokensPerChunkValue" class="ml-2 text-sm text-gray-600 min-w-[50px]">2000</span>
144
+ </div>
145
+ <p class="text-xs text-gray-500 mt-1">默认为2000,较小的值会导致更多的分段,较大的值可能超出模型上下文限制或导致超时</p>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ </div>
150
+
151
+ <div class="mb-6">
152
+ <h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center">
153
+ <iconify-icon icon="carbon:document-pdf" class="mr-2 text-blue-500" width="24"></iconify-icon>
154
+ PDF 文件上传
155
+ </h2>
156
+ <div class="border-2 border-dashed border-gray-300 rounded-lg p-8 text-center" id="dropZone">
157
+ <input type="file" id="pdfFileInput" accept=".pdf" class="hidden">
158
+ <div class="mx-auto mb-4 w-16 h-16 flex items-center justify-center rounded-full bg-blue-50">
159
+ <iconify-icon icon="carbon:upload" class="text-blue-500" width="32"></iconify-icon>
160
+ </div>
161
+ <h3 class="text-lg font-medium text-gray-800 mb-1">拖放 PDF 文件到这里</h3>
162
+ <p class="text-sm text-gray-500 mb-4">或者</p>
163
+ <button id="browseFilesBtn" class="px-6 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-all focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2">
164
+ 浏览文件
165
+ </button>
166
+ <div id="fileInfo" class="hidden mt-4 flex items-center justify-center text-left">
167
+ <div class="mr-3">
168
+ <iconify-icon icon="carbon:document-pdf" class="text-red-500" width="32"></iconify-icon>
169
+ </div>
170
+ <div>
171
+ <p id="fileName" class="text-sm font-medium text-gray-800"></p>
172
+ <p id="fileSize" class="text-xs text-gray-500"></p>
173
+ </div>
174
+ <button id="removeFileBtn" class="ml-4 text-gray-400 hover:text-gray-600">
175
+ <iconify-icon icon="carbon:close" width="20"></iconify-icon>
176
+ </button>
177
+ </div>
178
+ </div>
179
+ </div>
180
+
181
+
182
+
183
+ <div class="flex justify-center mt-8">
184
+ <button id="processBtn" class="px-8 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed flex items-center">
185
+ <iconify-icon icon="carbon:play" class="mr-2" width="20"></iconify-icon>
186
+ <span>开始处理</span>
187
+ </button>
188
+ </div>
189
+ </div>
190
+
191
+ <div id="resultsSection" class="bg-white rounded-xl shadow-sm p-6 mb-8 hidden">
192
+ <h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center">
193
+ <iconify-icon icon="carbon:document" class="mr-2 text-blue-500" width="24"></iconify-icon>
194
+ 处理结果
195
+ </h2>
196
+
197
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
198
+ <div class="gradient-card rounded-lg p-4 border border-gray-100 shadow-sm">
199
+ <h3 class="font-medium text-gray-800 mb-2 flex items-center">
200
+ <iconify-icon icon="carbon:markdown" class="mr-2 text-blue-500" width="20"></iconify-icon>
201
+ Markdown 内容
202
+ </h3>
203
+ <div id="markdownPreview" class="h-40 overflow-auto bg-gray-50 rounded p-3 text-sm text-gray-700 font-mono"></div>
204
+ <button id="downloadMarkdownBtn" class="mt-3 px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-all focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 flex items-center justify-center w-full">
205
+ <iconify-icon icon="carbon:download" class="mr-2" width="16"></iconify-icon>
206
+ <span>下载 Markdown</span>
207
+ </button>
208
+ </div>
209
+
210
+ <div class="gradient-card rounded-lg p-4 border border-gray-100 shadow-sm" id="translationResultCard">
211
+ <h3 class="font-medium text-gray-800 mb-2 flex items-center">
212
+ <iconify-icon icon="carbon:translate" class="mr-2 text-blue-500" width="20"></iconify-icon>
213
+ 翻译内容
214
+ </h3>
215
+ <div id="translationPreview" class="h-40 overflow-auto bg-gray-50 rounded p-3 text-sm text-gray-700"></div>
216
+ <button id="downloadTranslationBtn" class="mt-3 px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-all focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 flex items-center justify-center w-full">
217
+ <iconify-icon icon="carbon:download" class="mr-2" width="16"></iconify-icon>
218
+ <span>下载翻译</span>
219
+ </button>
220
+ </div>
221
+ </div>
222
+ </div>
223
+
224
+ <div id="progressSection" class="bg-white rounded-xl shadow-sm p-6 mb-8 hidden">
225
+ <h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center">
226
+ <iconify-icon icon="carbon:progress-bar" class="mr-2 text-blue-500" width="24"></iconify-icon>
227
+ 处理进度
228
+ </h2>
229
+
230
+ <div class="mb-4">
231
+ <div class="flex justify-between mb-1">
232
+ <span id="progressStep" class="text-sm font-medium text-gray-700">OCR处理中...</span>
233
+ <span id="progressPercentage" class="text-sm font-medium text-gray-700">0%</span>
234
+ </div>
235
+ <div class="w-full bg-gray-200 rounded-full h-2.5">
236
+ <div id="progressBar" class="bg-blue-600 h-2.5 rounded-full" style="width: 0%"></div>
237
+ </div>
238
+ </div>
239
+
240
+ <div id="progressLog" class="bg-gray-50 rounded-lg p-4 h-32 overflow-auto text-sm text-gray-600 font-mono"></div>
241
+ </div>
242
+ </main>
243
+
244
+ <footer class="text-center text-gray-500 text-sm mt-12">
245
+ <p class="mb-2">
246
+ <a href="https://github.com/baoyudu/ocrpdf" class="text-blue-500 hover:text-blue-700 transition-colors" target="_blank" rel="noopener noreferrer">
247
+ <iconify-icon icon="carbon:logo-github" class="mr-1" inline></iconify-icon>
248
+ GitHub
249
+ </a>
250
+ </p>
251
+
252
+ <p>Bao Yu &copy; 2025</p>
253
+ </footer>
254
+ </div>
255
+
256
+ <!-- 通知系统 -->
257
+ <div id="notification-container" class="fixed top-4 right-4 z-50 flex flex-col items-end space-y-2 pointer-events-none"></div>
258
+
259
+ <script src="https://unpkg.com/[email protected]/dist/iconify-icon.min.js"></script>
260
+ <script src="app.js"></script>
261
+ </body>
262
+ </html>