1.I refer to this mail:
https://groups.google.com/g/pdfium/c/3yxO-65NuG4/m/IPQxpj0VCAAJ
2.I can extract images and try to compressed, but the compressed images are not loaded to the pdf.
So No matter how many times I run it, the size of pdf stays the same.
I'm trapped.
here is my code
```go
func CompressImagesInPlace(instance pdfium.Pdfium, inputPath string) error {
// 因为是原地更新,测试阶段,先备份原文件
outputPath := strings.Replace(inputPath, ".pdf", fmt.Sprintf(".%d.backup.pdf", time.Now().UnixNano()), 1)
if err := util.CopyFile(inputPath, outputPath); err != nil {
return fmt.Errorf("无法备份原文件: %v", err)
}
pdfDoc, err := instance.FPDF_LoadDocument(&requests.FPDF_LoadDocument{
Path: &outputPath,
Password: nil,
})
if err != nil {
return fmt.Errorf("无法加载 PDF 文档: %v", err)
}
defer instance.FPDF_CloseDocument(&requests.FPDF_CloseDocument{
Document: pdfDoc.Document,
})
// 源文档页面数量
pageCountRes, err := instance.FPDF_GetPageCount(&requests.FPDF_GetPageCount{
Document: pdfDoc.Document,
})
if err != nil {
return err
}
fmt.Printf("pdf page count: %d\n", pageCountRes.PageCount)
// 遍历所有页面
for i := 0; i < pageCountRes.PageCount; i++ {
fmt.Printf("加载页面:%d\n", i)
pdfPage, err := instance.FPDF_LoadPage(&requests.FPDF_LoadPage{
Document: pdfDoc.Document,
Index: i,
})
if err != nil {
return fmt.Errorf("无法加载页面: %v", err)
}
// 遍历一个页面中的对象
objectCountRes, err := instance.FPDFPage_CountObjects(&requests.FPDFPage_CountObjects{
Page: requests.Page{ByReference: &pdfPage.Page},
})
if err != nil {
return fmt.Errorf("无法获取页面对象数量: %v", err)
}
for j := 0; j < objectCountRes.Count; j++ {
objRes, err := instance.FPDFPage_GetObject(&requests.FPDFPage_GetObject{
Page: requests.Page{ByReference: &pdfPage.Page},
Index: j,
})
if err != nil {
return fmt.Errorf("无法获取页面对象: %v", err)
}
objTypeRes, err := instance.FPDFPageObj_GetType(&requests.FPDFPageObj_GetType{
PageObject: objRes.PageObject,
})
if err != nil {
return fmt.Errorf("无法获取页面对象类型: %v", err)
}
// log.Printf("对象类型:%d\n", objTypeRes.Type)
if objTypeRes.Type == enums.FPDF_PAGEOBJ_IMAGE {
//
- FPDFImageObj_GetBitmap
// - FPDFBitmap_GetStride
// - FPDFBitmap_GetWidth
// - FPDFBitmap_GetHeight
// - FPDFBitmap_GetFormat
imageMetadataRes, err := instance.FPDFImageObj_GetImageMetadata(&requests.FPDFImageObj_GetImageMetadata{
ImageObject: objRes.PageObject,
Page: requests.Page{ByReference: &pdfPage.Page},
})
if err != nil {
return fmt.Errorf("无法获取图片元数据: %v", err)
}
fmt.Printf("图片元数据:%+v\n", imageMetadataRes.ImageMetadata)
imageDataDecodedRes, err := instance.FPDFImageObj_GetImageDataDecoded(&requests.FPDFImageObj_GetImageDataDecoded{
ImageObject: objRes.PageObject,
})
if err != nil {
return fmt.Errorf("无法获取图片解码数据: %v", err)
}
filePrefix := fmt.Sprintf("./images-files/decoded_%d_%d", i, j)
filename, err := util.SaveImageFromData(imageDataDecodedRes.Data, filePrefix)
if err != nil {
if strings.Contains(err.Error(), "无法解码图片") {
fmt.Printf("无法解码图片:%d_%d: %v\n", i, j, err)
continue
}
return fmt.Errorf("无法保存图片:%d_%d: %v", i, j, err)
}
// defer os.Remove(filename)
filterRes, err := instance.FPDFImageObj_GetImageFilter(&requests.FPDFImageObj_GetImageFilter{
ImageObject: objRes.PageObject,
})
if err != nil {
return fmt.Errorf("无法获取图片filter:%d_%d: %v", i, j, err)
}
fmt.Printf("filterRes:%d_%d: %+v\n", i, j, filterRes.ImageFilter)
_, err = instance.FPDFImageObj_LoadJpegFile(&requests.FPDFImageObj_LoadJpegFile{
ImageObject: objRes.PageObject,
Page: &requests.Page{
// ByReference: &pdfPage.Page,
ByIndex: &requests.PageByIndex{
Document: pdfDoc.Document,
Index: i,
},
},
Count: 0,
// FileData: data,
FilePath: filename,
})
if err != nil {
fmt.Printf("FPDFImageObj_LoadJpegFileInline: %v\n", err)
return fmt.Errorf("无法加载图片: %v", err)
}
}
_, err = instance.FPDFPage_GenerateContent(&requests.FPDFPage_GenerateContent{
Page: requests.Page{
ByIndex: &requests.PageByIndex{
Document: pdfDoc.Document,
Index: i,
},
},
})
if err != nil {
return fmt.Errorf("无法生成页面内容: %v", err)
}
}
_, err = instance.FPDF_ClosePage(&requests.FPDF_ClosePage{
Page: pdfPage.Page,
})
if err != nil {
return err
}
}
_, err = instance.FPDF_SaveAsCopy(&requests.FPDF_SaveAsCopy{
Document: pdfDoc.Document,
FilePath: &outputPath,
})
if err != nil {
return fmt.Errorf("无法保存 PDF: %v", err)
}
util.CompareFileSize(inputPath, outputPath)
return nil
}
```