mirror of
https://github.com/michaelrsweet/pdfio.git
synced 2025-07-15 13:29:56 +02:00
Compare commits
78 Commits
6cb661f0f4
...
v1.4.0
Author | SHA1 | Date | |
---|---|---|---|
6d65a609e5 | |||
e96f9bfa6b | |||
10c15fc281 | |||
fd8427d68a | |||
ed1421287f | |||
aa91b141a8 | |||
5dc68f3285 | |||
52b508bdd2 | |||
41ebe39f3b | |||
62df5f5c78 | |||
a1237db52c | |||
a24fdee335 | |||
e4081f2ba3 | |||
5bc7ebee2c | |||
b872df5a1e | |||
53967552df | |||
f8639fbd64 | |||
9020e92928 | |||
48e6597337 | |||
d4e3bbcf16 | |||
2c8a996875 | |||
3d6d9e3e3e | |||
62fdf48ff9 | |||
294f5e07c5 | |||
4baafde74b | |||
2d175fdf70 | |||
56a0f290aa | |||
2e5319a623 | |||
d3d6683041 | |||
0d08dd5f1b | |||
00c9905317 | |||
b8b9d7ef8a | |||
63cdb13b1b | |||
72e55b5bd1 | |||
dc65eb8d2f | |||
a39b01ec9c | |||
4b29c9a1c2 | |||
5a4afad566 | |||
7a45adb7f5 | |||
45ac66874c | |||
eb9dad9b51 | |||
2ecb9cfb2d | |||
91a467e55c | |||
d705d7eb5d | |||
55745bcea8 | |||
2ea99597cc | |||
a3a3512ed8 | |||
afac83530f | |||
21ac2b52d1 | |||
21b8e3b06f | |||
91392a931f | |||
1d8bcf4d73 | |||
1e55779906 | |||
0e45e49ea4 | |||
0ab291a78b | |||
cac6d4891c | |||
4f29ad89da | |||
9c04d1dc20 | |||
335472023e | |||
25834e07ef | |||
2d2a7126d2 | |||
df1064ff39 | |||
853fa4fe8f | |||
2cadfd8a1e | |||
f5d40a305e | |||
eb5be57b4a | |||
3de47ea63d | |||
8f2c47cb07 | |||
74dfefdcc1 | |||
ee31096019 | |||
121b933307 | |||
f4409146e3 | |||
4312933409 | |||
a19949834b | |||
04c4f44324 | |||
206f75403a | |||
7d22477917 | |||
7c3651671b |
8
.gitignore
vendored
8
.gitignore
vendored
@ -1,5 +1,6 @@
|
|||||||
*.1.dylib
|
*.1.dylib
|
||||||
*.a
|
*.a
|
||||||
|
*.dSYM
|
||||||
*.log
|
*.log
|
||||||
*.o
|
*.o
|
||||||
*.so.1
|
*.so.1
|
||||||
@ -8,14 +9,19 @@
|
|||||||
/autom4te.cache
|
/autom4te.cache
|
||||||
/config.log
|
/config.log
|
||||||
/config.status
|
/config.status
|
||||||
|
/configure~
|
||||||
/doc/pdfio.epub
|
/doc/pdfio.epub
|
||||||
|
/examples/code128
|
||||||
|
/examples/image2pdf
|
||||||
|
/examples/md2pdf
|
||||||
|
/examples/pdf2text
|
||||||
|
/examples/pdfioinfo
|
||||||
/Makefile
|
/Makefile
|
||||||
/packages
|
/packages
|
||||||
/pdfio.pc
|
/pdfio.pc
|
||||||
/pdfio.xcodeproj/xcshareddata
|
/pdfio.xcodeproj/xcshareddata
|
||||||
/pdfio-*.tar.gz*
|
/pdfio-*.tar.gz*
|
||||||
/pdfio-*.zip*
|
/pdfio-*.zip*
|
||||||
/pdfiototext
|
|
||||||
/testpdfio
|
/testpdfio
|
||||||
/testpdfio-*.pdf
|
/testpdfio-*.pdf
|
||||||
/testttf
|
/testttf
|
||||||
|
19
CHANGES.md
19
CHANGES.md
@ -2,10 +2,27 @@ Changes in PDFio
|
|||||||
================
|
================
|
||||||
|
|
||||||
|
|
||||||
v1.3.2 - YYYY-MM-DD
|
v1.4.0 - YYYY-MM-DD
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
- Added new `pdfioDictGetKey` and `pdfioDictGetNumPairs` APIs (Issue #63)
|
||||||
|
- Added new `pdfioArrayRemove` and `pdfioDictClear` APIs (Issue #74)
|
||||||
|
- Added new `pdfioFileCreateNameObj` and `pdfioObjGetName` APIs for creating and
|
||||||
|
getting name object values (Issue #76)
|
||||||
|
- Updated documentation (Issue #78)
|
||||||
|
- Updated `pdfioContentTextMeasure` to support measuring PDF base fonts created
|
||||||
|
with `pdfioFileCreateFontObjFromBase` (Issue #84)
|
||||||
|
- Fixed reading of PDF files whose trailer is missing a newline (Issue #80)
|
||||||
|
- Fixed builds with some versions of VC++ (Issue #81)
|
||||||
|
- Fixed validation of date/time values (Issue #83)
|
||||||
|
|
||||||
|
|
||||||
|
v1.3.2 - 2024-08-15
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
- Added some more sanity checks to the TrueType font reader.
|
- Added some more sanity checks to the TrueType font reader.
|
||||||
|
- Updated documentation (Issue #77)
|
||||||
|
- Fixed an issue when opening certain encrypted PDF files (Issue #62)
|
||||||
|
|
||||||
|
|
||||||
v1.3.1 - 2024-08-05
|
v1.3.1 - 2024-08-05
|
||||||
|
18
EXAMPLES.md
Normal file
18
EXAMPLES.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
PDFio Examples
|
||||||
|
==============
|
||||||
|
|
||||||
|
The "examples" subdirectory contains example code showing how to do different
|
||||||
|
things with PDFio.
|
||||||
|
|
||||||
|
|
||||||
|
code128.c
|
||||||
|
---------
|
||||||
|
|
||||||
|
This example shows how to embed and use a barcode font.
|
||||||
|
|
||||||
|
|
||||||
|
md2pdf.c
|
||||||
|
--------
|
||||||
|
|
||||||
|
This example shows how to generate pages with multiple fonts, embedded images,
|
||||||
|
and headers and footers.
|
37
Makefile.in
37
Makefile.in
@ -103,15 +103,33 @@ LIBOBJS = \
|
|||||||
ttf.o
|
ttf.o
|
||||||
OBJS = \
|
OBJS = \
|
||||||
$(LIBOBJS) \
|
$(LIBOBJS) \
|
||||||
pdfiototext.o \
|
|
||||||
testpdfio.o \
|
testpdfio.o \
|
||||||
testttf.o
|
testttf.o
|
||||||
TARGETS = \
|
TARGETS = \
|
||||||
$(LIBPDFIO) \
|
$(LIBPDFIO) \
|
||||||
$(LIBPDFIO_STATIC) \
|
$(LIBPDFIO_STATIC) \
|
||||||
pdfiototext \
|
|
||||||
testpdfio \
|
testpdfio \
|
||||||
testttf
|
testttf
|
||||||
|
DOCFILES = \
|
||||||
|
doc/pdfio.html \
|
||||||
|
doc/pdfio-512.png \
|
||||||
|
LICENSE \
|
||||||
|
NOTICE
|
||||||
|
EXAMPLES = \
|
||||||
|
examples/Makefile \
|
||||||
|
examples/Roboto-Bold.ttf \
|
||||||
|
examples/Roboto-Italic.ttf \
|
||||||
|
examples/Roboto-Regular.ttf \
|
||||||
|
examples/RobotoMono-Regular.ttf \
|
||||||
|
examples/code128.c \
|
||||||
|
examples/code128.ttf \
|
||||||
|
examples/image2pdf.c \
|
||||||
|
examples/md2pdf.c \
|
||||||
|
examples/md2pdf.md \
|
||||||
|
examples/mmd.c \
|
||||||
|
examples/mmd.h \
|
||||||
|
examples/pdf2text.c \
|
||||||
|
examples/pdfioinfo.c
|
||||||
|
|
||||||
|
|
||||||
# Make everything
|
# Make everything
|
||||||
@ -152,9 +170,14 @@ install: $(TARGETS)
|
|||||||
$(INSTALL) -c -m 644 pdfio.pc $(BUILDROOT)$(libdir)/pkgconfig
|
$(INSTALL) -c -m 644 pdfio.pc $(BUILDROOT)$(libdir)/pkgconfig
|
||||||
echo Installing documentation to $(BUILDROOT)$(datadir)/doc/pdfio...
|
echo Installing documentation to $(BUILDROOT)$(datadir)/doc/pdfio...
|
||||||
$(INSTALL) -d -m 755 $(BUILDROOT)$(datadir)/doc/pdfio
|
$(INSTALL) -d -m 755 $(BUILDROOT)$(datadir)/doc/pdfio
|
||||||
for file in doc/pdfio.html doc/pdfio-512.png LICENSE NOTICE; do \
|
for file in $(DOCFILES); do \
|
||||||
$(INSTALL) -c -m 644 $$file $(BUILDROOT)$(datadir)/doc/pdfio; \
|
$(INSTALL) -c -m 644 $$file $(BUILDROOT)$(datadir)/doc/pdfio; \
|
||||||
done
|
done
|
||||||
|
echo Installing examples to $(BUILDROOT)$(datadir)/doc/pdfio/examples...
|
||||||
|
$(INSTALL) -d -m 755 $(BUILDROOT)$(datadir)/doc/pdfio/examples
|
||||||
|
for file in $(EXAMPLES); do \
|
||||||
|
$(INSTALL) -c -m 644 $$file $(BUILDROOT)$(datadir)/doc/pdfio/examples; \
|
||||||
|
done
|
||||||
echo Installing man page to $(BUILDROOT)$(mandir)/man3...
|
echo Installing man page to $(BUILDROOT)$(mandir)/man3...
|
||||||
$(INSTALL) -d -m 755 $(BUILDROOT)$(mandir)/man3
|
$(INSTALL) -d -m 755 $(BUILDROOT)$(mandir)/man3
|
||||||
$(INSTALL) -c -m 644 doc/pdfio.3 $(BUILDROOT)$(mandir)/man3
|
$(INSTALL) -c -m 644 doc/pdfio.3 $(BUILDROOT)$(mandir)/man3
|
||||||
@ -201,12 +224,6 @@ pdfio1.def: $(LIBOBJS) Makefile
|
|||||||
grep -v '^_ttf' | sed -e '1,$$s/^_//' | sort >>$@
|
grep -v '^_ttf' | sed -e '1,$$s/^_//' | sort >>$@
|
||||||
|
|
||||||
|
|
||||||
# pdfio text extraction (demo, doesn't handle a lot of things yet)
|
|
||||||
pdfiototext: pdfiototext.o libpdfio.a
|
|
||||||
echo Linking $@...
|
|
||||||
$(CC) $(LDFLAGS) -o $@ pdfiototext.o libpdfio.a $(LIBS)
|
|
||||||
|
|
||||||
|
|
||||||
# pdfio test program
|
# pdfio test program
|
||||||
testpdfio: testpdfio.o libpdfio.a
|
testpdfio: testpdfio.o libpdfio.a
|
||||||
echo Linking $@...
|
echo Linking $@...
|
||||||
@ -258,5 +275,5 @@ clang:
|
|||||||
|
|
||||||
# Analyze code using Cppcheck <http://cppcheck.sourceforge.net>
|
# Analyze code using Cppcheck <http://cppcheck.sourceforge.net>
|
||||||
cppcheck:
|
cppcheck:
|
||||||
cppcheck $(CPPFLAGS) --template=gcc --addon=cert.py --suppressions-list=.cppcheck $(OBJS:.o=.c) 2>cppcheck.log
|
cppcheck $(CPPFLAGS) --template=gcc --suppressions-list=.cppcheck $(OBJS:.o=.c) 2>cppcheck.log
|
||||||
test -s cppcheck.log && (echo "$(GHA_ERROR)Cppcheck detected issues."; echo ""; cat cppcheck.log; exit 1) || exit 0
|
test -s cppcheck.log && (echo "$(GHA_ERROR)Cppcheck detected issues."; echo ""; cat cppcheck.log; exit 1) || exit 0
|
||||||
|
24
configure
vendored
24
configure
vendored
@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.71 for pdfio 1.3.2.
|
# Generated by GNU Autoconf 2.71 for pdfio 1.4.0.
|
||||||
#
|
#
|
||||||
# Report bugs to <https://github.com/michaelrsweet/pdfio/issues>.
|
# Report bugs to <https://github.com/michaelrsweet/pdfio/issues>.
|
||||||
#
|
#
|
||||||
@ -610,8 +610,8 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='pdfio'
|
PACKAGE_NAME='pdfio'
|
||||||
PACKAGE_TARNAME='pdfio'
|
PACKAGE_TARNAME='pdfio'
|
||||||
PACKAGE_VERSION='1.3.2'
|
PACKAGE_VERSION='1.4.0'
|
||||||
PACKAGE_STRING='pdfio 1.3.2'
|
PACKAGE_STRING='pdfio 1.4.0'
|
||||||
PACKAGE_BUGREPORT='https://github.com/michaelrsweet/pdfio/issues'
|
PACKAGE_BUGREPORT='https://github.com/michaelrsweet/pdfio/issues'
|
||||||
PACKAGE_URL='https://www.msweet.org/pdfio'
|
PACKAGE_URL='https://www.msweet.org/pdfio'
|
||||||
|
|
||||||
@ -1293,7 +1293,7 @@ if test "$ac_init_help" = "long"; then
|
|||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures pdfio 1.3.2 to adapt to many kinds of systems.
|
\`configure' configures pdfio 1.4.0 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@ -1359,7 +1359,7 @@ fi
|
|||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of pdfio 1.3.2:";;
|
short | recursive ) echo "Configuration of pdfio 1.4.0:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@ -1456,7 +1456,7 @@ fi
|
|||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
pdfio configure 1.3.2
|
pdfio configure 1.4.0
|
||||||
generated by GNU Autoconf 2.71
|
generated by GNU Autoconf 2.71
|
||||||
|
|
||||||
Copyright (C) 2021 Free Software Foundation, Inc.
|
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||||
@ -1612,7 +1612,7 @@ cat >config.log <<_ACEOF
|
|||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by pdfio $as_me 1.3.2, which was
|
It was created by pdfio $as_me 1.4.0, which was
|
||||||
generated by GNU Autoconf 2.71. Invocation command line was
|
generated by GNU Autoconf 2.71. Invocation command line was
|
||||||
|
|
||||||
$ $0$ac_configure_args_raw
|
$ $0$ac_configure_args_raw
|
||||||
@ -2368,9 +2368,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
PDFIO_VERSION="1.3.2"
|
PDFIO_VERSION="1.4.0"
|
||||||
PDFIO_VERSION_MAJOR="`echo 1.3.2 | awk -F. '{print $1}'`"
|
PDFIO_VERSION_MAJOR="`echo 1.4.0 | awk -F. '{print $1}'`"
|
||||||
PDFIO_VERSION_MINOR="`echo 1.3.2 | awk -F. '{printf("%d\n",$2);}'`"
|
PDFIO_VERSION_MINOR="`echo 1.4.0 | awk -F. '{printf("%d\n",$2);}'`"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -4935,7 +4935,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by pdfio $as_me 1.3.2, which was
|
This file was extended by pdfio $as_me 1.4.0, which was
|
||||||
generated by GNU Autoconf 2.71. Invocation command line was
|
generated by GNU Autoconf 2.71. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@ -4991,7 +4991,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
|
|||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config='$ac_cs_config_escaped'
|
ac_cs_config='$ac_cs_config_escaped'
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
pdfio config.status 1.3.2
|
pdfio config.status 1.4.0
|
||||||
configured by $0, generated by GNU Autoconf 2.71,
|
configured by $0, generated by GNU Autoconf 2.71,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ AC_PREREQ([2.70])
|
|||||||
|
|
||||||
|
|
||||||
dnl Package name and version...
|
dnl Package name and version...
|
||||||
AC_INIT([pdfio], [1.3.2], [https://github.com/michaelrsweet/pdfio/issues], [pdfio], [https://www.msweet.org/pdfio])
|
AC_INIT([pdfio], [1.4.0], [https://github.com/michaelrsweet/pdfio/issues], [pdfio], [https://www.msweet.org/pdfio])
|
||||||
|
|
||||||
PDFIO_VERSION="AC_PACKAGE_VERSION"
|
PDFIO_VERSION="AC_PACKAGE_VERSION"
|
||||||
PDFIO_VERSION_MAJOR="`echo AC_PACKAGE_VERSION | awk -F. '{print $1}'`"
|
PDFIO_VERSION_MAJOR="`echo AC_PACKAGE_VERSION | awk -F. '{print $1}'`"
|
||||||
|
1429
doc/pdfio.3
1429
doc/pdfio.3
File diff suppressed because it is too large
Load Diff
1261
doc/pdfio.html
1261
doc/pdfio.html
File diff suppressed because it is too large
Load Diff
1464
doc/pdfio.md
1464
doc/pdfio.md
File diff suppressed because it is too large
Load Diff
65
examples/Makefile
Normal file
65
examples/Makefile
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#
|
||||||
|
# Makefile for PDFio examples.
|
||||||
|
#
|
||||||
|
# Copyright © 2024 by Michael R Sweet.
|
||||||
|
#
|
||||||
|
# Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
|
# information.
|
||||||
|
#
|
||||||
|
|
||||||
|
# POSIX makefile
|
||||||
|
.POSIX:
|
||||||
|
|
||||||
|
|
||||||
|
# Common options
|
||||||
|
CFLAGS = -g $(CPPFLAGS)
|
||||||
|
#CFLAGS = -g -fsanitize=address $(CPPFLAGS)
|
||||||
|
CPPFLAGS = -I.. -I/usr/local/include
|
||||||
|
LIBS = -L.. -L/usr/local/lib -lpdfio -lz
|
||||||
|
|
||||||
|
|
||||||
|
# Targets
|
||||||
|
TARGETS = \
|
||||||
|
code128 \
|
||||||
|
image2pdf \
|
||||||
|
md2pdf \
|
||||||
|
pdf2text \
|
||||||
|
pdfioinfo
|
||||||
|
|
||||||
|
|
||||||
|
# Make everything
|
||||||
|
all: $(TARGETS)
|
||||||
|
|
||||||
|
|
||||||
|
# Clean everything
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGETS)
|
||||||
|
|
||||||
|
|
||||||
|
# code128
|
||||||
|
code128: code128.c
|
||||||
|
$(CC) $(CFLAGS) -o $@ code128.c $(LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
# image2pdf
|
||||||
|
image2pdf: image2pdf.c
|
||||||
|
$(CC) $(CFLAGS) -o $@ image2pdf.c $(LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
# md2pdf
|
||||||
|
md2pdf: md2pdf.c mmd.c mmd.h
|
||||||
|
$(CC) $(CFLAGS) -o $@ md2pdf.c mmd.c $(LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
# pdfio text extraction (demo, doesn't handle a lot of things yet)
|
||||||
|
pdf2text: pdf2text.c
|
||||||
|
$(CC) $(CFLAGS) -o $@ pdf2text.c $(LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
# pdfioinfo
|
||||||
|
pdfioinfo: pdfioinfo.c
|
||||||
|
$(CC) $(CFLAGS) -o $@ pdfioinfo.c $(LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
# Common dependencies...
|
||||||
|
$(TARGETS): Makefile ../pdfio.h ../pdfio-content.h
|
BIN
examples/Roboto-Bold.ttf
Normal file
BIN
examples/Roboto-Bold.ttf
Normal file
Binary file not shown.
BIN
examples/Roboto-Italic.ttf
Normal file
BIN
examples/Roboto-Italic.ttf
Normal file
Binary file not shown.
BIN
examples/Roboto-Regular.ttf
Normal file
BIN
examples/Roboto-Regular.ttf
Normal file
Binary file not shown.
BIN
examples/RobotoMono-Regular.ttf
Normal file
BIN
examples/RobotoMono-Regular.ttf
Normal file
Binary file not shown.
208
examples/code128.c
Normal file
208
examples/code128.c
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
//
|
||||||
|
// Code 128 barcode example for PDFio.
|
||||||
|
//
|
||||||
|
// Copyright © 2024 by Michael R Sweet.
|
||||||
|
//
|
||||||
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
//
|
||||||
|
// ./code128 "BARCODE" ["TEXT"] >FILENAME.pdf
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <pdfio.h>
|
||||||
|
#include <pdfio-content.h>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'make_code128()' - Make a Code 128 barcode string.
|
||||||
|
//
|
||||||
|
// This function produces a Code B (printable ASCII) representation of the
|
||||||
|
// source string and doesn't try to optimize using Code C. Non-printable and
|
||||||
|
// extended characters are ignored in the source string.
|
||||||
|
//
|
||||||
|
|
||||||
|
static char * // O - Output string
|
||||||
|
make_code128(char *dst, // I - Destination buffer
|
||||||
|
const char *src, // I - Source string
|
||||||
|
size_t dstsize) // I - Size of destination buffer
|
||||||
|
{
|
||||||
|
char *dstptr, // Pointer into destination buffer
|
||||||
|
*dstend; // End of destination buffer
|
||||||
|
int sum; // Weighted sum
|
||||||
|
static const char *code128_chars = // Code 128 characters
|
||||||
|
" !\"#$%&'()*+,-./0123456789:;<=>?"
|
||||||
|
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
|
||||||
|
"`abcdefghijklmnopqrstuvwxyz{|}~\303"
|
||||||
|
"\304\305\306\307\310\311\312";
|
||||||
|
static const char code128_fnc_3 = '\304';
|
||||||
|
// FNC 3
|
||||||
|
static const char code128_fnc_2 = '\305';
|
||||||
|
// FNC 2
|
||||||
|
static const char code128_shift_b = '\306';
|
||||||
|
// Shift B (for lowercase)
|
||||||
|
static const char code128_code_c = '\307';
|
||||||
|
// Code C
|
||||||
|
static const char code128_code_b = '\310';
|
||||||
|
// Code B
|
||||||
|
static const char code128_fnc_4 = '\311';
|
||||||
|
// FNC 4
|
||||||
|
static const char code128_fnc_1 = '\312';
|
||||||
|
// FNC 1
|
||||||
|
static const char code128_start_code_a = '\313';
|
||||||
|
// Start code A
|
||||||
|
static const char code128_start_code_b = '\314';
|
||||||
|
// Start code B
|
||||||
|
static const char code128_start_code_c = '\315';
|
||||||
|
// Start code C
|
||||||
|
static const char code128_stop = '\316';
|
||||||
|
// Stop pattern
|
||||||
|
|
||||||
|
|
||||||
|
// Start a Code B barcode...
|
||||||
|
dstptr = dst;
|
||||||
|
dstend = dst + dstsize - 3;
|
||||||
|
|
||||||
|
*dstptr++ = code128_start_code_b;
|
||||||
|
sum = code128_start_code_b - 100;
|
||||||
|
|
||||||
|
while (*src && dstptr < dstend)
|
||||||
|
{
|
||||||
|
if (*src >= ' ' && *src < 0x7f)
|
||||||
|
{
|
||||||
|
sum += (dstptr - dst) * (*src - ' ');
|
||||||
|
*dstptr++ = *src;
|
||||||
|
}
|
||||||
|
|
||||||
|
src ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the weighted sum modulo 103
|
||||||
|
*dstptr++ = code128_chars[sum % 103];
|
||||||
|
|
||||||
|
// Add the stop pattern and return...
|
||||||
|
*dstptr++ = code128_stop;
|
||||||
|
*dstptr = '\0';
|
||||||
|
|
||||||
|
return (dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'output_cb()' - Write PDF data to the standard output...
|
||||||
|
//
|
||||||
|
|
||||||
|
static ssize_t // O - Number of bytes written
|
||||||
|
output_cb(void *output_cbdata, // I - Callback data (not used)
|
||||||
|
const void *buffer, // I - Buffer to write
|
||||||
|
size_t bytes) // I - Number of bytes to write
|
||||||
|
{
|
||||||
|
(void)output_cbdata;
|
||||||
|
|
||||||
|
return ((ssize_t)fwrite(buffer, 1, bytes, stdout));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'main()' - Produce a single-page barcode file.
|
||||||
|
//
|
||||||
|
|
||||||
|
int // O - Exit status
|
||||||
|
main(int argc, // I - Number of command-line arguments
|
||||||
|
char *argv[]) // I - Command-line arguments
|
||||||
|
{
|
||||||
|
const char *barcode, // Barcode to show
|
||||||
|
*text; // Text to display under barcode
|
||||||
|
pdfio_file_t *pdf; // Output PDF file
|
||||||
|
pdfio_obj_t *barcode_font; // Barcode font object
|
||||||
|
pdfio_obj_t *text_font = NULL; // Text font object
|
||||||
|
pdfio_dict_t *page_dict; // Page dictionary
|
||||||
|
pdfio_rect_t media_box; // Media/CropBox for page
|
||||||
|
pdfio_stream_t *page_st; // Page stream
|
||||||
|
char barcode_temp[256]; // Barcode buffer
|
||||||
|
double barcode_height = 36.0, // Height of barcode
|
||||||
|
barcode_width, // Width of barcode
|
||||||
|
text_height = 0.0, // Height of text
|
||||||
|
text_width = 0.0; // Width of text
|
||||||
|
|
||||||
|
|
||||||
|
// Get the barcode and optional text from the command-line...
|
||||||
|
if (argc < 2 || argc > 3)
|
||||||
|
{
|
||||||
|
fputs("Usage: code128 \"BARCODE\" [\"TEXT\"] >FILENAME.pdf\n", stderr);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
barcode = argv[1];
|
||||||
|
text = argv[2];
|
||||||
|
|
||||||
|
// Output a PDF file to the standard output...
|
||||||
|
#ifdef _WIN32
|
||||||
|
setmode(1, O_BINARY); // Force binary output on Windows
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
|
if ((pdf = pdfioFileCreateOutput(output_cb, /*output_cbdata*/NULL, /*version*/NULL, /*media_box*/NULL, /*crop_box*/NULL, /*error_cb*/NULL, /*error_data*/NULL)) == NULL)
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
// Load fonts...
|
||||||
|
barcode_font = pdfioFileCreateFontObjFromFile(pdf, "code128.ttf", /*unicode*/false);
|
||||||
|
if (text)
|
||||||
|
text_font = pdfioFileCreateFontObjFromBase(pdf, "Helvetica");
|
||||||
|
|
||||||
|
// Generate Code128 characters for the desired barcode...
|
||||||
|
if (!(barcode[0] & 0x80))
|
||||||
|
barcode = make_code128(barcode_temp, barcode, sizeof(barcode_temp));
|
||||||
|
|
||||||
|
// Compute sizes of the text...
|
||||||
|
barcode_width = pdfioContentTextMeasure(barcode_font, barcode, barcode_height);
|
||||||
|
if (text && text_font)
|
||||||
|
{
|
||||||
|
text_height = 9.0;
|
||||||
|
text_width = pdfioContentTextMeasure(text_font, text, text_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the size of the PDF page...
|
||||||
|
media_box.x1 = 0.0;
|
||||||
|
media_box.y1 = 0.0;
|
||||||
|
media_box.x2 = (barcode_width > text_width ? barcode_width : text_width) + 18.0;
|
||||||
|
media_box.y2 = barcode_height + text_height + 18.0;
|
||||||
|
|
||||||
|
// Start a page for the barcode...
|
||||||
|
page_dict = pdfioDictCreate(pdf);
|
||||||
|
|
||||||
|
pdfioDictSetRect(page_dict, "MediaBox", &media_box);
|
||||||
|
pdfioDictSetRect(page_dict, "CropBox", &media_box);
|
||||||
|
|
||||||
|
pdfioPageDictAddFont(page_dict, "B128", barcode_font);
|
||||||
|
if (text_font)
|
||||||
|
pdfioPageDictAddFont(page_dict, "TEXT", text_font);
|
||||||
|
|
||||||
|
page_st = pdfioFileCreatePage(pdf, page_dict);
|
||||||
|
|
||||||
|
// Draw the page...
|
||||||
|
pdfioContentSetFillColorGray(page_st, 0.0);
|
||||||
|
|
||||||
|
pdfioContentSetTextFont(page_st, "B128", barcode_height);
|
||||||
|
pdfioContentTextBegin(page_st);
|
||||||
|
pdfioContentTextMoveTo(page_st, 0.5 * (media_box.x2 - barcode_width), 9.0 + text_height);
|
||||||
|
pdfioContentTextShow(page_st, /*unicode*/false, barcode);
|
||||||
|
pdfioContentTextEnd(page_st);
|
||||||
|
|
||||||
|
if (text && text_font)
|
||||||
|
{
|
||||||
|
pdfioContentSetTextFont(page_st, "TEXT", text_height);
|
||||||
|
pdfioContentTextBegin(page_st);
|
||||||
|
pdfioContentTextMoveTo(page_st, 0.5 * (media_box.x2 - text_width), 9.0);
|
||||||
|
pdfioContentTextShow(page_st, /*unicode*/false, text);
|
||||||
|
pdfioContentTextEnd(page_st);
|
||||||
|
}
|
||||||
|
|
||||||
|
pdfioStreamClose(page_st);
|
||||||
|
|
||||||
|
// Close and return...
|
||||||
|
pdfioFileClose(pdf);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
BIN
examples/code128.ttf
Normal file
BIN
examples/code128.ttf
Normal file
Binary file not shown.
139
examples/image2pdf.c
Normal file
139
examples/image2pdf.c
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
//
|
||||||
|
// Image example for PDFio.
|
||||||
|
//
|
||||||
|
// Copyright © 2023-2024 by Michael R Sweet.
|
||||||
|
//
|
||||||
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
//
|
||||||
|
// ./image2pdf FILENAME.{jpg,png} FILENAME.pdf ["TEXT"]
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <pdfio.h>
|
||||||
|
#include <pdfio-content.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'create_pdf_image_file()' - Create a PDF file of an image with optional caption.
|
||||||
|
//
|
||||||
|
|
||||||
|
bool // O - True on success, false on failure
|
||||||
|
create_pdf_image_file(
|
||||||
|
const char *pdfname, // I - PDF filename
|
||||||
|
const char *imagename, // I - Image filename
|
||||||
|
const char *caption) // I - Caption filename
|
||||||
|
{
|
||||||
|
pdfio_file_t *pdf; // PDF file
|
||||||
|
pdfio_obj_t *font; // Caption font
|
||||||
|
pdfio_obj_t *image; // Image
|
||||||
|
pdfio_dict_t *dict; // Page dictionary
|
||||||
|
pdfio_stream_t *page; // Page stream
|
||||||
|
double width, height; // Width and height of image
|
||||||
|
double swidth, sheight; // Scaled width and height on page
|
||||||
|
double tx, ty; // Position on page
|
||||||
|
|
||||||
|
|
||||||
|
// Create the PDF file...
|
||||||
|
pdf = pdfioFileCreate(pdfname, /*version*/NULL, /*media_box*/NULL,
|
||||||
|
/*crop_box*/NULL, /*error_cb*/NULL,
|
||||||
|
/*error_cbdata*/NULL);
|
||||||
|
if (!pdf)
|
||||||
|
return (false);
|
||||||
|
|
||||||
|
// Create a Courier base font for the caption
|
||||||
|
font = pdfioFileCreateFontObjFromBase(pdf, "Courier");
|
||||||
|
|
||||||
|
if (!font)
|
||||||
|
{
|
||||||
|
pdfioFileClose(pdf);
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create an image object from the JPEG/PNG image file...
|
||||||
|
image = pdfioFileCreateImageObjFromFile(pdf, imagename, true);
|
||||||
|
|
||||||
|
if (!image)
|
||||||
|
{
|
||||||
|
pdfioFileClose(pdf);
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a page dictionary with the font and image...
|
||||||
|
dict = pdfioDictCreate(pdf);
|
||||||
|
pdfioPageDictAddFont(dict, "F1", font);
|
||||||
|
pdfioPageDictAddImage(dict, "IM1", image);
|
||||||
|
|
||||||
|
// Create the page and its content stream...
|
||||||
|
page = pdfioFileCreatePage(pdf, dict);
|
||||||
|
|
||||||
|
// Position and scale the image on the page...
|
||||||
|
width = pdfioImageGetWidth(image);
|
||||||
|
height = pdfioImageGetHeight(image);
|
||||||
|
|
||||||
|
// Default media_box is "universal" 595.28x792 points (8.27x11in or
|
||||||
|
// 210x279mm). Use margins of 36 points (0.5in or 12.7mm) with another
|
||||||
|
// 36 points for the caption underneath...
|
||||||
|
swidth = 595.28 - 72.0;
|
||||||
|
sheight = swidth * height / width;
|
||||||
|
if (sheight > (792.0 - 36.0 - 72.0))
|
||||||
|
{
|
||||||
|
sheight = 792.0 - 36.0 - 72.0;
|
||||||
|
swidth = sheight * width / height;
|
||||||
|
}
|
||||||
|
|
||||||
|
tx = 0.5 * (595.28 - swidth);
|
||||||
|
ty = 0.5 * (792 - 36 - sheight);
|
||||||
|
|
||||||
|
pdfioContentDrawImage(page, "IM1", tx, ty + 36.0, swidth, sheight);
|
||||||
|
|
||||||
|
// Draw the caption in black...
|
||||||
|
pdfioContentSetFillColorDeviceGray(page, 0.0);
|
||||||
|
|
||||||
|
// Compute the starting point for the text - Courier is monospaced
|
||||||
|
// with a nominal width of 0.6 times the text height...
|
||||||
|
tx = 0.5 * (595.28 - 18.0 * 0.6 * strlen(caption));
|
||||||
|
|
||||||
|
// Position and draw the caption underneath...
|
||||||
|
pdfioContentTextBegin(page);
|
||||||
|
pdfioContentSetTextFont(page, "F1", 18.0);
|
||||||
|
pdfioContentTextMoveTo(page, tx, ty);
|
||||||
|
pdfioContentTextShow(page, /*unicode*/false, caption);
|
||||||
|
pdfioContentTextEnd(page);
|
||||||
|
|
||||||
|
// Close the page stream and the PDF file...
|
||||||
|
pdfioStreamClose(page);
|
||||||
|
pdfioFileClose(pdf);
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'main()' - Produce a single-page file from an image.
|
||||||
|
//
|
||||||
|
|
||||||
|
int // O - Exit status
|
||||||
|
main(int argc, // I - Number of command-line arguments
|
||||||
|
char *argv[]) // I - Command-line arguments
|
||||||
|
{
|
||||||
|
const char *imagefile, // Image filename
|
||||||
|
*pdffile, // PDF filename
|
||||||
|
*caption; // Caption text
|
||||||
|
|
||||||
|
|
||||||
|
// Get the image file, PDF file, and optional caption text from the command-line...
|
||||||
|
if (argc < 3 || argc > 4)
|
||||||
|
{
|
||||||
|
fputs("Usage: image2pdf FILENAME.{jpg,png} FILENAME.pdf [\"TEXT\"]\n", stderr);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
imagefile = argv[1];
|
||||||
|
pdffile = argv[2];
|
||||||
|
caption = argv[3];
|
||||||
|
|
||||||
|
return (create_pdf_image_file(imagefile, pdffile, caption) ? 0 : 1);
|
||||||
|
}
|
1865
examples/md2pdf.c
Normal file
1865
examples/md2pdf.c
Normal file
File diff suppressed because it is too large
Load Diff
84
examples/md2pdf.md
Normal file
84
examples/md2pdf.md
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
title: Markdown to PDF Converter Test File
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
Markdown to PDF Converter Test File
|
||||||
|
===================================
|
||||||
|
|
||||||
|
The `md2pdf` program is organized into three source files: `md2pdf.c` which
|
||||||
|
contains the code to format the markdown content and `mmd.h` and `mmd.c` (from
|
||||||
|
the [Miniature Markdown Library][MMD] project) which load the markdown content.
|
||||||
|
|
||||||
|
[MMD]: https://www.msweet.org/mmd/
|
||||||
|
|
||||||
|
This is a test file for `md2pdf`. Here is a bullet list:
|
||||||
|
|
||||||
|
- Embed base and TrueType fonts,
|
||||||
|
- Format text with embedded JPEG and PNG images and check boxes, with support
|
||||||
|
for wrapping, alignment in table cells, leader text (as used for lists), and
|
||||||
|
variable line height,
|
||||||
|
- Add headers and footers, and
|
||||||
|
- Add hyperlinks and document platform.
|
||||||
|
|
||||||
|
And here is an ordered list:
|
||||||
|
|
||||||
|
1. Embed base and TrueType fonts,
|
||||||
|
2. Format text with embedded JPEG and PNG images and check boxes, with support
|
||||||
|
for wrapping, alignment in table cells, leader text (as used for lists), and
|
||||||
|
variable line height,
|
||||||
|
3. Add headers and footers, and
|
||||||
|
4. Add hyperlinks and document platform.
|
||||||
|
|
||||||
|
|
||||||
|
Code Blocks
|
||||||
|
-----------
|
||||||
|
|
||||||
|
```
|
||||||
|
0 1 2 3 4 5 6 7 8
|
||||||
|
12345678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Images
|
||||||
|
------
|
||||||
|
|
||||||
|
PDFio book cover image:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
Tables
|
||||||
|
------
|
||||||
|
|
||||||
|
Table with leading/trailing pipes:
|
||||||
|
|
||||||
|
| Heading 1 | Heading 2 | Heading 3 |
|
||||||
|
| --------- | --------- | --------- |
|
||||||
|
| Cell 1,1 | Cell 1,2 | Cell 1,3 |
|
||||||
|
| Cell 2,1 | Cell 2,2 | Cell 2,3 |
|
||||||
|
| Cell 3,1 | Cell 3,2 | Cell 3,3 |
|
||||||
|
|
||||||
|
Table without leading/trailing pipes:
|
||||||
|
|
||||||
|
Heading 1 | Heading 2 | Heading 3
|
||||||
|
--------- | --------- | ---------
|
||||||
|
Cell 1,1 | Cell 1,2 | Cell 1,3
|
||||||
|
Cell 2,1 | Cell 2,2 | Cell 2,3
|
||||||
|
Cell 3,1 | Cell 3,2 | Cell 3,3
|
||||||
|
|
||||||
|
Table with alignment:
|
||||||
|
|
||||||
|
Left Alignment | Center Alignment | Right Alignment
|
||||||
|
:-------- | :-------: | --------:
|
||||||
|
Cell 1,1 | Cell 1,2 | 1
|
||||||
|
Cell 2,1 | Cell 2,2 | 12
|
||||||
|
Cell 3,1 | Cell 3,2 | 123
|
||||||
|
|
||||||
|
Table in block quote:
|
||||||
|
|
||||||
|
> Heading 1 | Heading 2 | Heading 3
|
||||||
|
> --------- | --------- | ---------
|
||||||
|
> Cell 1,1 | Cell 1,2 | Cell 1,3
|
||||||
|
> Cell 2,1 | Cell 2,2 | Cell 2,3
|
||||||
|
> Cell 3,1 | Cell 3,2 | Cell 3,3
|
2381
examples/mmd.c
Normal file
2381
examples/mmd.c
Normal file
File diff suppressed because it is too large
Load Diff
112
examples/mmd.h
Normal file
112
examples/mmd.h
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
//
|
||||||
|
// Header file for miniature markdown library.
|
||||||
|
//
|
||||||
|
// https://www.msweet.org/mmd
|
||||||
|
//
|
||||||
|
// Copyright © 2017-2024 by Michael R Sweet.
|
||||||
|
//
|
||||||
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MMD_H
|
||||||
|
# define MMD_H
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <stdbool.h>
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
# endif // __cplusplus
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constants...
|
||||||
|
//
|
||||||
|
|
||||||
|
enum mmd_option_e
|
||||||
|
{
|
||||||
|
MMD_OPTION_NONE = 0x00, // No markdown extensions
|
||||||
|
MMD_OPTION_METADATA = 0x01, // Jekyll metadata extension
|
||||||
|
MMD_OPTION_TABLES = 0x02, // Github table extension
|
||||||
|
MMD_OPTION_TASKS = 0x04, // Github task item extension (check boxes)
|
||||||
|
MMD_OPTION_ALL = 0x07 // All supported markdown extensions
|
||||||
|
};
|
||||||
|
typedef unsigned mmd_option_t;
|
||||||
|
|
||||||
|
typedef enum mmd_type_e
|
||||||
|
{
|
||||||
|
MMD_TYPE_NONE = -1,
|
||||||
|
MMD_TYPE_DOCUMENT, // The document root
|
||||||
|
MMD_TYPE_METADATA, // Document metadata
|
||||||
|
MMD_TYPE_BLOCK_QUOTE, // <blockquote>
|
||||||
|
MMD_TYPE_ORDERED_LIST, // <ol>
|
||||||
|
MMD_TYPE_UNORDERED_LIST, // <ul>
|
||||||
|
MMD_TYPE_LIST_ITEM, // <li>
|
||||||
|
MMD_TYPE_TABLE, // <table>
|
||||||
|
MMD_TYPE_TABLE_HEADER, // <thead>
|
||||||
|
MMD_TYPE_TABLE_BODY, // <tbody>
|
||||||
|
MMD_TYPE_TABLE_ROW, // <tr>
|
||||||
|
MMD_TYPE_HEADING_1 = 10, // <h1>
|
||||||
|
MMD_TYPE_HEADING_2, // <h2>
|
||||||
|
MMD_TYPE_HEADING_3, // <h3>
|
||||||
|
MMD_TYPE_HEADING_4, // <h4>
|
||||||
|
MMD_TYPE_HEADING_5, // <h5>
|
||||||
|
MMD_TYPE_HEADING_6, // <h6>
|
||||||
|
MMD_TYPE_PARAGRAPH, // <p>
|
||||||
|
MMD_TYPE_CODE_BLOCK, // <pre><code>
|
||||||
|
MMD_TYPE_THEMATIC_BREAK, // <hr />
|
||||||
|
MMD_TYPE_TABLE_HEADER_CELL, // <th>
|
||||||
|
MMD_TYPE_TABLE_BODY_CELL_LEFT, // <td align="left">
|
||||||
|
MMD_TYPE_TABLE_BODY_CELL_CENTER, // <td align="center">
|
||||||
|
MMD_TYPE_TABLE_BODY_CELL_RIGHT, // <td align="right">
|
||||||
|
MMD_TYPE_NORMAL_TEXT = 100, // Normal text
|
||||||
|
MMD_TYPE_EMPHASIZED_TEXT, // <em>text</em>
|
||||||
|
MMD_TYPE_STRONG_TEXT, // <strong>text</strong>
|
||||||
|
MMD_TYPE_STRUCK_TEXT, // <del>text</del>
|
||||||
|
MMD_TYPE_LINKED_TEXT, // <a href="link">text</a>
|
||||||
|
MMD_TYPE_CODE_TEXT, // <code>text</code>
|
||||||
|
MMD_TYPE_IMAGE, // <img src="link" />
|
||||||
|
MMD_TYPE_HARD_BREAK, // <br />
|
||||||
|
MMD_TYPE_SOFT_BREAK, // <wbr />
|
||||||
|
MMD_TYPE_METADATA_TEXT, // name: value
|
||||||
|
MMD_TYPE_CHECKBOX // [ ] or [x]
|
||||||
|
} mmd_type_t;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Types...
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct _mmd_s mmd_t; // Markdown node
|
||||||
|
typedef size_t (*mmd_iocb_t)(void *cbdata, char *buffer, size_t bytes);
|
||||||
|
// mmdLoadIO callback function
|
||||||
|
|
||||||
|
//
|
||||||
|
// Functions...
|
||||||
|
//
|
||||||
|
|
||||||
|
extern char *mmdCopyAllText(mmd_t *node);
|
||||||
|
extern void mmdFree(mmd_t *node);
|
||||||
|
extern const char *mmdGetExtra(mmd_t *node);
|
||||||
|
extern mmd_t *mmdGetFirstChild(mmd_t *node);
|
||||||
|
extern mmd_t *mmdGetLastChild(mmd_t *node);
|
||||||
|
extern const char *mmdGetMetadata(mmd_t *doc, const char *keyword);
|
||||||
|
extern mmd_t *mmdGetNextSibling(mmd_t *node);
|
||||||
|
extern mmd_option_t mmdGetOptions(void);
|
||||||
|
extern mmd_t *mmdGetParent(mmd_t *node);
|
||||||
|
extern mmd_t *mmdGetPrevSibling(mmd_t *node);
|
||||||
|
extern const char *mmdGetText(mmd_t *node);
|
||||||
|
extern mmd_type_t mmdGetType(mmd_t *node);
|
||||||
|
extern const char *mmdGetURL(mmd_t *node);
|
||||||
|
extern bool mmdGetWhitespace(mmd_t *node);
|
||||||
|
extern bool mmdIsBlock(mmd_t *node);
|
||||||
|
extern mmd_t *mmdLoad(mmd_t *root, const char *filename);
|
||||||
|
extern mmd_t *mmdLoadFile(mmd_t *root, FILE *fp);
|
||||||
|
extern mmd_t *mmdLoadIO(mmd_t *root, mmd_iocb_t cb, void *cbdata);
|
||||||
|
extern mmd_t *mmdLoadString(mmd_t *root, const char *s);
|
||||||
|
extern void mmdSetOptions(mmd_option_t options);
|
||||||
|
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
}
|
||||||
|
# endif // __cplusplus
|
||||||
|
#endif // !MMD_H
|
@ -1,17 +1,17 @@
|
|||||||
//
|
//
|
||||||
// PDF to text program for PDFio.
|
// PDF to text program for PDFio.
|
||||||
//
|
//
|
||||||
// Copyright © 2022 by Michael R Sweet.
|
// Copyright © 2022-2024 by Michael R Sweet.
|
||||||
//
|
//
|
||||||
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
// information.
|
// information.
|
||||||
//
|
//
|
||||||
// Usage:
|
// Usage:
|
||||||
//
|
//
|
||||||
// ./pdfiototext FILENAME.pdf > FILENAME.txt
|
// ./pdf2text FILENAME.pdf > FILENAME.txt
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "pdfio.h"
|
#include <pdfio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
@ -36,16 +36,14 @@ main(int argc, // I - Number of command-line arguments
|
|||||||
// Verify command-line arguments...
|
// Verify command-line arguments...
|
||||||
if (argc != 2)
|
if (argc != 2)
|
||||||
{
|
{
|
||||||
puts("Usage: pdfiototext FILENAME.pdf > FILENAME.txt");
|
puts("Usage: pdf2text FILENAME.pdf > FILENAME.txt");
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open the PDF file...
|
// Open the PDF file...
|
||||||
if ((file = pdfioFileOpen(argv[1], NULL, NULL, NULL, NULL)) == NULL)
|
if ((file = pdfioFileOpen(argv[1], /*password_cb*/NULL, /*password_data*/NULL, /*error_cb*/NULL, /*error_data*/NULL)) == NULL)
|
||||||
return (1);
|
return (1);
|
||||||
|
|
||||||
// printf("%s: %u pages\n", argv[1], (unsigned)pdfioFileGetNumPages(file));
|
|
||||||
|
|
||||||
// Try grabbing content from all of the pages...
|
// Try grabbing content from all of the pages...
|
||||||
for (i = 0, num_pages = pdfioFileGetNumPages(file); i < num_pages; i ++)
|
for (i = 0, num_pages = pdfioFileGetNumPages(file); i < num_pages; i ++)
|
||||||
{
|
{
|
||||||
@ -54,29 +52,28 @@ main(int argc, // I - Number of command-line arguments
|
|||||||
|
|
||||||
num_streams = pdfioPageGetNumStreams(obj);
|
num_streams = pdfioPageGetNumStreams(obj);
|
||||||
|
|
||||||
// printf("%s: page%u=%p, num_streams=%u\n", argv[1], (unsigned)i, obj, (unsigned)num_streams);
|
|
||||||
|
|
||||||
for (j = 0; j < num_streams; j ++)
|
for (j = 0; j < num_streams; j ++)
|
||||||
{
|
{
|
||||||
if ((st = pdfioPageOpenStream(obj, j, true)) == NULL)
|
if ((st = pdfioPageOpenStream(obj, j, true)) == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// printf("%s: page%u st%u=%p\n", argv[1], (unsigned)i, (unsigned)j, st);
|
// Read PDF tokens from the page stream...
|
||||||
|
|
||||||
first = true;
|
first = true;
|
||||||
while (pdfioStreamGetToken(st, buffer, sizeof(buffer)))
|
while (pdfioStreamGetToken(st, buffer, sizeof(buffer)))
|
||||||
{
|
{
|
||||||
if (buffer[0] == '(')
|
if (buffer[0] == '(')
|
||||||
{
|
{
|
||||||
|
// Text string using an 8-bit encoding
|
||||||
if (first)
|
if (first)
|
||||||
first = false;
|
first = false;
|
||||||
else
|
else if (buffer[1] != ' ')
|
||||||
putchar(' ');
|
putchar(' ');
|
||||||
|
|
||||||
fputs(buffer + 1, stdout);
|
fputs(buffer + 1, stdout);
|
||||||
}
|
}
|
||||||
else if (!strcmp(buffer, "Td") || !strcmp(buffer, "TD") || !strcmp(buffer, "T*") || !strcmp(buffer, "\'") || !strcmp(buffer, "\""))
|
else if (!strcmp(buffer, "Td") || !strcmp(buffer, "TD") || !strcmp(buffer, "T*") || !strcmp(buffer, "\'") || !strcmp(buffer, "\""))
|
||||||
{
|
{
|
||||||
|
// Text operators that advance to the next line in the block
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
first = true;
|
first = true;
|
||||||
}
|
}
|
65
examples/pdfioinfo.c
Normal file
65
examples/pdfioinfo.c
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
//
|
||||||
|
// PDF metadata example for PDFio.
|
||||||
|
//
|
||||||
|
// Copyright © 2023-2024 by Michael R Sweet.
|
||||||
|
//
|
||||||
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
//
|
||||||
|
// ./pdfioinfo FILENAME.pdf
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <pdfio.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'main()' - Open a PDF file and show its metadata.
|
||||||
|
//
|
||||||
|
|
||||||
|
int // O - Exit status
|
||||||
|
main(int argc, // I - Number of command-line arguments
|
||||||
|
char *argv[]) // Command-line arguments
|
||||||
|
{
|
||||||
|
const char *filename; // PDF filename
|
||||||
|
pdfio_file_t *pdf; // PDF file
|
||||||
|
time_t creation_date; // Creation date
|
||||||
|
struct tm *creation_tm; // Creation date/time information
|
||||||
|
char creation_text[256]; // Creation date/time as a string
|
||||||
|
|
||||||
|
|
||||||
|
// Get the filename from the command-line...
|
||||||
|
if (argc != 2)
|
||||||
|
{
|
||||||
|
fputs("Usage: ./pdfioinfo FILENAME.pdf\n", stderr);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
filename = argv[1];
|
||||||
|
|
||||||
|
// Open the PDF file with the default callbacks...
|
||||||
|
pdf = pdfioFileOpen(filename, /*password_cb*/NULL,
|
||||||
|
/*password_cbdata*/NULL, /*error_cb*/NULL,
|
||||||
|
/*error_cbdata*/NULL);
|
||||||
|
if (pdf == NULL)
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
// Get the creation date and convert to a string...
|
||||||
|
creation_date = pdfioFileGetCreationDate(pdf);
|
||||||
|
creation_tm = localtime(&creation_date);
|
||||||
|
strftime(creation_text, sizeof(creation_text), "%c", creation_tm);
|
||||||
|
|
||||||
|
// Print file information to stdout...
|
||||||
|
printf("%s:\n", filename);
|
||||||
|
printf(" Title: %s\n", pdfioFileGetTitle(pdf));
|
||||||
|
printf(" Author: %s\n", pdfioFileGetAuthor(pdf));
|
||||||
|
printf(" Created On: %s\n", creation_text);
|
||||||
|
printf(" Number Pages: %u\n", (unsigned)pdfioFileGetNumPages(pdf));
|
||||||
|
|
||||||
|
// Close the PDF file...
|
||||||
|
pdfioFileClose(pdf);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
//
|
//
|
||||||
// PDF array functions for PDFio.
|
// PDF array functions for PDFio.
|
||||||
//
|
//
|
||||||
// Copyright © 2021 by Michael R Sweet.
|
// Copyright © 2021-2024 by Michael R Sweet.
|
||||||
//
|
//
|
||||||
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
// information.
|
// information.
|
||||||
@ -363,6 +363,9 @@ _pdfioArrayDebug(pdfio_array_t *a, // I - Array
|
|||||||
_pdfio_value_t *v; // Current value
|
_pdfio_value_t *v; // Current value
|
||||||
|
|
||||||
|
|
||||||
|
if (!a)
|
||||||
|
return;
|
||||||
|
|
||||||
putc('[', fp);
|
putc('[', fp);
|
||||||
for (i = a->num_values, v = a->values; i > 0; i --, v ++)
|
for (i = a->num_values, v = a->values; i > 0; i --, v ++)
|
||||||
_pdfioValueDebug(v, fp);
|
_pdfioValueDebug(v, fp);
|
||||||
@ -634,6 +637,28 @@ _pdfioArrayRead(pdfio_file_t *pdf, // I - PDF file
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'pdfioArrayRemove()' - Remove an array entry.
|
||||||
|
//
|
||||||
|
|
||||||
|
bool // O - `true` on success, `false` otherwise
|
||||||
|
pdfioArrayRemove(pdfio_array_t *a, // I - Array
|
||||||
|
size_t n) // I - Index
|
||||||
|
{
|
||||||
|
if (!a || n >= a->num_values)
|
||||||
|
return (false);
|
||||||
|
|
||||||
|
if (a->values[n].type == PDFIO_VALTYPE_BINARY)
|
||||||
|
free(a->values[n].value.binary.data);
|
||||||
|
|
||||||
|
a->num_values --;
|
||||||
|
if (n < a->num_values)
|
||||||
|
memmove(a->values + n, a->values + n + 1, (a->num_values - n) * sizeof(_pdfio_value_t));
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// '_pdfioArrayWrite()' - Write an array to a PDF file.
|
// '_pdfioArrayWrite()' - Write an array to a PDF file.
|
||||||
//
|
//
|
||||||
|
308
pdfio-base-font-widths.h
Normal file
308
pdfio-base-font-widths.h
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
//
|
||||||
|
// PDF base font widths for PDFio.
|
||||||
|
//
|
||||||
|
// Copyright © 2024 by Michael R Sweet.
|
||||||
|
//
|
||||||
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef PDFIO_BASE_FONT_WIDTHS_H
|
||||||
|
# define PDFIO_BASE_FONT_WIDTHS_H 1
|
||||||
|
|
||||||
|
|
||||||
|
static short courier_bold_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0,
|
||||||
|
600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 0,
|
||||||
|
0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600,
|
||||||
|
0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short courier_boldoblique_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0,
|
||||||
|
600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 0,
|
||||||
|
0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600,
|
||||||
|
0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short courier_oblique_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0,
|
||||||
|
600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 0,
|
||||||
|
0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600,
|
||||||
|
0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short courier_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0,
|
||||||
|
600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 0,
|
||||||
|
0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600,
|
||||||
|
0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
|
||||||
|
600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short helvetica_bold_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278,
|
||||||
|
556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611,
|
||||||
|
975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778,
|
||||||
|
667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556,
|
||||||
|
333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611,
|
||||||
|
611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 0,
|
||||||
|
556, 0, 278, 556, 500, 1000, 556, 556, 333, 1000, 667, 333, 1000, 0, 611, 0,
|
||||||
|
0, 278, 278, 500, 500, 350, 556, 1000, 333, 1000, 556, 333, 944, 0, 500, 667,
|
||||||
|
0, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 584, 737, 333,
|
||||||
|
606, 584, 351, 351, 333, 611, 556, 278, 333, 351, 365, 556, 869, 869, 869, 611,
|
||||||
|
722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278,
|
||||||
|
722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611,
|
||||||
|
556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278,
|
||||||
|
611, 611, 611, 611, 611, 611, 611, 584, 611, 611, 611, 611, 611, 556, 611, 556
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short helvetica_boldoblique_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278,
|
||||||
|
556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611,
|
||||||
|
975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778,
|
||||||
|
667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556,
|
||||||
|
333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611,
|
||||||
|
611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 0,
|
||||||
|
556, 0, 278, 556, 500, 1000, 556, 556, 333, 1000, 667, 333, 1000, 0, 611, 0,
|
||||||
|
0, 278, 278, 500, 500, 350, 556, 1000, 333, 1000, 556, 333, 944, 0, 500, 667,
|
||||||
|
0, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 584, 737, 333,
|
||||||
|
606, 584, 444, 444, 333, 611, 556, 278, 333, 444, 365, 556, 1055, 1055, 1055, 611,
|
||||||
|
722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278,
|
||||||
|
722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611,
|
||||||
|
556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278,
|
||||||
|
611, 611, 611, 611, 611, 611, 611, 584, 611, 611, 611, 611, 611, 556, 611, 556
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short helvetica_oblique_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278,
|
||||||
|
556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556,
|
||||||
|
1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778,
|
||||||
|
667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556,
|
||||||
|
333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556,
|
||||||
|
556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 0,
|
||||||
|
556, 0, 222, 556, 333, 1000, 556, 556, 333, 1000, 667, 333, 1000, 0, 611, 0,
|
||||||
|
0, 222, 222, 333, 333, 350, 556, 1000, 333, 1000, 500, 333, 944, 0, 500, 667,
|
||||||
|
0, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 584, 737, 333,
|
||||||
|
606, 584, 390, 390, 333, 556, 537, 278, 333, 390, 365, 556, 947, 947, 947, 611,
|
||||||
|
667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278,
|
||||||
|
722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611,
|
||||||
|
556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278,
|
||||||
|
556, 556, 556, 556, 556, 556, 556, 584, 611, 556, 556, 556, 556, 500, 556, 500
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short helvetica_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278,
|
||||||
|
556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556,
|
||||||
|
1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778,
|
||||||
|
667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556,
|
||||||
|
333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556,
|
||||||
|
556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 0,
|
||||||
|
556, 0, 222, 556, 333, 1000, 556, 556, 333, 1000, 667, 333, 1000, 0, 611, 0,
|
||||||
|
0, 222, 221, 333, 333, 350, 556, 1000, 333, 1000, 500, 333, 944, 0, 500, 667,
|
||||||
|
0, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 584, 737, 333,
|
||||||
|
606, 584, 351, 351, 333, 556, 537, 278, 333, 351, 365, 556, 869, 869, 869, 611,
|
||||||
|
667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278,
|
||||||
|
722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 666, 666, 611,
|
||||||
|
556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278,
|
||||||
|
556, 556, 556, 556, 556, 556, 556, 584, 611, 556, 556, 556, 556, 500, 555, 500
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short symbol_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
250, 333, 713, 500, 549, 833, 778, 439, 333, 333, 500, 549, 250, 549, 250, 278,
|
||||||
|
500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 549, 549, 549, 444,
|
||||||
|
549, 722, 667, 722, 612, 611, 763, 603, 722, 333, 631, 722, 686, 889, 722, 722,
|
||||||
|
768, 741, 556, 592, 611, 690, 439, 768, 645, 795, 611, 333, 863, 333, 658, 500,
|
||||||
|
500, 631, 549, 549, 494, 439, 521, 411, 603, 329, 603, 549, 549, 576, 521, 549,
|
||||||
|
549, 521, 549, 603, 439, 576, 713, 686, 493, 686, 494, 480, 200, 480, 549, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
762, 620, 247, 549, 167, 713, 500, 753, 753, 753, 753, 1042, 987, 603, 987, 603,
|
||||||
|
400, 549, 411, 549, 549, 713, 494, 460, 549, 549, 549, 549, 1000, 603, 1000, 658,
|
||||||
|
823, 686, 795, 987, 768, 768, 823, 768, 768, 713, 713, 713, 713, 713, 713, 713,
|
||||||
|
768, 713, 790, 790, 890, 823, 549, 250, 713, 603, 603, 1042, 987, 603, 987, 603,
|
||||||
|
494, 329, 790, 790, 786, 713, 384, 384, 384, 384, 384, 384, 494, 494, 494, 494,
|
||||||
|
0, 329, 274, 686, 686, 686, 384, 384, 384, 384, 384, 384, 494, 494, 494, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short times_bold_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
250, 333, 555, 500, 500, 1000, 833, 278, 333, 333, 500, 570, 250, 333, 250, 278,
|
||||||
|
500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500,
|
||||||
|
930, 722, 667, 722, 722, 667, 611, 778, 778, 389, 500, 778, 667, 944, 722, 778,
|
||||||
|
611, 778, 722, 556, 667, 722, 722, 1000, 722, 722, 667, 333, 278, 333, 581, 500,
|
||||||
|
333, 500, 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500,
|
||||||
|
556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 394, 220, 394, 520, 0,
|
||||||
|
500, 0, 333, 500, 500, 1000, 500, 500, 333, 1000, 556, 333, 1000, 0, 667, 0,
|
||||||
|
0, 333, 333, 500, 500, 350, 500, 1000, 333, 1000, 389, 333, 722, 0, 444, 722,
|
||||||
|
0, 333, 500, 500, 500, 500, 220, 500, 333, 747, 300, 500, 570, 570, 747, 333,
|
||||||
|
400, 570, 300, 300, 333, 556, 540, 250, 333, 300, 330, 500, 750, 750, 750, 500,
|
||||||
|
722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 389, 389, 389, 389,
|
||||||
|
722, 722, 778, 778, 778, 778, 778, 570, 778, 722, 722, 722, 722, 722, 611, 556,
|
||||||
|
500, 500, 500, 500, 500, 500, 722, 444, 444, 444, 444, 444, 278, 278, 278, 278,
|
||||||
|
500, 556, 500, 500, 500, 500, 500, 570, 500, 556, 556, 556, 556, 500, 556, 500
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short times_bolditalic_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
250, 389, 555, 500, 500, 833, 778, 278, 333, 333, 500, 570, 250, 333, 250, 278,
|
||||||
|
500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500,
|
||||||
|
832, 667, 667, 667, 722, 667, 667, 722, 778, 389, 500, 667, 611, 889, 722, 722,
|
||||||
|
611, 722, 667, 556, 611, 722, 667, 889, 667, 611, 611, 333, 278, 333, 570, 500,
|
||||||
|
333, 500, 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500,
|
||||||
|
500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 348, 220, 348, 570, 0,
|
||||||
|
500, 0, 333, 500, 500, 1000, 500, 500, 333, 1000, 556, 333, 944, 0, 611, 0,
|
||||||
|
0, 333, 333, 500, 500, 350, 500, 1000, 333, 1000, 389, 333, 722, 0, 389, 611,
|
||||||
|
0, 389, 500, 500, 500, 500, 220, 500, 333, 747, 266, 500, 606, 606, 747, 333,
|
||||||
|
400, 570, 300, 300, 333, 576, 500, 250, 333, 300, 300, 500, 750, 750, 750, 500,
|
||||||
|
667, 667, 667, 667, 667, 667, 944, 667, 667, 667, 667, 667, 389, 389, 389, 389,
|
||||||
|
722, 722, 722, 722, 722, 722, 722, 570, 722, 722, 722, 722, 722, 611, 611, 500,
|
||||||
|
500, 500, 500, 500, 500, 500, 722, 444, 444, 444, 444, 444, 278, 278, 278, 278,
|
||||||
|
500, 556, 500, 500, 500, 500, 500, 570, 500, 556, 556, 556, 556, 444, 500, 444
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short times_italic_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
250, 333, 420, 500, 500, 833, 778, 214, 333, 333, 500, 675, 250, 333, 250, 278,
|
||||||
|
500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 675, 675, 675, 500,
|
||||||
|
920, 611, 611, 667, 722, 611, 611, 722, 722, 333, 444, 667, 556, 833, 667, 722,
|
||||||
|
611, 722, 611, 500, 556, 722, 611, 833, 611, 556, 556, 389, 278, 389, 422, 500,
|
||||||
|
333, 500, 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500,
|
||||||
|
500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 400, 275, 400, 541, 0,
|
||||||
|
500, 0, 333, 500, 556, 889, 500, 500, 333, 1000, 500, 333, 944, 0, 556, 0,
|
||||||
|
0, 333, 333, 556, 556, 350, 500, 889, 333, 980, 389, 333, 667, 0, 389, 556,
|
||||||
|
0, 389, 500, 500, 500, 500, 275, 500, 333, 760, 276, 500, 675, 675, 760, 333,
|
||||||
|
400, 675, 300, 300, 333, 500, 523, 250, 333, 300, 310, 500, 750, 750, 750, 500,
|
||||||
|
611, 611, 611, 611, 611, 611, 889, 667, 611, 611, 611, 611, 333, 333, 333, 333,
|
||||||
|
722, 667, 722, 722, 722, 722, 722, 675, 722, 722, 722, 722, 722, 556, 611, 500,
|
||||||
|
500, 500, 500, 500, 500, 500, 667, 444, 444, 444, 444, 444, 278, 278, 278, 278,
|
||||||
|
500, 500, 500, 500, 500, 500, 500, 675, 500, 500, 500, 500, 500, 444, 500, 444
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short times_roman_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
250, 333, 408, 500, 500, 833, 778, 180, 333, 333, 500, 564, 250, 333, 250, 278,
|
||||||
|
500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444,
|
||||||
|
921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722,
|
||||||
|
556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500,
|
||||||
|
333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500,
|
||||||
|
500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 541, 0,
|
||||||
|
500, 0, 333, 500, 444, 1000, 500, 500, 333, 1000, 556, 333, 889, 0, 611, 0,
|
||||||
|
0, 333, 333, 444, 444, 350, 500, 1000, 333, 980, 389, 333, 722, 0, 444, 722,
|
||||||
|
0, 333, 500, 500, 500, 500, 200, 500, 333, 760, 276, 500, 564, 564, 760, 333,
|
||||||
|
400, 564, 300, 300, 333, 500, 453, 250, 333, 300, 310, 500, 750, 750, 750, 444,
|
||||||
|
722, 722, 722, 722, 722, 722, 889, 667, 611, 611, 611, 611, 333, 333, 333, 333,
|
||||||
|
722, 722, 722, 722, 722, 722, 722, 564, 722, 722, 722, 722, 722, 722, 556, 500,
|
||||||
|
444, 444, 444, 444, 444, 444, 667, 444, 444, 444, 444, 444, 278, 278, 278, 278,
|
||||||
|
500, 500, 500, 500, 500, 500, 500, 564, 500, 500, 500, 500, 500, 500, 500, 500
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static short zapfdingbats_widths[256] =
|
||||||
|
{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
278, 974, 961, 974, 980, 719, 789, 790, 791, 690, 960, 939, 549, 855, 911, 933,
|
||||||
|
911, 945, 974, 755, 846, 762, 761, 571, 677, 763, 760, 759, 754, 494, 552, 537,
|
||||||
|
577, 692, 786, 788, 788, 790, 793, 794, 816, 823, 789, 841, 823, 833, 816, 831,
|
||||||
|
923, 744, 723, 749, 790, 792, 695, 776, 768, 792, 759, 707, 708, 682, 701, 826,
|
||||||
|
815, 789, 789, 707, 687, 696, 689, 786, 787, 713, 791, 785, 791, 873, 761, 762,
|
||||||
|
762, 759, 759, 892, 892, 788, 784, 438, 138, 277, 415, 392, 392, 668, 668, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 732, 544, 544, 910, 667, 760, 760, 776, 595, 694, 626, 788, 788, 788, 788,
|
||||||
|
788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788,
|
||||||
|
788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788,
|
||||||
|
788, 788, 788, 788, 894, 838, 1016, 458, 748, 924, 748, 918, 927, 928, 928, 834,
|
||||||
|
873, 828, 924, 924, 917, 930, 931, 463, 883, 836, 836, 867, 867, 696, 696, 874,
|
||||||
|
0, 874, 760, 946, 771, 865, 771, 888, 967, 888, 831, 873, 927, 970, 918, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !PDFIO_BASE_FONT_WIDTHS_H
|
@ -1,7 +1,7 @@
|
|||||||
//
|
//
|
||||||
// Content helper functions for PDFio.
|
// Content helper functions for PDFio.
|
||||||
//
|
//
|
||||||
// Copyright © 2021-2023 by Michael R Sweet.
|
// Copyright © 2021-2024 by Michael R Sweet.
|
||||||
//
|
//
|
||||||
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
// information.
|
// information.
|
||||||
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "pdfio-private.h"
|
#include "pdfio-private.h"
|
||||||
#include "pdfio-content.h"
|
#include "pdfio-content.h"
|
||||||
|
#include "pdfio-base-font-widths.h"
|
||||||
#include "ttf.h"
|
#include "ttf.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#ifndef M_PI
|
#ifndef M_PI
|
||||||
@ -1074,7 +1075,7 @@ pdfioContentTextMeasure(
|
|||||||
const char *s, // I - UTF-8 string
|
const char *s, // I - UTF-8 string
|
||||||
double size) // I - Font size/height
|
double size) // I - Font size/height
|
||||||
{
|
{
|
||||||
const char *subtype; // Font sub-type
|
const char *basefont; // Base font name
|
||||||
ttf_t *ttf = (ttf_t *)_pdfioObjGetExtension(font);
|
ttf_t *ttf = (ttf_t *)_pdfioObjGetExtension(font);
|
||||||
// TrueType font data
|
// TrueType font data
|
||||||
ttf_rect_t extents; // Text extents
|
ttf_rect_t extents; // Text extents
|
||||||
@ -1083,7 +1084,13 @@ pdfioContentTextMeasure(
|
|||||||
*tempptr; // Pointer into temporary string
|
*tempptr; // Pointer into temporary string
|
||||||
|
|
||||||
|
|
||||||
if ((subtype = pdfioObjGetSubtype(font)) == NULL || strcmp(subtype, "Type0"))
|
if (!ttf && (basefont = pdfioDictGetName(pdfioObjGetDict(font), "BaseFont")) != NULL)
|
||||||
|
{
|
||||||
|
// Measure the width using the compiled-in base font tables...
|
||||||
|
const short *widths; // Widths
|
||||||
|
int width = 0; // Current width
|
||||||
|
|
||||||
|
if (strcmp(basefont, "Symbol") && strcmp(basefont, "Zapf-Dingbats"))
|
||||||
{
|
{
|
||||||
// Map non-CP1282 characters to '?', everything else as-is...
|
// Map non-CP1282 characters to '?', everything else as-is...
|
||||||
tempptr = temp;
|
tempptr = temp;
|
||||||
@ -1124,34 +1131,62 @@ pdfioContentTextMeasure(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= (sizeof(_pdfio_cp1252) / sizeof(_pdfio_cp1252[0])))
|
if (i < (sizeof(_pdfio_cp1252) / sizeof(_pdfio_cp1252[0])))
|
||||||
|
ch = (int)(i + 0x80); // Extra characters from 0x80 to 0x9f
|
||||||
|
else
|
||||||
ch = '?'; // Unsupported chars map to ?
|
ch = '?'; // Unsupported chars map to ?
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ch < 128)
|
|
||||||
{
|
|
||||||
// ASCII
|
|
||||||
*tempptr++ = (char)ch;
|
*tempptr++ = (char)ch;
|
||||||
}
|
}
|
||||||
else if (ch < 2048)
|
|
||||||
{
|
|
||||||
// 2-byte UTF-8
|
|
||||||
*tempptr++ = (char)(0xc0 | ((ch >> 6) & 0x1f));
|
|
||||||
*tempptr++ = (char)(0x80 | (ch & 0x3f));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 3-byte UTF-8
|
|
||||||
*tempptr++ = (char)(0xe0 | ((ch >> 12) & 0x0f));
|
|
||||||
*tempptr++ = (char)(0x80 | ((ch >> 6) & 0x3f));
|
|
||||||
*tempptr++ = (char)(0x80 | (ch & 0x3f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*tempptr = '\0';
|
*tempptr = '\0';
|
||||||
s = temp;
|
s = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Choose the appropriate table...
|
||||||
|
if (!strcmp(basefont, "Courier"))
|
||||||
|
widths = courier_widths;
|
||||||
|
else if (!strcmp(basefont, "Courier-Bold"))
|
||||||
|
widths = courier_bold_widths;
|
||||||
|
else if (!strcmp(basefont, "Courier-BoldOblique"))
|
||||||
|
widths = courier_boldoblique_widths;
|
||||||
|
else if (!strcmp(basefont, "Courier-Oblique"))
|
||||||
|
widths = courier_oblique_widths;
|
||||||
|
else if (!strcmp(basefont, "Helvetica"))
|
||||||
|
widths = helvetica_widths;
|
||||||
|
else if (!strcmp(basefont, "Helvetica-Bold"))
|
||||||
|
widths = helvetica_bold_widths;
|
||||||
|
else if (!strcmp(basefont, "Helvetica-BoldOblique"))
|
||||||
|
widths = helvetica_boldoblique_widths;
|
||||||
|
else if (!strcmp(basefont, "Helvetica-Oblique"))
|
||||||
|
widths = helvetica_oblique_widths;
|
||||||
|
else if (!strcmp(basefont, "Symbol"))
|
||||||
|
widths = symbol_widths;
|
||||||
|
else if (!strcmp(basefont, "Times-Bold"))
|
||||||
|
widths = times_bold_widths;
|
||||||
|
else if (!strcmp(basefont, "Times-BoldItalic"))
|
||||||
|
widths = times_bolditalic_widths;
|
||||||
|
else if (!strcmp(basefont, "Times-Italic"))
|
||||||
|
widths = times_italic_widths;
|
||||||
|
else if (!strcmp(basefont, "Times-Roman"))
|
||||||
|
widths = times_roman_widths;
|
||||||
|
else if (!strcmp(basefont, "ZapfDingbats"))
|
||||||
|
widths = zapfdingbats_widths;
|
||||||
|
else
|
||||||
|
return (0.0);
|
||||||
|
|
||||||
|
// Calculate the width using the corresponding table...
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
width += widths[*s & 255];
|
||||||
|
s ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (size * 0.001 * width);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we get here then we need to measure using the TrueType library...
|
||||||
ttfGetExtents(ttf, (float)size, s, &extents);
|
ttfGetExtents(ttf, (float)size, s, &extents);
|
||||||
|
|
||||||
return (extents.right - extents.left);
|
return (extents.right - extents.left);
|
||||||
@ -1421,8 +1456,9 @@ pdfioContentTextShowJustified(
|
|||||||
// - "Times-Roman"
|
// - "Times-Roman"
|
||||||
// - "ZapfDingbats"
|
// - "ZapfDingbats"
|
||||||
//
|
//
|
||||||
// Base fonts always use the Windows CP1252 (ISO-8859-1 with additional
|
// Aside from "Symbol" and "Zapf-Dingbats", Base fonts use the Windows CP1252
|
||||||
// characters such as the Euro symbol) subset of Unicode.
|
// (ISO-8859-1 with additional characters such as the Euro symbol) subset of
|
||||||
|
// Unicode.
|
||||||
//
|
//
|
||||||
|
|
||||||
pdfio_obj_t * // O - Font object
|
pdfio_obj_t * // O - Font object
|
||||||
|
43
pdfio-dict.c
43
pdfio-dict.c
@ -1,7 +1,7 @@
|
|||||||
//
|
//
|
||||||
// PDF dictionary functions for PDFio.
|
// PDF dictionary functions for PDFio.
|
||||||
//
|
//
|
||||||
// Copyright © 2021-2023 by Michael R Sweet.
|
// Copyright © 2021-2024 by Michael R Sweet.
|
||||||
//
|
//
|
||||||
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
// information.
|
// information.
|
||||||
@ -18,11 +18,11 @@ static int compare_pairs(_pdfio_pair_t *a, _pdfio_pair_t *b);
|
|||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// '_pdfioDictClear()' - Remove a key/value pair from a dictionary.
|
// 'pdfioDictClear()' - Remove a key/value pair from a dictionary.
|
||||||
//
|
//
|
||||||
|
|
||||||
void
|
bool // O - `true` if cleared, `false` otherwise
|
||||||
_pdfioDictClear(pdfio_dict_t *dict, // I - Dictionary
|
pdfioDictClear(pdfio_dict_t *dict, // I - Dictionary
|
||||||
const char *key) // I - Key
|
const char *key) // I - Key
|
||||||
{
|
{
|
||||||
size_t idx; // Index into pairs
|
size_t idx; // Index into pairs
|
||||||
@ -30,7 +30,10 @@ _pdfioDictClear(pdfio_dict_t *dict, // I - Dictionary
|
|||||||
pkey; // Search key
|
pkey; // Search key
|
||||||
|
|
||||||
|
|
||||||
PDFIO_DEBUG("_pdfioDictClear(dict=%p, key=\"%s\")\n", dict, key);
|
PDFIO_DEBUG("pdfioDictClear(dict=%p, key=\"%s\")\n", dict, key);
|
||||||
|
|
||||||
|
if (!dict || !key)
|
||||||
|
return (false);
|
||||||
|
|
||||||
// See if the key is already set...
|
// See if the key is already set...
|
||||||
if (dict->num_pairs > 0)
|
if (dict->num_pairs > 0)
|
||||||
@ -48,8 +51,12 @@ _pdfioDictClear(pdfio_dict_t *dict, // I - Dictionary
|
|||||||
|
|
||||||
if (idx < dict->num_pairs)
|
if (idx < dict->num_pairs)
|
||||||
memmove(pair, pair + 1, (dict->num_pairs - idx) * sizeof(_pdfio_pair_t));
|
memmove(pair, pair + 1, (dict->num_pairs - idx) * sizeof(_pdfio_pair_t));
|
||||||
|
|
||||||
|
return (true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -194,6 +201,9 @@ _pdfioDictDebug(pdfio_dict_t *dict, // I - Dictionary
|
|||||||
_pdfio_pair_t *pair; // Current pair
|
_pdfio_pair_t *pair; // Current pair
|
||||||
|
|
||||||
|
|
||||||
|
if (!dict)
|
||||||
|
return;
|
||||||
|
|
||||||
for (i = dict->num_pairs, pair = dict->pairs; i > 0; i --, pair ++)
|
for (i = dict->num_pairs, pair = dict->pairs; i > 0; i --, pair ++)
|
||||||
{
|
{
|
||||||
fprintf(fp, "/%s", pair->key);
|
fprintf(fp, "/%s", pair->key);
|
||||||
@ -332,6 +342,18 @@ pdfioDictGetDict(pdfio_dict_t *dict, // I - Dictionary
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'pdfioDictGetKey()' - Get the key for the specified pair.
|
||||||
|
//
|
||||||
|
|
||||||
|
const char * // O - Key for specified pair
|
||||||
|
pdfioDictGetKey(pdfio_dict_t *dict, // I - Dictionary
|
||||||
|
size_t n) // I - Pair index (`0`-based)
|
||||||
|
{
|
||||||
|
return ((dict && n < dict->num_pairs) ? dict->pairs[n].key : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// 'pdfioDictGetName()' - Get a key name value from a dictionary.
|
// 'pdfioDictGetName()' - Get a key name value from a dictionary.
|
||||||
//
|
//
|
||||||
@ -350,6 +372,17 @@ pdfioDictGetName(pdfio_dict_t *dict, // I - Dictionary
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'pdfioDictGetNumPairs()' - Get the number of key/value pairs in a dictionary.
|
||||||
|
//
|
||||||
|
|
||||||
|
size_t // O - Number of pairs
|
||||||
|
pdfioDictGetNumPairs(pdfio_dict_t *dict)// I - Dictionary
|
||||||
|
{
|
||||||
|
return (dict ? dict->num_pairs : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// 'pdfioDictGetNumber()' - Get a key number value from a dictionary.
|
// 'pdfioDictGetNumber()' - Get a key number value from a dictionary.
|
||||||
//
|
//
|
||||||
|
53
pdfio-file.c
53
pdfio-file.c
@ -188,6 +188,8 @@ pdfioFileCreate(
|
|||||||
int fd; // File descriptor
|
int fd; // File descriptor
|
||||||
|
|
||||||
|
|
||||||
|
PDFIO_DEBUG("pdfioFileCreate(filename=\"%s\", version=\"%s\", media_box=%p, crop_box=%p, error_cb=%p, error_cbdata=%p)\n", filename, version, (void *)media_box, (void *)crop_box, (void *)error_cb, (void *)error_cbdata);
|
||||||
|
|
||||||
// Range check input...
|
// Range check input...
|
||||||
if (!filename)
|
if (!filename)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -242,6 +244,35 @@ pdfioFileCreateArrayObj(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'pdfioFileCreateNameObj()' - Create a new object in a PDF file containing a name.
|
||||||
|
//
|
||||||
|
// This function creates a new object with a name value in a PDF file.
|
||||||
|
// You must call @link pdfioObjClose@ to write the object to the file.
|
||||||
|
//
|
||||||
|
|
||||||
|
pdfio_obj_t * // O - New object
|
||||||
|
pdfioFileCreateNameObj(
|
||||||
|
pdfio_file_t *pdf, // I - PDF file
|
||||||
|
const char *name) // I - Name value
|
||||||
|
{
|
||||||
|
_pdfio_value_t value; // Object value
|
||||||
|
|
||||||
|
|
||||||
|
// Range check input...
|
||||||
|
if (!pdf || !name)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
value.type = PDFIO_VALTYPE_NAME;
|
||||||
|
value.value.name = pdfioStringCreate(pdf, name);
|
||||||
|
|
||||||
|
if (!value.value.name)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
return (_pdfioFileCreateObj(pdf, NULL, &value));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// 'pdfioFileCreateNumberObj()' - Create a new object in a PDF file containing a number.
|
// 'pdfioFileCreateNumberObj()' - Create a new object in a PDF file containing a number.
|
||||||
//
|
//
|
||||||
@ -390,6 +421,8 @@ pdfioFileCreateOutput(
|
|||||||
pdfio_error_cb_t error_cb, // I - Error callback or `NULL` for default
|
pdfio_error_cb_t error_cb, // I - Error callback or `NULL` for default
|
||||||
void *error_cbdata) // I - Error callback data, if any
|
void *error_cbdata) // I - Error callback data, if any
|
||||||
{
|
{
|
||||||
|
PDFIO_DEBUG("pdfioFileCreate(output_cb=%p, output_cbdata=%p, version=\"%s\", media_box=%p, crop_box=%p, error_cb=%p, error_cbdata=%p)\n", (void *)output_cb, (void *)output_cbdata, version, (void *)media_box, (void *)crop_box, (void *)error_cb, (void *)error_cbdata);
|
||||||
|
|
||||||
return (create_common("output.pdf", /*fd*/-1, output_cb, output_cbdata, version, media_box, crop_box, error_cb, error_cbdata));
|
return (create_common("output.pdf", /*fd*/-1, output_cb, output_cbdata, version, media_box, crop_box, error_cb, error_cbdata));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -524,6 +557,8 @@ pdfioFileCreateTemporary(
|
|||||||
unsigned tmpnum; // Temporary filename number
|
unsigned tmpnum; // Temporary filename number
|
||||||
|
|
||||||
|
|
||||||
|
PDFIO_DEBUG("pdfioFileCreate(buffer=%p, bufsize=%lu, version=\"%s\", media_box=%p, crop_box=%p, error_cb=%p, error_cbdata=%p)\n", (void *)buffer, (unsigned long)bufsize, version, (void *)media_box, (void *)crop_box, (void *)error_cb, (void *)error_cbdata);
|
||||||
|
|
||||||
// Range check input...
|
// Range check input...
|
||||||
if (!buffer || bufsize < 32)
|
if (!buffer || bufsize < 32)
|
||||||
{
|
{
|
||||||
@ -648,11 +683,12 @@ pdfioFileFindObj(
|
|||||||
if ((current = number - 1) >= pdf->num_objs)
|
if ((current = number - 1) >= pdf->num_objs)
|
||||||
current = pdf->num_objs / 2;
|
current = pdf->num_objs / 2;
|
||||||
|
|
||||||
PDFIO_DEBUG("pdfioFileFindObj: objs[current=%lu]=%p\n", (unsigned long)current, (void *)pdf->objs[current]);
|
PDFIO_DEBUG("pdfioFileFindObj: objs[current=%lu]=%p(%lu)\n", (unsigned long)current, (void *)pdf->objs[current], (unsigned long)(pdf->objs[current] ? pdf->objs[current]->number : 0));
|
||||||
|
|
||||||
if (number == pdf->objs[current]->number)
|
if (number == pdf->objs[current]->number)
|
||||||
{
|
{
|
||||||
// Fast match...
|
// Fast match...
|
||||||
|
PDFIO_DEBUG("pdfioFileFindObj: Returning %lu (%p)\n", (unsigned long)current, pdf->objs[current]);
|
||||||
return (pdf->objs[current]);
|
return (pdf->objs[current]);
|
||||||
}
|
}
|
||||||
else if (number < pdf->objs[current]->number)
|
else if (number < pdf->objs[current]->number)
|
||||||
@ -679,11 +715,20 @@ pdfioFileFindObj(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (number == pdf->objs[left]->number)
|
if (number == pdf->objs[left]->number)
|
||||||
|
{
|
||||||
|
PDFIO_DEBUG("pdfioFileFindObj: Returning %lu (%p)\n", (unsigned long)left, pdf->objs[left]);
|
||||||
return (pdf->objs[left]);
|
return (pdf->objs[left]);
|
||||||
|
}
|
||||||
else if (number == pdf->objs[right]->number)
|
else if (number == pdf->objs[right]->number)
|
||||||
|
{
|
||||||
|
PDFIO_DEBUG("pdfioFileFindObj: Returning %lu (%p)\n", (unsigned long)right, pdf->objs[right]);
|
||||||
return (pdf->objs[right]);
|
return (pdf->objs[right]);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
PDFIO_DEBUG("pdfioFileFindObj: Returning NULL\n");
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -928,6 +973,8 @@ pdfioFileOpen(
|
|||||||
off_t xref_offset; // Offset to xref table
|
off_t xref_offset; // Offset to xref table
|
||||||
|
|
||||||
|
|
||||||
|
PDFIO_DEBUG("pdfioFileOpen(filename=\"%s\", password_cb=%p, password_cbdata=%p, error_cb=%p, error_cbdata=%p)\n", filename, (void *)password_cb, (void *)password_cbdata, (void *)error_cb, (void *)error_cbdata);
|
||||||
|
|
||||||
// Range check input...
|
// Range check input...
|
||||||
if (!filename)
|
if (!filename)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -1285,6 +1332,8 @@ create_common(
|
|||||||
unsigned char id_value[16]; // File ID value
|
unsigned char id_value[16]; // File ID value
|
||||||
|
|
||||||
|
|
||||||
|
PDFIO_DEBUG("create_common(filename=\"%s\", fd=%d, output_cb=%p, output_cbdata=%p, version=\"%s\", media_box=%p, crop_box=%p, error_cb=%p, error_cbdata=%p)\n", filename, fd, (void *)output_cb, (void *)output_cbdata, version, (void *)media_box, (void *)crop_box, (void *)error_cb, (void *)error_cbdata);
|
||||||
|
|
||||||
// Range check input...
|
// Range check input...
|
||||||
if (!filename || (fd < 0 && !output_cb))
|
if (!filename || (fd < 0 && !output_cb))
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -1928,7 +1977,7 @@ load_xref(
|
|||||||
{
|
{
|
||||||
PDFIO_DEBUG("load_xref: '%s' at offset %lu\n", line, (unsigned long)trailer_offset);
|
PDFIO_DEBUG("load_xref: '%s' at offset %lu\n", line, (unsigned long)trailer_offset);
|
||||||
|
|
||||||
if (!strncmp(line, "trailer", 7) && (!line[7] || isspace(line[7] & 255)))
|
if (!strncmp(line, "trailer", 7) && (!line[7] || isspace(line[7] & 255) || line[7] == '<'))
|
||||||
{
|
{
|
||||||
if (line[7])
|
if (line[7])
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//
|
//
|
||||||
// PDF object functions for PDFio.
|
// PDF object functions for PDFio.
|
||||||
//
|
//
|
||||||
// Copyright © 2021-2023 by Michael R Sweet.
|
// Copyright © 2021-2024 by Michael R Sweet.
|
||||||
//
|
//
|
||||||
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more
|
||||||
// information.
|
// information.
|
||||||
@ -99,7 +99,7 @@ pdfioObjCopy(pdfio_file_t *pdf, // I - PDF file
|
|||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
if (dstobj->value.type == PDFIO_VALTYPE_DICT)
|
if (dstobj->value.type == PDFIO_VALTYPE_DICT)
|
||||||
_pdfioDictClear(dstobj->value.value.dict, "Length");
|
pdfioDictClear(dstobj->value.value.dict, "Length");
|
||||||
|
|
||||||
if (srcobj->stream_offset)
|
if (srcobj->stream_offset)
|
||||||
{
|
{
|
||||||
@ -333,6 +333,26 @@ pdfioObjGetLength(pdfio_obj_t *obj) // I - Object
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// 'pdfioObjGetName()' - Get the name value associated with an object.
|
||||||
|
//
|
||||||
|
|
||||||
|
const char * // O - Dictionary or `NULL` on error
|
||||||
|
pdfioObjGetName(pdfio_obj_t *obj) // I - Object
|
||||||
|
{
|
||||||
|
if (!obj)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
if (obj->value.type == PDFIO_VALTYPE_NONE)
|
||||||
|
_pdfioObjLoad(obj);
|
||||||
|
|
||||||
|
if (obj->value.type == PDFIO_VALTYPE_NAME)
|
||||||
|
return (obj->value.value.name);
|
||||||
|
else
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// 'pdfioObjGetNumber()' - Get the object's number.
|
// 'pdfioObjGetNumber()' - Get the object's number.
|
||||||
//
|
//
|
||||||
@ -347,8 +367,21 @@ pdfioObjGetNumber(pdfio_obj_t *obj) // I - Object
|
|||||||
//
|
//
|
||||||
// 'pdfioObjGetSubtype()' - Get an object's subtype.
|
// 'pdfioObjGetSubtype()' - Get an object's subtype.
|
||||||
//
|
//
|
||||||
|
// This function returns an object's PDF subtype name, if any. Common subtype
|
||||||
|
// names include:
|
||||||
|
//
|
||||||
|
// - "CIDFontType0": A CID Type0 font
|
||||||
|
// - "CIDFontType2": A CID TrueType font
|
||||||
|
// - "Image": An image or image mask
|
||||||
|
// - "Form": A fillable form
|
||||||
|
// - "OpenType": An OpenType font
|
||||||
|
// - "Type0": A composite font
|
||||||
|
// - "Type1": A PostScript Type1 font
|
||||||
|
// - "Type3": A PDF Type3 font
|
||||||
|
// - "TrueType": A TrueType font
|
||||||
|
//
|
||||||
|
|
||||||
const char * // O - Object subtype
|
const char * // O - Object subtype name or `NULL` for none
|
||||||
pdfioObjGetSubtype(pdfio_obj_t *obj) // I - Object
|
pdfioObjGetSubtype(pdfio_obj_t *obj) // I - Object
|
||||||
{
|
{
|
||||||
pdfio_dict_t *dict; // Object dictionary
|
pdfio_dict_t *dict; // Object dictionary
|
||||||
@ -364,8 +397,21 @@ pdfioObjGetSubtype(pdfio_obj_t *obj) // I - Object
|
|||||||
//
|
//
|
||||||
// 'pdfioObjGetType()' - Get an object's type.
|
// 'pdfioObjGetType()' - Get an object's type.
|
||||||
//
|
//
|
||||||
|
// This function returns an object's PDF type name, if any. Common type names
|
||||||
|
// include:
|
||||||
|
//
|
||||||
|
// - "CMap": A character map for composite fonts
|
||||||
|
// - "Font": An embedded font (@link pdfioObjGetSubtype@ will tell you the
|
||||||
|
// font format)
|
||||||
|
// - "FontDescriptor": A font descriptor
|
||||||
|
// - "Page": A (visible) page
|
||||||
|
// - "Pages": A page tree node
|
||||||
|
// - "Template": An invisible template page
|
||||||
|
// - "XObject": An image, image mask, or form (@link pdfioObjGetSubtype@ will
|
||||||
|
// tell you which)
|
||||||
|
//
|
||||||
|
|
||||||
const char * // O - Object type
|
const char * // O - Object type name or `NULL` for none
|
||||||
pdfioObjGetType(pdfio_obj_t *obj) // I - Object
|
pdfioObjGetType(pdfio_obj_t *obj) // I - Object
|
||||||
{
|
{
|
||||||
pdfio_dict_t *dict; // Object dictionary
|
pdfio_dict_t *dict; // Object dictionary
|
||||||
|
@ -353,7 +353,6 @@ extern void _pdfioCryptoSHA256Init(_pdfio_sha256_t *ctx) _PDFIO_INTERNAL;
|
|||||||
extern void _pdfioCryptoSHA256Finish(_pdfio_sha256_t *ctx, uint8_t *Message_Digest) _PDFIO_INTERNAL;
|
extern void _pdfioCryptoSHA256Finish(_pdfio_sha256_t *ctx, uint8_t *Message_Digest) _PDFIO_INTERNAL;
|
||||||
extern bool _pdfioCryptoUnlock(pdfio_file_t *pdf, pdfio_password_cb_t password_cb, void *password_data) _PDFIO_INTERNAL;
|
extern bool _pdfioCryptoUnlock(pdfio_file_t *pdf, pdfio_password_cb_t password_cb, void *password_data) _PDFIO_INTERNAL;
|
||||||
|
|
||||||
extern void _pdfioDictClear(pdfio_dict_t *dict, const char *key) _PDFIO_INTERNAL;
|
|
||||||
extern bool _pdfioDictDecrypt(pdfio_file_t *pdf, pdfio_obj_t *obj, pdfio_dict_t *dict, size_t depth) _PDFIO_INTERNAL;
|
extern bool _pdfioDictDecrypt(pdfio_file_t *pdf, pdfio_obj_t *obj, pdfio_dict_t *dict, size_t depth) _PDFIO_INTERNAL;
|
||||||
extern void _pdfioDictDebug(pdfio_dict_t *dict, FILE *fp) _PDFIO_INTERNAL;
|
extern void _pdfioDictDebug(pdfio_dict_t *dict, FILE *fp) _PDFIO_INTERNAL;
|
||||||
extern void _pdfioDictDelete(pdfio_dict_t *dict) _PDFIO_INTERNAL;
|
extern void _pdfioDictDelete(pdfio_dict_t *dict) _PDFIO_INTERNAL;
|
||||||
|
@ -408,6 +408,7 @@ _pdfioStreamOpen(pdfio_obj_t *obj, // I - Object
|
|||||||
pdfio_stream_t *st; // Stream
|
pdfio_stream_t *st; // Stream
|
||||||
pdfio_dict_t *dict = pdfioObjGetDict(obj);
|
pdfio_dict_t *dict = pdfioObjGetDict(obj);
|
||||||
// Object dictionary
|
// Object dictionary
|
||||||
|
const char *type; // Object type
|
||||||
|
|
||||||
|
|
||||||
PDFIO_DEBUG("_pdfioStreamOpen(obj=%p(%u), decode=%s)\n", obj, (unsigned)obj->number, decode ? "true" : "false");
|
PDFIO_DEBUG("_pdfioStreamOpen(obj=%p(%u), decode=%s)\n", obj, (unsigned)obj->number, decode ? "true" : "false");
|
||||||
@ -434,7 +435,9 @@ _pdfioStreamOpen(pdfio_obj_t *obj, // I - Object
|
|||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (obj->pdf->encryption)
|
type = pdfioObjGetType(obj);
|
||||||
|
|
||||||
|
if (obj->pdf->encryption && (!type || strcmp(type, "XRef")))
|
||||||
{
|
{
|
||||||
uint8_t iv[64]; // Initialization vector
|
uint8_t iv[64]; // Initialization vector
|
||||||
size_t ivlen; // Length of initialization vector, if any
|
size_t ivlen; // Length of initialization vector, if any
|
||||||
@ -1061,19 +1064,11 @@ stream_read(pdfio_stream_t *st, // I - Stream
|
|||||||
st->flate.next_out = (Bytef *)buffer;
|
st->flate.next_out = (Bytef *)buffer;
|
||||||
st->flate.avail_out = (uInt)bytes;
|
st->flate.avail_out = (uInt)bytes;
|
||||||
|
|
||||||
avail_in = st->flate.avail_in;
|
|
||||||
avail_out = st->flate.avail_out;
|
|
||||||
|
|
||||||
if ((status = inflate(&(st->flate), Z_NO_FLUSH)) < Z_OK)
|
if ((status = inflate(&(st->flate), Z_NO_FLUSH)) < Z_OK)
|
||||||
{
|
{
|
||||||
_pdfioFileError(st->pdf, "Unable to decompress stream data for object %ld: %s", (long)st->obj->number, zstrerror(status));
|
_pdfioFileError(st->pdf, "Unable to decompress stream data for object %ld: %s", (long)st->obj->number, zstrerror(status));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
else if (avail_in == st->flate.avail_in && avail_out == st->flate.avail_out)
|
|
||||||
{
|
|
||||||
_pdfioFileError(st->pdf, "Corrupt stream data.");
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (st->flate.next_out - (Bytef *)buffer);
|
return (st->flate.next_out - (Bytef *)buffer);
|
||||||
}
|
}
|
||||||
|
@ -215,6 +215,9 @@ void
|
|||||||
_pdfioValueDebug(_pdfio_value_t *v, // I - Value
|
_pdfioValueDebug(_pdfio_value_t *v, // I - Value
|
||||||
FILE *fp) // I - Output file
|
FILE *fp) // I - Output file
|
||||||
{
|
{
|
||||||
|
if (!v)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (v->type)
|
switch (v->type)
|
||||||
{
|
{
|
||||||
case PDFIO_VALTYPE_ARRAY :
|
case PDFIO_VALTYPE_ARRAY :
|
||||||
@ -752,6 +755,8 @@ get_date_time(const char *s) // I - PDF date/time value
|
|||||||
int offset; // Date offset
|
int offset; // Date offset
|
||||||
|
|
||||||
|
|
||||||
|
PDFIO_DEBUG("get_date_time(s=\"%s\")\n", s);
|
||||||
|
|
||||||
// Possible date value of the form:
|
// Possible date value of the form:
|
||||||
//
|
//
|
||||||
// (D:YYYYMMDDhhmmssZ)
|
// (D:YYYYMMDDhhmmssZ)
|
||||||
@ -769,10 +774,12 @@ get_date_time(const char *s) // I - PDF date/time value
|
|||||||
{
|
{
|
||||||
if (s[i] == 'Z')
|
if (s[i] == 'Z')
|
||||||
{
|
{
|
||||||
|
// UTC...
|
||||||
i ++;
|
i ++;
|
||||||
}
|
}
|
||||||
else if (s[i] == '-' || s[i] == '+')
|
else if (s[i] == '-' || s[i] == '+')
|
||||||
{
|
{
|
||||||
|
// Timezone offset from UTC...
|
||||||
if (isdigit(s[i + 1] & 255) && isdigit(s[i + 2] & 255) && s[i + 3] == '\'' && isdigit(s[i + 4] & 255) && isdigit(s[i + 5] & 255))
|
if (isdigit(s[i + 1] & 255) && isdigit(s[i + 2] & 255) && s[i + 3] == '\'' && isdigit(s[i + 4] & 255) && isdigit(s[i + 5] & 255))
|
||||||
{
|
{
|
||||||
i += 6;
|
i += 6;
|
||||||
@ -780,6 +787,11 @@ get_date_time(const char *s) // I - PDF date/time value
|
|||||||
i ++;
|
i ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (!s[i])
|
||||||
|
{
|
||||||
|
// Missing zone info, invalid date string...
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s[i])
|
if (s[i])
|
||||||
|
8
pdfio.h
8
pdfio.h
@ -23,7 +23,7 @@ extern "C" {
|
|||||||
// Version number...
|
// Version number...
|
||||||
//
|
//
|
||||||
|
|
||||||
# define PDFIO_VERSION "1.3.1"
|
# define PDFIO_VERSION "1.4.0"
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -151,7 +151,9 @@ extern pdfio_obj_t *pdfioArrayGetObj(pdfio_array_t *a, size_t n) _PDFIO_PUBLIC;
|
|||||||
extern size_t pdfioArrayGetSize(pdfio_array_t *a) _PDFIO_PUBLIC;
|
extern size_t pdfioArrayGetSize(pdfio_array_t *a) _PDFIO_PUBLIC;
|
||||||
extern const char *pdfioArrayGetString(pdfio_array_t *a, size_t n) _PDFIO_PUBLIC;
|
extern const char *pdfioArrayGetString(pdfio_array_t *a, size_t n) _PDFIO_PUBLIC;
|
||||||
extern pdfio_valtype_t pdfioArrayGetType(pdfio_array_t *a, size_t n) _PDFIO_PUBLIC;
|
extern pdfio_valtype_t pdfioArrayGetType(pdfio_array_t *a, size_t n) _PDFIO_PUBLIC;
|
||||||
|
extern bool pdfioArrayRemove(pdfio_array_t *a, size_t n) _PDFIO_PUBLIC;
|
||||||
|
|
||||||
|
extern bool pdfioDictClear(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
||||||
extern pdfio_dict_t *pdfioDictCopy(pdfio_file_t *pdf, pdfio_dict_t *dict) _PDFIO_PUBLIC;
|
extern pdfio_dict_t *pdfioDictCopy(pdfio_file_t *pdf, pdfio_dict_t *dict) _PDFIO_PUBLIC;
|
||||||
extern pdfio_dict_t *pdfioDictCreate(pdfio_file_t *pdf) _PDFIO_PUBLIC;
|
extern pdfio_dict_t *pdfioDictCreate(pdfio_file_t *pdf) _PDFIO_PUBLIC;
|
||||||
extern pdfio_array_t *pdfioDictGetArray(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
extern pdfio_array_t *pdfioDictGetArray(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
||||||
@ -159,7 +161,9 @@ extern unsigned char *pdfioDictGetBinary(pdfio_dict_t *dict, const char *key, si
|
|||||||
extern bool pdfioDictGetBoolean(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
extern bool pdfioDictGetBoolean(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
||||||
extern time_t pdfioDictGetDate(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
extern time_t pdfioDictGetDate(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
||||||
extern pdfio_dict_t *pdfioDictGetDict(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
extern pdfio_dict_t *pdfioDictGetDict(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
||||||
|
extern const char *pdfioDictGetKey(pdfio_dict_t *dict, size_t n) _PDFIO_PUBLIC;
|
||||||
extern const char *pdfioDictGetName(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
extern const char *pdfioDictGetName(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
||||||
|
extern size_t pdfioDictGetNumPairs(pdfio_dict_t *dict) _PDFIO_PUBLIC;
|
||||||
extern double pdfioDictGetNumber(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
extern double pdfioDictGetNumber(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
||||||
extern pdfio_obj_t *pdfioDictGetObj(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
extern pdfio_obj_t *pdfioDictGetObj(pdfio_dict_t *dict, const char *key) _PDFIO_PUBLIC;
|
||||||
extern pdfio_rect_t *pdfioDictGetRect(pdfio_dict_t *dict, const char *key, pdfio_rect_t *rect) _PDFIO_PUBLIC;
|
extern pdfio_rect_t *pdfioDictGetRect(pdfio_dict_t *dict, const char *key, pdfio_rect_t *rect) _PDFIO_PUBLIC;
|
||||||
@ -182,6 +186,7 @@ extern bool pdfioDictSetStringf(pdfio_dict_t *dict, const char *key, const char
|
|||||||
extern bool pdfioFileClose(pdfio_file_t *pdf) _PDFIO_PUBLIC;
|
extern bool pdfioFileClose(pdfio_file_t *pdf) _PDFIO_PUBLIC;
|
||||||
extern pdfio_file_t *pdfioFileCreate(const char *filename, const char *version, pdfio_rect_t *media_box, pdfio_rect_t *crop_box, pdfio_error_cb_t error_cb, void *error_data) _PDFIO_PUBLIC;
|
extern pdfio_file_t *pdfioFileCreate(const char *filename, const char *version, pdfio_rect_t *media_box, pdfio_rect_t *crop_box, pdfio_error_cb_t error_cb, void *error_data) _PDFIO_PUBLIC;
|
||||||
extern pdfio_obj_t *pdfioFileCreateArrayObj(pdfio_file_t *pdf, pdfio_array_t *array) _PDFIO_PUBLIC;
|
extern pdfio_obj_t *pdfioFileCreateArrayObj(pdfio_file_t *pdf, pdfio_array_t *array) _PDFIO_PUBLIC;
|
||||||
|
extern pdfio_obj_t *pdfioFileCreateNameObj(pdfio_file_t *pdf, const char *name) _PDFIO_PUBLIC;
|
||||||
extern pdfio_obj_t *pdfioFileCreateNumberObj(pdfio_file_t *pdf, double number) _PDFIO_PUBLIC;
|
extern pdfio_obj_t *pdfioFileCreateNumberObj(pdfio_file_t *pdf, double number) _PDFIO_PUBLIC;
|
||||||
extern pdfio_obj_t *pdfioFileCreateObj(pdfio_file_t *pdf, pdfio_dict_t *dict) _PDFIO_PUBLIC;
|
extern pdfio_obj_t *pdfioFileCreateObj(pdfio_file_t *pdf, pdfio_dict_t *dict) _PDFIO_PUBLIC;
|
||||||
extern pdfio_file_t *pdfioFileCreateOutput(pdfio_output_cb_t output_cb, void *output_ctx, const char *version, pdfio_rect_t *media_box, pdfio_rect_t *crop_box, pdfio_error_cb_t error_cb, void *error_data) _PDFIO_PUBLIC;
|
extern pdfio_file_t *pdfioFileCreateOutput(pdfio_output_cb_t output_cb, void *output_ctx, const char *version, pdfio_rect_t *media_box, pdfio_rect_t *crop_box, pdfio_error_cb_t error_cb, void *error_data) _PDFIO_PUBLIC;
|
||||||
@ -222,6 +227,7 @@ extern pdfio_array_t *pdfioObjGetArray(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
|||||||
extern pdfio_dict_t *pdfioObjGetDict(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
extern pdfio_dict_t *pdfioObjGetDict(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
||||||
extern unsigned short pdfioObjGetGeneration(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
extern unsigned short pdfioObjGetGeneration(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
||||||
extern size_t pdfioObjGetLength(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
extern size_t pdfioObjGetLength(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
||||||
|
extern const char *pdfioObjGetName(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
||||||
extern size_t pdfioObjGetNumber(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
extern size_t pdfioObjGetNumber(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
||||||
extern const char *pdfioObjGetSubtype(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
extern const char *pdfioObjGetSubtype(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
||||||
extern const char *pdfioObjGetType(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
extern const char *pdfioObjGetType(pdfio_obj_t *obj) _PDFIO_PUBLIC;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 50;
|
objectVersion = 54;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
@ -31,6 +31,7 @@
|
|||||||
27F2F0612710BE92008ECD36 /* pdfio-rc4.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F2F05E2710BE92008ECD36 /* pdfio-rc4.c */; };
|
27F2F0612710BE92008ECD36 /* pdfio-rc4.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F2F05E2710BE92008ECD36 /* pdfio-rc4.c */; };
|
||||||
27F2F0622710BE92008ECD36 /* pdfio-crypto.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F2F05F2710BE92008ECD36 /* pdfio-crypto.c */; };
|
27F2F0622710BE92008ECD36 /* pdfio-crypto.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F2F05F2710BE92008ECD36 /* pdfio-crypto.c */; };
|
||||||
27F2F0642711243D008ECD36 /* pdfio-sha256.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F2F0632711243D008ECD36 /* pdfio-sha256.c */; };
|
27F2F0642711243D008ECD36 /* pdfio-sha256.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F2F0632711243D008ECD36 /* pdfio-sha256.c */; };
|
||||||
|
27FCBDE42D19F9B300485EEE /* pdfio-base-font-widths.h in Headers */ = {isa = PBXBuildFile; fileRef = 27FCBDE32D19F9B300485EEE /* pdfio-base-font-widths.h */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -89,6 +90,7 @@
|
|||||||
27F2F05E2710BE92008ECD36 /* pdfio-rc4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "pdfio-rc4.c"; sourceTree = "<group>"; };
|
27F2F05E2710BE92008ECD36 /* pdfio-rc4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "pdfio-rc4.c"; sourceTree = "<group>"; };
|
||||||
27F2F05F2710BE92008ECD36 /* pdfio-crypto.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "pdfio-crypto.c"; sourceTree = "<group>"; };
|
27F2F05F2710BE92008ECD36 /* pdfio-crypto.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "pdfio-crypto.c"; sourceTree = "<group>"; };
|
||||||
27F2F0632711243D008ECD36 /* pdfio-sha256.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "pdfio-sha256.c"; sourceTree = "<group>"; };
|
27F2F0632711243D008ECD36 /* pdfio-sha256.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "pdfio-sha256.c"; sourceTree = "<group>"; };
|
||||||
|
27FCBDE32D19F9B300485EEE /* pdfio-base-font-widths.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "pdfio-base-font-widths.h"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -162,6 +164,7 @@
|
|||||||
children = (
|
children = (
|
||||||
27CF90432711DFFE00E50FE4 /* pdfio-aes.c */,
|
27CF90432711DFFE00E50FE4 /* pdfio-aes.c */,
|
||||||
273440BA263D727800FBFD63 /* pdfio-array.c */,
|
273440BA263D727800FBFD63 /* pdfio-array.c */,
|
||||||
|
27FCBDE32D19F9B300485EEE /* pdfio-base-font-widths.h */,
|
||||||
273440BB263D727800FBFD63 /* pdfio-common.c */,
|
273440BB263D727800FBFD63 /* pdfio-common.c */,
|
||||||
271EA703265B2B1000ACDD39 /* pdfio-content.c */,
|
271EA703265B2B1000ACDD39 /* pdfio-content.c */,
|
||||||
27F2F05F2710BE92008ECD36 /* pdfio-crypto.c */,
|
27F2F05F2710BE92008ECD36 /* pdfio-crypto.c */,
|
||||||
@ -205,6 +208,7 @@
|
|||||||
isa = PBXHeadersBuildPhase;
|
isa = PBXHeadersBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
27FCBDE42D19F9B300485EEE /* pdfio-base-font-widths.h in Headers */,
|
||||||
273440CC263D727800FBFD63 /* pdfio.h in Headers */,
|
273440CC263D727800FBFD63 /* pdfio.h in Headers */,
|
||||||
271EA706265B2B1000ACDD39 /* pdfio-content.h in Headers */,
|
271EA706265B2B1000ACDD39 /* pdfio-content.h in Headers */,
|
||||||
273440C3263D727800FBFD63 /* pdfio-private.h in Headers */,
|
273440C3263D727800FBFD63 /* pdfio-private.h in Headers */,
|
||||||
@ -256,7 +260,8 @@
|
|||||||
273440A8263D6FE200FBFD63 /* Project object */ = {
|
273440A8263D6FE200FBFD63 /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastUpgradeCheck = 1300;
|
BuildIndependentTargetsInParallel = YES;
|
||||||
|
LastUpgradeCheck = 1600;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
273440AF263D6FE200FBFD63 = {
|
273440AF263D6FE200FBFD63 = {
|
||||||
CreatedOnToolsVersion = 12.5;
|
CreatedOnToolsVersion = 12.5;
|
||||||
@ -373,9 +378,11 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CURRENT_PROJECT_VERSION = 1.1.2;
|
CURRENT_PROJECT_VERSION = 1.1.2;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
@ -450,15 +457,15 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CURRENT_PROJECT_VERSION = 1.1.2;
|
CURRENT_PROJECT_VERSION = 1.1.2;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
||||||
@ -486,6 +493,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
DEVELOPMENT_TEAM = RU58A2256H;
|
DEVELOPMENT_TEAM = RU58A2256H;
|
||||||
EXECUTABLE_PREFIX = lib;
|
EXECUTABLE_PREFIX = lib;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@ -497,6 +505,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
DEVELOPMENT_TEAM = RU58A2256H;
|
DEVELOPMENT_TEAM = RU58A2256H;
|
||||||
EXECUTABLE_PREFIX = lib;
|
EXECUTABLE_PREFIX = lib;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@ -509,6 +518,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_IDENTITY = "-";
|
CODE_SIGN_IDENTITY = "-";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
@ -525,6 +535,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_IDENTITY = "-";
|
CODE_SIGN_IDENTITY = "-";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
LIBRARY pdfio1
|
LIBRARY pdfio1
|
||||||
VERSION 1.3
|
VERSION 1.4
|
||||||
EXPORTS
|
EXPORTS
|
||||||
_pdfioArrayDebug
|
_pdfioArrayDebug
|
||||||
_pdfioArrayDecrypt
|
_pdfioArrayDecrypt
|
||||||
@ -23,7 +23,6 @@ _pdfioCryptoSHA256Append
|
|||||||
_pdfioCryptoSHA256Finish
|
_pdfioCryptoSHA256Finish
|
||||||
_pdfioCryptoSHA256Init
|
_pdfioCryptoSHA256Init
|
||||||
_pdfioCryptoUnlock
|
_pdfioCryptoUnlock
|
||||||
_pdfioDictClear
|
|
||||||
_pdfioDictDebug
|
_pdfioDictDebug
|
||||||
_pdfioDictDecrypt
|
_pdfioDictDecrypt
|
||||||
_pdfioDictDelete
|
_pdfioDictDelete
|
||||||
@ -96,6 +95,7 @@ pdfioArrayGetObj
|
|||||||
pdfioArrayGetSize
|
pdfioArrayGetSize
|
||||||
pdfioArrayGetString
|
pdfioArrayGetString
|
||||||
pdfioArrayGetType
|
pdfioArrayGetType
|
||||||
|
pdfioArrayRemove
|
||||||
pdfioContentClip
|
pdfioContentClip
|
||||||
pdfioContentDrawImage
|
pdfioContentDrawImage
|
||||||
pdfioContentFill
|
pdfioContentFill
|
||||||
@ -153,6 +153,7 @@ pdfioContentTextNextLine
|
|||||||
pdfioContentTextShow
|
pdfioContentTextShow
|
||||||
pdfioContentTextShowJustified
|
pdfioContentTextShowJustified
|
||||||
pdfioContentTextShowf
|
pdfioContentTextShowf
|
||||||
|
pdfioDictClear
|
||||||
pdfioDictCopy
|
pdfioDictCopy
|
||||||
pdfioDictCreate
|
pdfioDictCreate
|
||||||
pdfioDictGetArray
|
pdfioDictGetArray
|
||||||
@ -160,7 +161,9 @@ pdfioDictGetBinary
|
|||||||
pdfioDictGetBoolean
|
pdfioDictGetBoolean
|
||||||
pdfioDictGetDate
|
pdfioDictGetDate
|
||||||
pdfioDictGetDict
|
pdfioDictGetDict
|
||||||
|
pdfioDictGetKey
|
||||||
pdfioDictGetName
|
pdfioDictGetName
|
||||||
|
pdfioDictGetNumPairs
|
||||||
pdfioDictGetNumber
|
pdfioDictGetNumber
|
||||||
pdfioDictGetObj
|
pdfioDictGetObj
|
||||||
pdfioDictGetRect
|
pdfioDictGetRect
|
||||||
@ -187,6 +190,7 @@ pdfioFileCreateFontObjFromFile
|
|||||||
pdfioFileCreateICCObjFromFile
|
pdfioFileCreateICCObjFromFile
|
||||||
pdfioFileCreateImageObjFromData
|
pdfioFileCreateImageObjFromData
|
||||||
pdfioFileCreateImageObjFromFile
|
pdfioFileCreateImageObjFromFile
|
||||||
|
pdfioFileCreateNameObj
|
||||||
pdfioFileCreateNumberObj
|
pdfioFileCreateNumberObj
|
||||||
pdfioFileCreateObj
|
pdfioFileCreateObj
|
||||||
pdfioFileCreateOutput
|
pdfioFileCreateOutput
|
||||||
@ -228,6 +232,7 @@ pdfioObjGetArray
|
|||||||
pdfioObjGetDict
|
pdfioObjGetDict
|
||||||
pdfioObjGetGeneration
|
pdfioObjGetGeneration
|
||||||
pdfioObjGetLength
|
pdfioObjGetLength
|
||||||
|
pdfioObjGetName
|
||||||
pdfioObjGetNumber
|
pdfioObjGetNumber
|
||||||
pdfioObjGetSubtype
|
pdfioObjGetSubtype
|
||||||
pdfioObjGetType
|
pdfioObjGetType
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<metadata>
|
<metadata>
|
||||||
<id>pdfio_native</id>
|
<id>pdfio_native</id>
|
||||||
<title>PDFio Library for VS2019+</title>
|
<title>PDFio Library for VS2019+</title>
|
||||||
<version>1.3.2</version>
|
<version>1.4.0</version>
|
||||||
<authors>Michael R Sweet</authors>
|
<authors>Michael R Sweet</authors>
|
||||||
<owners>michaelrsweet</owners>
|
<owners>michaelrsweet</owners>
|
||||||
<projectUrl>https://github.com/michaelrsweet/pappl</projectUrl>
|
<projectUrl>https://github.com/michaelrsweet/pappl</projectUrl>
|
||||||
@ -16,7 +16,7 @@
|
|||||||
<copyright>Copyright © 2019-2024 by Michael R Sweet</copyright>
|
<copyright>Copyright © 2019-2024 by Michael R Sweet</copyright>
|
||||||
<tags>pdf file native</tags>
|
<tags>pdf file native</tags>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency id="pdfio_native.redist" version="1.3.2" />
|
<dependency id="pdfio_native.redist" version="1.4.0" />
|
||||||
<dependency id="zlib_native.redist" version="1.2.11" />
|
<dependency id="zlib_native.redist" version="1.2.11" />
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<metadata>
|
<metadata>
|
||||||
<id>pdfio_native.redist</id>
|
<id>pdfio_native.redist</id>
|
||||||
<title>PDFio Library for VS2019+</title>
|
<title>PDFio Library for VS2019+</title>
|
||||||
<version>1.3.2</version>
|
<version>1.4.0</version>
|
||||||
<authors>Michael R Sweet</authors>
|
<authors>Michael R Sweet</authors>
|
||||||
<owners>michaelrsweet</owners>
|
<owners>michaelrsweet</owners>
|
||||||
<projectUrl>https://github.com/michaelrsweet/pappl</projectUrl>
|
<projectUrl>https://github.com/michaelrsweet/pappl</projectUrl>
|
||||||
|
8
ttf.c
8
ttf.c
@ -1309,6 +1309,8 @@ read_cmap(ttf_t *font) // I - Font
|
|||||||
if (segment->startCode > segment->endCode)
|
if (segment->startCode > segment->endCode)
|
||||||
{
|
{
|
||||||
errorf(font, "Bad cmap table segment %u to %u.", segments->startCode, segment->endCode);
|
errorf(font, "Bad cmap table segment %u to %u.", segments->startCode, segment->endCode);
|
||||||
|
free(segments);
|
||||||
|
free(glyphIdArray);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1326,6 +1328,8 @@ read_cmap(ttf_t *font) // I - Font
|
|||||||
if (font->num_cmap == 0 || font->num_cmap > TTF_FONT_MAX_CHAR)
|
if (font->num_cmap == 0 || font->num_cmap > TTF_FONT_MAX_CHAR)
|
||||||
{
|
{
|
||||||
errorf(font, "Invalid cmap table with %u characters.", (unsigned)font->num_cmap);
|
errorf(font, "Invalid cmap table with %u characters.", (unsigned)font->num_cmap);
|
||||||
|
free(segments);
|
||||||
|
free(glyphIdArray);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1422,6 +1426,7 @@ read_cmap(ttf_t *font) // I - Font
|
|||||||
if (group->startCharCode > group->endCharCode)
|
if (group->startCharCode > group->endCharCode)
|
||||||
{
|
{
|
||||||
errorf(font, "Bad cmap table segment %u to %u.", group->startCharCode, group->endCharCode);
|
errorf(font, "Bad cmap table segment %u to %u.", group->startCharCode, group->endCharCode);
|
||||||
|
free(groups);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1436,6 +1441,7 @@ read_cmap(ttf_t *font) // I - Font
|
|||||||
if (font->num_cmap == 0 || font->num_cmap > TTF_FONT_MAX_CHAR)
|
if (font->num_cmap == 0 || font->num_cmap > TTF_FONT_MAX_CHAR)
|
||||||
{
|
{
|
||||||
errorf(font, "Invalid cmap table with %u characters.", (unsigned)font->num_cmap);
|
errorf(font, "Invalid cmap table with %u characters.", (unsigned)font->num_cmap);
|
||||||
|
free(groups);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1511,6 +1517,7 @@ read_cmap(ttf_t *font) // I - Font
|
|||||||
if (group->startCharCode > group->endCharCode)
|
if (group->startCharCode > group->endCharCode)
|
||||||
{
|
{
|
||||||
errorf(font, "Bad cmap table segment %u to %u.", group->startCharCode, group->endCharCode);
|
errorf(font, "Bad cmap table segment %u to %u.", group->startCharCode, group->endCharCode);
|
||||||
|
free(groups);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1525,6 +1532,7 @@ read_cmap(ttf_t *font) // I - Font
|
|||||||
if (font->num_cmap == 0 || font->num_cmap > TTF_FONT_MAX_CHAR)
|
if (font->num_cmap == 0 || font->num_cmap > TTF_FONT_MAX_CHAR)
|
||||||
{
|
{
|
||||||
errorf(font, "Invalid cmap table with %u characters.", (unsigned)font->num_cmap);
|
errorf(font, "Invalid cmap table with %u characters.", (unsigned)font->num_cmap);
|
||||||
|
free(groups);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user