diff --git a/API.md b/API.md
index 022db8894..0c8ba3877 100644
--- a/API.md
+++ b/API.md
@@ -457,13 +457,12 @@ View API token in Settings - About, request header: `Authorization: T
* `/api/asset/upload`
* The parameter is an HTTP Multipart form
- * `assetsDirPath`: The folder path where the assets are stored. The arguments have the following three cases
+ * `assetsDirPath`: The folder path where assets are stored, with the data folder as the root path, for example:
+ * `"/assets/"`: workspace/data/assets/ folder
+ * `"/assets/sub/"`: workspace/data/assets/sub/ folder
- 1. `"/assets/"`: Workspace/data/assets folder
- 2. `"/Test Notebook/assets/"`: Assets folder under `Test Notebook`
- 3. `"/Test Notebook/foo/assets/"`: Assets folder under foo folder under `Test notebook`
-
- It is recommended to use the first one, which is stored in the workspace assets folder uniformly.
+ Under normal circumstances, it is recommended to use the first method, which is stored in the assets folder
+ of the workspace.
* `file[]`: Uploaded file list
* Return value
@@ -705,7 +704,7 @@ View API token in Settings - About, request header: `Authorization: T
}
```
- * `id`: ID of the block to be got
+ * `id`: ID of the block to be got
* Return value
```json
@@ -718,7 +717,7 @@ View API token in Settings - About, request header: `Authorization: T
}
}
```
-
+
## Attributes
### Set block attributes
@@ -814,8 +813,9 @@ View API token in Settings - About, request header: `Authorization: T
"path": "F:\\SiYuan\\data\\templates\\foo.md"
}
```
- * `id`: The ID of the document where the rendering is called
- * `path`: Template file absolute path
+
+ * `id`: The ID of the document where the rendering is called
+ * `path`: Template file absolute path
* Return value
```json
diff --git a/API_zh_CN.md b/API_zh_CN.md
index 93c83d82b..c77c5818b 100644
--- a/API_zh_CN.md
+++ b/API_zh_CN.md
@@ -454,13 +454,11 @@
* `/api/asset/upload`
* 参数为 HTTP Multipart 表单
- * `assetsDirPath`:资源文件存放的文件夹路径,实参有以下三种情况
+ * `assetsDirPath`:资源文件存放的文件夹路径,以 data 文件夹作为根路径,比如:
+ * `"/assets/"`:工作空间/data/assets/ 文件夹
+ * `"/assets/sub/"`:工作空间/data/assets/sub/ 文件夹
- 1. `"/assets/"`:工作空间/data/assets 文件夹
- 2. `"/测试笔记本/assets/"`:`测试笔记本`下的 assets 文件夹
- 3. `"/测试笔记本/foo/assets/"`:`测试笔记本`下 foo 文件夹下的 assets 文件夹
-
- 建议用第一种,统一存放到工作空间资源文件夹下。
+ 常规情况下建议用第一种,统一存放到工作空间资源文件夹下。
* `file[]`:上传的文件列表
* 返回值
diff --git a/kernel/model/export.go b/kernel/model/export.go
index 2637c1c61..f0bc3bd61 100644
--- a/kernel/model/export.go
+++ b/kernel/model/export.go
@@ -665,6 +665,8 @@ func AddPDFOutline(id, p string, merge bool) (err error) {
return links[i].Page < links[j].Page
})
+ pdfcpu.VersionStr = "SiYuan v" + util.Ver
+
bms := map[string]*pdfcpu.Bookmark{}
for _, link := range links {
linkID := link.URI[strings.LastIndex(link.URI, "/")+1:]
@@ -798,15 +800,11 @@ func AddPDFOutline(id, p string, merge bool) (err error) {
}
linkMap := map[int][]*pdfcpu.IndirectRef{}
- //pdfCtx.RemoveAnnotations(nil, nil, nil, false)
-
- for i, link := range assetLinks {
+ pdfCtx.RemoveAnnotations(nil, nil, nil, false)
+ now := pdfcpu.StringLiteral(pdfcpu.DateString(time.Now()))
+ for _, link := range assetLinks {
link.URI = strings.ReplaceAll(link.URI, "http://127.0.0.1:6806/export/temp/", "")
- //if 1 > len(linkMap[link.Page]) {
- // linkMap[link.Page] = []pdfcpu.Annotation{link}
- //} else {
- // linkMap[link.Page] = append(linkMap[link.Page], link)
- //}
+ link.URI, _ = url.PathUnescape(link.URI)
absPath, getErr := GetAssetAbsPath(link.URI)
if nil != getErr {
@@ -832,15 +830,17 @@ func AddPDFOutline(id, p string, merge bool) (err error) {
continue
}
- now := pdfcpu.StringLiteral(pdfcpu.DateString(time.Now()))
- mediaBox := pdfcpu.RectForFormat("A4")
- r := annotRect(i, mediaBox.Width(), mediaBox.Height(), 30, 80)
+ lx := link.Rect.LL.X + link.Rect.Width()
+ ly := link.Rect.LL.Y + link.Rect.Height()/2
+ ux := lx + link.Rect.Height()/2
+ uy := ly + link.Rect.Height()/2
+
d := pdfcpu.Dict(
map[string]pdfcpu.Object{
"Type": pdfcpu.Name("Annot"),
"Subtype": pdfcpu.Name("FileAttachment"),
- "Contents": pdfcpu.StringLiteral("FileAttachment Annotation"),
- "Rect": r.Array(),
+ "Contents": pdfcpu.StringLiteral(""),
+ "Rect": pdfcpu.Rect(lx, ly, ux, uy).Array(),
"P": link.P,
"M": now,
"F": pdfcpu.Integer(0),
@@ -850,7 +850,7 @@ func AddPDFOutline(id, p string, merge bool) (err error) {
"CreationDate": now,
"Name": pdfcpu.Name("FileAttachment"),
"FS": *ir,
- "NM": pdfcpu.StringLiteral("SoundFileAttachmentAnnot"),
+ "NM": pdfcpu.StringLiteral(""),
},
)
@@ -900,7 +900,6 @@ func AddPDFOutline(id, p string, merge bool) (err error) {
obj, found := pageDict.Find("Annots")
if !found {
pageDict.Insert("Annots", array)
-
pdfCtx.EnsureVersionForWriting()
continue
}
@@ -926,8 +925,6 @@ func AddPDFOutline(id, p string, merge bool) (err error) {
}
entry.Object = append(annots, array...)
pdfCtx.EnsureVersionForWriting()
-
- //d.Insert("Annots", array)
}
if writeErr := api.WriteContextFile(pdfCtx, inFile); nil != writeErr {
diff --git a/kernel/model/upload.go b/kernel/model/upload.go
index 1dfaff11e..a3456263b 100644
--- a/kernel/model/upload.go
+++ b/kernel/model/upload.go
@@ -130,9 +130,11 @@ func Upload(c *gin.Context) {
docDirLocalPath := filepath.Join(util.DataDir, bt.BoxID, path.Dir(bt.Path))
assetsDirPath = getAssetsDir(filepath.Join(util.DataDir, bt.BoxID), docDirLocalPath)
}
+
+ relAssetsDirPath := "assets"
if nil != form.Value["assetsDirPath"] {
- assetsDirPath = form.Value["assetsDirPath"][0]
- assetsDirPath = filepath.Join(util.DataDir, assetsDirPath)
+ relAssetsDirPath = form.Value["assetsDirPath"][0]
+ assetsDirPath = filepath.Join(util.DataDir, relAssetsDirPath)
}
if !gulu.File.IsExist(assetsDirPath) {
if err = os.MkdirAll(assetsDirPath, 0755); nil != err {
@@ -187,7 +189,7 @@ func Upload(c *gin.Context) {
break
}
f.Close()
- succMap[baseName] = "assets/" + fName
+ succMap[baseName] = path.Join(relAssetsDirPath, fName)
}
}