SlideCombine/slide_combine_c.h
yuuko 3ea2d0fa25 创建简化版C语言PDF书签合并工具
由于原版本编译错误,创建简化版本:
- slide_combine_simple.c: 核心功能实现
- compile_simple.bat: 简化编译脚本

特点:
- 解决枚举冲突问题
- 简化界面和功能
- 保留核心排序算法
- 支持GCC和MSVC编译

运行:compile_simple.bat

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 13:35:09 +08:00

161 lines
4.2 KiB
C

#ifndef SLIDE_COMBINE_C_H
#define SLIDE_COMBINE_C_H
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <shlobj.h>
#include <commctrl.h>
#include <shlwapi.h>
// 版本信息
#define APP_VERSION "2.0.0"
#define MAX_PATH_LENGTH 1024
#define MAX_BUFFER_SIZE 4096
#define MAX_BOOKMARKS 1000
#define MAX_METADATA_FIELDS 50
// 错误代码 - 避免与Windows宏冲突
typedef enum {
SLIDE_ERROR_NONE = 0,
SLIDE_ERROR_FILE_NOT_FOUND,
SLIDE_ERROR_INVALID_PATH,
SLIDE_ERROR_MEMORY_ALLOCATION,
SLIDE_ERROR_ENCODING_DETECTION,
SLIDE_ERROR_FILE_READ,
SLIDE_ERROR_FILE_WRITE
} ErrorCode;
// 元数据字段类型
typedef enum {
FIELD_TITLE = 0,
FIELD_OTHER_TITLES,
FIELD_VOLUME,
FIELD_ISBN,
FIELD_CREATOR,
FIELD_CONTRIBUTOR,
FIELD_ISSUED_DATE,
FIELD_PUBLISHER,
FIELD_PLACE,
FIELD_CLASSIFICATION_NUMBER,
FIELD_PAGE,
FIELD_SUBJECT,
FIELD_DATE,
FIELD_SPATIAL,
FIELD_OTHER_ISBN,
FIELD_OTHER_TIME,
FIELD_URL,
FIELD_COUNT
} FieldType;
// 字段名称映射
static const char* FIELD_NAMES[] = {
"title",
"Other titles",
"Volume",
"ISBN",
"creator",
"contributor",
"issuedDate",
"publisher",
"place",
"Classification number",
"page",
"subject",
"date",
"spatial",
"Other ISBN",
"Other time",
"url"
};
// 书签项结构
typedef struct {
char title[256];
char page[32];
} BookmarkItem;
// 文档元数据结构
typedef struct {
char fields[FIELD_COUNT][256];
BookmarkItem bookmarks[MAX_BOOKMARKS];
int bookmark_count;
} DocumentMetadata;
// 文件组结构
typedef struct {
char base_name[256];
char** files;
int file_count;
DocumentMetadata* metadata_docs;
int metadata_count;
char* output_content;
} FileGroup;
// 应用程序状态
typedef struct {
HWND hwnd;
char pdf_path[MAX_PATH_LENGTH];
char txt_path[MAX_PATH_LENGTH];
char output_path[MAX_PATH_LENGTH];
HFONT hFont;
HBRUSH hBgBrush;
BOOL processing;
} AppState;
// 函数声明
ErrorCode extract_bookmarks_from_bkmk(const char* filename, BookmarkItem* bookmarks, int* count);
ErrorCode read_metadata_from_txt(const char* filename, DocumentMetadata* metadata);
ErrorCode create_output_content(DocumentMetadata* docs, int count, char** output);
ErrorCode save_content_to_file(const char* filename, const char* content);
ErrorCode detect_file_encoding(const char* filename, char* buffer, int buffer_size);
ErrorCode process_all_files(const char* pdf_path, const char* txt_path, FileGroup** groups, int* group_count);
ErrorCode merge_file_group(FileGroup* group, const char* txt_source_path);
ErrorCode save_all_results(FileGroup* groups, int group_count, const char* output_path);
// 排序函数
int compare_bkmk_files(const void* a, const void* b);
int extract_folder_number(const char* folder_name);
// 字符串处理函数
char* trim_whitespace(char* str);
char* utf8_to_local(const char* utf8_str);
char* local_to_utf8(const char* local_str);
int extract_number_from_string(const char* str);
// 界面函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL create_main_window(HINSTANCE hInstance, int nCmdShow);
void init_common_controls();
void center_window(HWND hwnd);
void browse_folder(HWND hwnd, char* path, const char* title);
void log_message(HWND hwnd, const char* message, BOOL is_error);
void start_processing(HWND hwnd);
void clear_paths(HWND hwnd);
// 辅助函数
void show_error(HWND hwnd, const char* message);
void show_info(HWND hwnd, const char* message);
BOOL is_valid_path(const char* path);
void free_memory(FileGroup* groups, int count);
// 资源ID定义
#define ID_BUTTON_BROWSE_PDF 1001
#define ID_BUTTON_BROWSE_TXT 1002
#define ID_BUTTON_BROWSE_OUTPUT 1003
#define ID_BUTTON_PROCESS 1004
#define ID_BUTTON_CLEAR 1005
#define ID_BUTTON_EXIT 1006
#define ID_EDIT_PDF_PATH 2001
#define ID_EDIT_TXT_PATH 2002
#define ID_EDIT_OUTPUT_PATH 2003
#define ID_LOG_TEXT 3001
// 窗口尺寸和位置
#define WINDOW_WIDTH 600
#define WINDOW_HEIGHT 500
#define CONTROL_HEIGHT 25
#define CONTROL_MARGIN 10
#endif // SLIDE_COMBINE_C_H