mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-15 11:52:14 +01:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b49b35365 | ||
|
|
333ab7066c |
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"reflect"
|
||||||
|
|
||||||
"github.com/barasher/go-exiftool"
|
"github.com/barasher/go-exiftool"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
@@ -109,6 +110,17 @@ func (engine *ExifTool) WriteMetadata(ctx context.Context, logger *zap.Logger, m
|
|||||||
fileMetadata[0].SetString(key, val)
|
fileMetadata[0].SetString(key, val)
|
||||||
case []string:
|
case []string:
|
||||||
fileMetadata[0].SetStrings(key, val)
|
fileMetadata[0].SetStrings(key, val)
|
||||||
|
case []interface{}:
|
||||||
|
// See https://github.com/gotenberg/gotenberg/issues/1048.
|
||||||
|
strings := make([]string, len(val))
|
||||||
|
for i, entry := range val {
|
||||||
|
if str, ok := entry.(string); ok {
|
||||||
|
strings[i] = str
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return fmt.Errorf("write PDF metadata with ExifTool: %s %+v %s %w", key, val, reflect.TypeOf(val), gotenberg.ErrPdfEngineMetadataValueNotSupported)
|
||||||
|
}
|
||||||
|
fileMetadata[0].SetStrings(key, strings)
|
||||||
case bool:
|
case bool:
|
||||||
fileMetadata[0].SetString(key, fmt.Sprintf("%t", val))
|
fileMetadata[0].SetString(key, fmt.Sprintf("%t", val))
|
||||||
case int:
|
case int:
|
||||||
@@ -122,7 +134,7 @@ func (engine *ExifTool) WriteMetadata(ctx context.Context, logger *zap.Logger, m
|
|||||||
// TODO: support more complex cases, e.g., arrays and nested objects
|
// TODO: support more complex cases, e.g., arrays and nested objects
|
||||||
// (limitations in underlying library).
|
// (limitations in underlying library).
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("write PDF metadata with ExifTool: %w", gotenberg.ErrPdfEngineMetadataValueNotSupported)
|
return fmt.Errorf("write PDF metadata with ExifTool: %s %+v %s %w", key, val, reflect.TypeOf(val), gotenberg.ErrPdfEngineMetadataValueNotSupported)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -162,7 +162,20 @@ func TestExiftool_WriteMetadata(t *testing.T) {
|
|||||||
expectError: true,
|
expectError: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
scenario: "gotenberg.ErrPdfEngineMetadataValueNotSupported",
|
scenario: "gotenberg.ErrPdfEngineMetadataValueNotSupported (not string array)",
|
||||||
|
createCopy: true,
|
||||||
|
inputPath: "/tests/test/testdata/pdfengines/sample1.pdf",
|
||||||
|
metadata: map[string]interface{}{
|
||||||
|
"Unsupported": []interface{}{
|
||||||
|
"foo",
|
||||||
|
1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectError: true,
|
||||||
|
expectedError: gotenberg.ErrPdfEngineMetadataValueNotSupported,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: "gotenberg.ErrPdfEngineMetadataValueNotSupported (default)",
|
||||||
createCopy: true,
|
createCopy: true,
|
||||||
inputPath: "/tests/test/testdata/pdfengines/sample1.pdf",
|
inputPath: "/tests/test/testdata/pdfengines/sample1.pdf",
|
||||||
metadata: map[string]interface{}{
|
metadata: map[string]interface{}{
|
||||||
@@ -171,6 +184,24 @@ func TestExiftool_WriteMetadata(t *testing.T) {
|
|||||||
expectError: true,
|
expectError: true,
|
||||||
expectedError: gotenberg.ErrPdfEngineMetadataValueNotSupported,
|
expectedError: gotenberg.ErrPdfEngineMetadataValueNotSupported,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
scenario: "success (interface array to string array)",
|
||||||
|
createCopy: true,
|
||||||
|
inputPath: "/tests/test/testdata/pdfengines/sample1.pdf",
|
||||||
|
metadata: map[string]interface{}{
|
||||||
|
"Keywords": []interface{}{
|
||||||
|
"first",
|
||||||
|
"second",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectMetadata: map[string]interface{}{
|
||||||
|
"Keywords": []interface{}{
|
||||||
|
"first",
|
||||||
|
"second",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectError: false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
scenario: "success",
|
scenario: "success",
|
||||||
createCopy: true,
|
createCopy: true,
|
||||||
|
|||||||
@@ -365,13 +365,6 @@ func (p *libreOfficeProcess) pdf(ctx context.Context, logger *zap.Logger, inputP
|
|||||||
return ErrRuntimeException
|
return ErrRuntimeException
|
||||||
}
|
}
|
||||||
|
|
||||||
// Possible errors:
|
|
||||||
// 1. LibreOffice failed for some reason.
|
|
||||||
// 2. Context done.
|
|
||||||
//
|
|
||||||
// On the second scenario, LibreOffice might not have time to remove some
|
|
||||||
// of its temporary files, as it has been killed without warning. The
|
|
||||||
// garbage collector will delete them for us (if the module is loaded).
|
|
||||||
return fmt.Errorf("convert to PDF: %w", err)
|
return fmt.Errorf("convert to PDF: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user