SumatraPDF添加保存标注到TXT文本的功能

Posted 赤龙绕月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SumatraPDF添加保存标注到TXT文本的功能相关的知识,希望对你有一定的参考价值。

由于本人喜欢阅读完PDF以后,把标注导出来作为阅读笔记,所有添加此功能。

SumatraPDF

开源PDF阅读器

使用了mupdf

项目设置

有些项目需要调整语言标准:

VS项目设置 常规 C++语言标准 17或14
VS项目设置 C/C++ 常规 将警告视为错误 否

添加保存标注到TXT文本的功能

使用sumatrapdf-3.3

translations.txt文件添加

:Save AnnotationsToTXT
cn:保存标注到TXT

模仿CmdSaveAnnotations添加CmdSaveAnnotationsToTXT菜单

Commands.h文件添加

V(CmdSaveAnnotationsToTXT, "Save AnnotationsToTXT")                   \\

Menu.cpp文件添加

{ _TRN("Save AnnotationsToTXT"),             CmdSaveAnnotationsToTXT,        MF_REQ_DISK_ACCESS },
 case CmdSaveAnnotationsToTXT:
 case CmdNewBookmarks:
     // handle in FrameOnCommand() in SumatraPDF.cpp
     HwndSendCommand(win->hwndFrame, cmd);
     break;

SumatraPDF.cpp文件FrameOnCommand函数添加:

case CmdSaveAnnotationsToTXT:
    SaveAnnotationsToTXT(win->currentTab);
    break;

SumatraPDF.cpp文件添加:

static void SaveAnnotationsToTXT(TabInfo* tab) {
    EngineBase* engine = tab->AsFixed()->GetEngine();
    strconv::StackWstrToUtf8 path{engine->FileName()};
    char* fileName = path.Get();
    const char* fileNameEx = path::GetExtNoFree(fileName);
    const char* fileNameTXT = str::Replace(fileName, fileNameEx, ".txt");

    Vec<Annotation*>* annots = new Vec<Annotation*>();
    EngineGetAnnotations(engine, annots);

    WindowInfo* win = tab->win;
    DisplayModel* dm = win->AsFixed();
    CrashIf(!dm);
    if (!dm) {
        return;
    }
    std::string strTxtTemp;
    for (auto& annot : *annots) {
        if (annot->isDeleted) {
            continue;
        }
        AnnotationType annotType = Type(annot);

        if (annotType == AnnotationType::Highlight || annotType == AnnotationType::Underline ||
            annotType == AnnotationType::StrikeOut) {
            int pageNo = PageNo(annot);
            RectF annotRect = GetRect(annot);
            WCHAR* text = dm->GetTextInRegion(pageNo, annotRect);
            if (!str::IsEmpty(text)) {
                strTxtTemp += strconv::WstrToUtf8(text).data();
            }
        }

        std::string_view annotContents = Contents(annot);
        if (annotContents.length() > 0) {
            strTxtTemp += annotContents.data();
            strTxtTemp += "\\r\\n";
        }
    }

    str::Str str = str::Str(strTxtTemp);
    str.AsSpan();
    file::WriteFile(strconv::Utf8ToWstr(fileNameTXT), str.AsSpan());
    // tab->win->ShowNotification(strTxtTemp, NotificationOptions::Warning);
}

程序下载:

https://download.csdn.net/download/CHIHUN_LOVE/20108404

此程序点击“Save AnnotationsToTXT”菜单即可把当前PDF所有标注导出到与PDF文件同名的TXT文件

以上是关于SumatraPDF添加保存标注到TXT文本的功能的主要内容,如果未能解决你的问题,请参考以下文章

SumatraPDF添加保存标注到TXT文本的功能

保存标注对象到txt 制作xml

PDF阅读器 SumatraPDF 设置:电子书字体字号的更换及行距设置

如何使用php将2个变量输入添加到txt文件保存名称

为 savecommand 添加 .txt、.png 和其他选项

项目应用自然语言处理-分词词频统计词性标注格式化输出