Skip to content

Commit

Permalink
release v0.0.1
Browse files Browse the repository at this point in the history
  • Loading branch information
ElonH committed Nov 5, 2018
1 parent 5c5cd19 commit 06e547f
Show file tree
Hide file tree
Showing 10 changed files with 367 additions and 79 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,8 @@ ENV/

# Rope project settings
.ropeproject

# build
main.spec
build/
__pycache__/
Binary file added README.assets/capture.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
59 changes: 9 additions & 50 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,59 +1,18 @@
# caj2pdf
# caj2pdf_gui

## Why
A simple gui program for [caj2pdf project](https://github.com/JeziL/caj2pdf)

[中国知网](http://cnki.net/)的某些文献(多为学位论文)仅提供其专有的 CAJ 格式下载,仅能使用知网提供的软件(如 [CAJViewer](http://cajviewer.cnki.net/) 等)打开,给文献的阅读和管理带来了不便(尤其是在非 Windows 系统上)。
![capture](README.assets/capture.png)

若要将 CAJ 文件转换为 PDF 文件,可以使用 CAJViewer 的打印功能。但这样得到的 PDF 文件的内容为图片,无法进行文字的选择,且原文献的大纲列表也会丢失。本项目希望可以解决上述两问题。
## Build platform

## How far we've come
- Win7 x64
- Python 3.6.4 (AMD64)
- Pyinstaller 3.4

知网下载到的后缀为 `caj` 的文件内部结构其实分为两类:CAJ 格式和 HN 格式(受考察样本所限可能还有更多)。目前本项目支持 CAJ 格式文件的转换,HN 格式仅支持基本文件信息和大纲信息的读取,但在文件内容结构的分析上也取得了一些微小的进展。
## Release

**关于两种格式文件结构的分析进展和本项目的实现细节,请查阅[项目 Wiki](https://github.com/JeziL/caj2pdf/wiki)**

## How to contribute

受测试样本数量所限,即使转换 CAJ 格式的文件也可能(或者说几乎一定)存在 Bug。如遇到这种情况,欢迎在 [Issue](https://github.com/JeziL/caj2pdf/issues) 中提出,**并提供可重现 Bug 的 caj 文件**——可以将样本文件上传到网盘等处<del>,也可直接提供知网链接</del>(作者已滚出校园网,提 issue 请提供可下载的 caj 文件)。

如果你对二进制文件分析、图像/文字压缩算法、逆向工程等领域中的一个或几个有所了解,欢迎帮助完善此项目。你可以从阅读[项目 Wiki](https://github.com/JeziL/caj2pdf/wiki) 开始,看看是否有可以发挥你特长的地方。**Pull requests are always welcome**.

## How to use

### 环境和依赖

- Python 3.3+
- [PyPDF2](https://github.com/mstamy2/PyPDF2)
- [mutool](https://mupdf.com/index.html)

### 用法

```
# 打印文件基本信息(文件类型、页面数、大纲项目数)
caj2pdf show [input_file]
# 转换文件
caj2pdf convert [input_file] -o/--output [output_file]
# 从 CAJ 文件中提取大纲信息并添加至 PDF 文件
## 遇到不支持的文件类型或 Bug 时,可用 CAJViewer 打印 PDF 文件,并用这条命令为其添加大纲
caj2pdf outlines [input_file] -o/--output [pdf_file]
```

###

```
caj2pdf show test.caj
caj2pdf convert test.caj -o output.pdf
caj2pdf outlines test.caj -o printed.pdf
```

### 异常输出(IMPORTANT!!!)

尽管这个项目目前有不少同学关注到了,但它**仍然只支持部分 caj 文件的转换**,必须承认这完全不是一个对普通用户足够友好的成熟项目。具体支持哪些不支持哪些,在前文也已经说了,但似乎很多同学并没有注意到。所以**如果你遇到以下两种输出,本项目目前无法帮助到你**。与此相关的 issue 不再回复。

- `Unknown file type.`:未知文件类型;
- `Unsupported file type.`: 尚不支持的 HN 格式。
[OneDrive](https://1drv.ms/f/s!ApqgfoqX1ihmi2hH_3nCyS2lw9JC)

## License

Expand Down
2 changes: 2 additions & 0 deletions build.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pyinstaller.exe -F -w main.py
copy mutool.exe dist\mutool.exe
0 caj2pdf → caj2pdf.py
100755 → 100644
File renamed without changes.
81 changes: 81 additions & 0 deletions caj2pdf_GUI.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'caj2pdf_GUI.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(382, 428)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setMaximumSize(QtCore.QSize(16777215, 15))
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 4, 0, 1, 4)
self.logger = QtWidgets.QListWidget(self.centralwidget)
self.logger.setObjectName("logger")
self.gridLayout.addWidget(self.logger, 3, 0, 1, 4)
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setObjectName("lineEdit")
self.gridLayout.addWidget(self.lineEdit, 5, 0, 1, 4)
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setMaximumSize(QtCore.QSize(16777215, 15))
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.convert = QtWidgets.QPushButton(self.centralwidget)
self.convert.setMaximumSize(QtCore.QSize(93, 16777215))
self.convert.setObjectName("convert")
self.gridLayout.addWidget(self.convert, 2, 1, 1, 1)
self.outlines = QtWidgets.QPushButton(self.centralwidget)
self.outlines.setMaximumSize(QtCore.QSize(93, 16777215))
self.outlines.setObjectName("outlines")
self.gridLayout.addWidget(self.outlines, 2, 2, 1, 1)
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setMaximumSize(QtCore.QSize(16777215, 15))
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 6, 0, 1, 2)
self.show_button = QtWidgets.QPushButton(self.centralwidget)
self.show_button.setMaximumSize(QtCore.QSize(93, 16777215))
self.show_button.setObjectName("show_button")
self.gridLayout.addWidget(self.show_button, 2, 0, 1, 1)
self.line_address = QtWidgets.QLineEdit(self.centralwidget)
self.line_address.setObjectName("line_address")
self.gridLayout.addWidget(self.line_address, 1, 0, 1, 3)
self.file_open_button = QtWidgets.QToolButton(self.centralwidget)
self.file_open_button.setObjectName("file_open_button")
self.gridLayout.addWidget(self.file_open_button, 1, 3, 1, 1)
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setObjectName("lineEdit_2")
self.gridLayout.addWidget(self.lineEdit_2, 7, 0, 1, 4)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "caj2pdf"))
self.label_2.setText(_translate("MainWindow", "caj2pdf 核心项目源码: (转换不了看这里)"))
self.lineEdit.setText(_translate("MainWindow", "https://github.com/JeziL/caj2pdf"))
self.label.setText(_translate("MainWindow", "caj文件位置:"))
self.convert.setToolTip(_translate("MainWindow", "转换文件"))
self.convert.setText(_translate("MainWindow", "convert"))
self.outlines.setToolTip(_translate("MainWindow", "<html><head/><body><p>从 CAJ 文件中提取大纲信息并添加至转化后的 PDF 文件</p><p>遇到不支持的文件类型或 Bug 时,可用 CAJViewer 打印 PDF 文件,并用这条命令为其添加大纲</p></body></html>"))
self.outlines.setText(_translate("MainWindow", "outlines"))
self.label_3.setText(_translate("MainWindow", "caj2pdf GUI项目源码:"))
self.show_button.setToolTip(_translate("MainWindow", "打印文件基本信息(文件类型、页面数、大纲项目数)"))
self.show_button.setText(_translate("MainWindow", "show"))
self.file_open_button.setText(_translate("MainWindow", "..."))
self.lineEdit_2.setText(_translate("MainWindow", "https://github.com/cnms520/caj2pdf_gui"))

144 changes: 144 additions & 0 deletions caj2pdf_GUI.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>382</width>
<height>428</height>
</rect>
</property>
<property name="windowTitle">
<string>caj2pdf</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0" colspan="4">
<widget class="QLabel" name="label_2">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>15</height>
</size>
</property>
<property name="text">
<string>caj2pdf 核心项目源码: (转换不了看这里)</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="4">
<widget class="QListWidget" name="logger"/>
</item>
<item row="5" column="0" colspan="4">
<widget class="QLineEdit" name="lineEdit">
<property name="text">
<string>https://github.com/JeziL/caj2pdf</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>15</height>
</size>
</property>
<property name="text">
<string>caj文件位置:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="convert">
<property name="maximumSize">
<size>
<width>93</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>转换文件</string>
</property>
<property name="text">
<string>convert</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="outlines">
<property name="maximumSize">
<size>
<width>93</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;从 CAJ 文件中提取大纲信息并添加至转化后的 PDF 文件&lt;/p&gt;&lt;p&gt;遇到不支持的文件类型或 Bug 时,可用 CAJViewer 打印 PDF 文件,并用这条命令为其添加大纲&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>outlines</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="label_3">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>15</height>
</size>
</property>
<property name="text">
<string>caj2pdf GUI项目源码:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="show_button">
<property name="maximumSize">
<size>
<width>93</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>打印文件基本信息(文件类型、页面数、大纲项目数)</string>
</property>
<property name="text">
<string>show</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QLineEdit" name="line_address"/>
</item>
<item row="1" column="3">
<widget class="QToolButton" name="file_open_button">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="4">
<widget class="QLineEdit" name="lineEdit_2">
<property name="text">
<string>https://github.com/cnms520/caj2pdf_gui</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
<slots>
<slot>show_caj()</slot>
<slot>convert_caj()</slot>
<slot>outlines_caj()</slot>
<slot>open_caj()</slot>
</slots>
</ui>
Loading

0 comments on commit 06e547f

Please sign in to comment.