1、.h头文件
2、生成java代码的conf
PdfiumDocumentConfigure.java
package org.swdc.pdfium.conf;
import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.annotation.Properties;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;
@Properties(value = {
@Platform(
value = "windows-x86_64",
include = "fpdf_doc.h",
link = "pdfium"
),
@Platform(
value = "macosx-x86_64",
include = "fpdf_doc.h",
link = "pdfium"
)
},
inherit = PdfiumViewConfigure.class,
target = "org.swdc.pdfium.core.PdfiumDocument",
global = "org.swdc.pdfium.core.PdfiumDocument"
)
public class PdfiumDocumentConfigure implements InfoMapper {
@Override
public void map(InfoMap infoMap) {
}
}
PdfiumEditConfigure.java
package org.swdc.pdfium.conf;
import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.annotation.Properties;
import org.bytedeco.javacpp.tools.Info;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;
@Properties(value = {
@Platform(
value = "windows-x86_64",
include = {
"fpdf_edit.h",
"fpdf_save.h",
"ext_fpdf_save.h",
"ext_fpdf_edit.h"
},
link = "pdfium"
),
@Platform(
value = "macosx-x86_64",
include = {
"fpdf_edit.h",
"fpdf_save.h",
"ext_fpdf_save.h",
"ext_fpdf_edit.h"
},
link = "pdfium"
)
},
inherit = PdfiumViewConfigure.class,
target = "org.swdc.pdfium.core.edit",
global = "org.swdc.pdfium.core.PdfiumEdit"
)
public class PdfiumEditConfigure implements InfoMapper {
@Override
public void map(InfoMap infoMap) {
infoMap.put(new Info("FPDF_FILEWRITE_").cppTypes("FPDF_FILEWRITE").translate());
// do not add ext private methods.
infoMap.put(new Info(
"priv_fpdf_write_data",
"priv_fpdf_readJpegBytes",
"FWriter_",
"PDFWriter"
).skip());
}
}
PdfiumTextConfigure.java
package org.swdc.pdfium.conf;
import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.annotation.Properties;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;
@Properties(value = {
@Platform(
value = "windows-x86_64",
include = "fpdf_text.h",
link = "pdfium"
),
@Platform(
value = "macosx-x86_64",
include = "fpdf_text.h",
link = "pdfium"
)
},
inherit = PdfiumViewConfigure.class,
target = "org.swdc.pdfium.core.PdfiumText",
global = "org.swdc.pdfium.core.PdfiumText"
)
public class PdfiumTextConfigure implements InfoMapper {
@Override
public void map(InfoMap infoMap) {
}
}
PdfiumViewConfigure.java
package org.swdc.pdfium.conf;
import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.annotation.Properties;
import org.bytedeco.javacpp.tools.Info;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;
@Properties(value = {
@Platform(
value = "windows-x86_64",
include = "fpdfview.h",
link = "pdfium",
preload = "pdfium"
),
@Platform(
value = "macosx-x86_64",
include = "fpdfview.h",
link = "pdfium",
preload = "pdfium"
)
},
target = "org.swdc.pdfium.core.view",
global = "org.swdc.pdfium.core.PdfiumView"
)
public class PdfiumViewConfigure implements InfoMapper {
@Override
public void map(InfoMap infoMap) {
translateType(infoMap,"fpdf_annotation_t__","FPDF_ANNOTATION");
translateType(infoMap,"fpdf_attachment_t__","FPDF_ATTACHMENT");
translateType(infoMap,"fpdf_avail_t__","FPDF_AVAIL");
translateType(infoMap,"fpdf_bitmap_t__","FPDF_BITMAP");
translateType(infoMap,"fpdf_bookmark_t__","FPDF_BOOKMARK");
translateType(infoMap,"fpdf_clippath_t__","FPDF_CLIPPATH");
translateType(infoMap,"fpdf_dest_t__","FPDF_DEST");
translateType(infoMap,"fpdf_document_t__","FPDF_DOCUMENT");
translateType(infoMap,"fpdf_font_t__","FPDF_FONT");
translateType(infoMap,"fpdf_form_handle_t__","FPDF_FORMHANDLE");
translateType(infoMap,"fpdf_javascript_action_t","FPDF_JAVASCRIPT_ACTION");
translateType(infoMap,"fpdf_link_t__","FPDF_LINK");
translateType(infoMap,"fpdf_page_t__","FPDF_PAGE");
translateType(infoMap,"fpdf_pagelink_t__","FPDF_PAGELINK");
translateType(infoMap,"fpdf_pageobject_t__","FPDF_PAGEOBJECT");
translateType(infoMap,"fpdf_pageobjectmark_t__","FPDF_PAGEOBJECTMARK");
translateType(infoMap,"fpdf_schhandle_t__","FPDF_SCHHANDLE");
translateType(infoMap,"fpdf_structelement_t__","FPDF_STRUCTELEMENT");
translateType(infoMap,"fpdf_structtree_t__","FPDF_STRUCTTREE");
translateType(infoMap,"fpdf_textpage_t__","FPDF_TEXTPAGE");
translateType(infoMap,"fpdf_widget_t__","FPDF_WIDGET");
translateType(infoMap,"fpdf_xobject_t__","FPDF_XOBJECT");
translateType(infoMap,"fpdf_action_t__","FPDF_ACTION");
translateConstType(infoMap,"fpdf_pagerange_t__","FPDF_PAGERANGE");
translateConstType(infoMap,"fpdf_pathsegment_t","FPDF_PATHSEGMENT");
translateConstType(infoMap,"fpdf_signature_t__","FPDF_SIGNATURE");
translateConstType(infoMap,"fpdf_structelement_attr_t__","FPDF_STRUCTELEMENT_ATTR");
translateConstType(infoMap,"fpdf_glyphpath_t__","FPDF_GLYPHPATH");
infoMap.put(new Info("FPDF_STRING").cppTypes("const char*").translate());
infoMap.put(new Info("FPDF_WCHAR").cppTypes("unsigned short").translate());
infoMap.put(new Info("FPDF_BYTESTRING").cppTypes("const char*").translate());
infoMap.put(new Info("FPDF_WIDESTRING").cppTypes("unsigned short*").translate());
infoMap.put(new Info("FPDF_EXPORT").cppText("#define FPDF_EXPORT\n"));
infoMap.put(new Info("FPDF_CALLCONV").cppText("#define FPDF_CALLCONV\n"));
infoMap.put(new Info(
"HDC",
"FPDF_BStr_Clear",
"FPDF_BStr_Set",
"FPDF_BStr_Init",
"FPDF_GetRecommendedV8Flags",
"FPDF_RenderPageSkia",
"FPDF_SetPrintMode",
"FPDF_GetArrayBufferAllocatorSharedInstance"
).skip());
}
private void translateType(InfoMap map, String oldName, String newName) {
map.put(new Info(newName).cppTypes(oldName + "*").translate());
}
private void translateConstType(InfoMap map, String oldName, String newName) {
map.put(new Info(newName).cppTypes("const struct " + oldName + " *").translate());
}
}
2、工程根pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.swdc</groupId>
<artifactId>javacpp-presets</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>live2d</module>
<module>pdfium</module>
<module>pdfium4j</module>
<module>mariadb</module>
<module>dearimgui</module>
<module>videoai</module>
</modules>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- <javacpp.platform>${os.name}-${os.arch}</javacpp.platform>-->
<osname>windows</osname>
<osarch>x86_64</osarch>
<javacpp.platform>windows-x86_64</javacpp.platform>
</properties>
</project>
4、执行mvn clean 和 mvn package 详见
5、第一次执行 mvn clean 和 mvn package 时 pdfium的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.swdc</groupId>
<artifactId>javacpp-presets</artifactId>
<version>1.0</version>
</parent>
<artifactId>pdfium</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<javacpp.version>1.5.10</javacpp.version>
<build.skip>false</build.skip>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>${javacpp.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp-platform</artifactId>
<version>${javacpp.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>${javacpp.version}</version>
<configuration>
<encoding>ISO-8859-1</encoding>
<includePaths>
<!-- 对应 Platform注解中的 includePath-->
<!-- ${basedir} 为当前pom文件所在的项目目录 此处是videoai-->
<!-- .h头文件所在目录-->
<includePath>${basedir}/../platforms/Pdfium/include/</includePath>
<includePath>${basedir}/../platforms/Pdfium/ext/</includePath>
</includePaths>
<linkPaths>
<linkPath>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/</linkPath>
</linkPaths>
</configuration>
<executions>
<execution>
<id>javacpp.parser</id>
<phase>generate-sources</phase>
<goals>
<goal>build</goal>
</goals>
<configuration>
<skip>true</skip>
<!--输出目录生成jnidll的目录 三次 mvn clean mvn package skip都是true-->
<outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
</outputDirectory>
<classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
<deleteJniFiles>true</deleteJniFiles>
</configuration>
</execution>
<execution>
<id>javacpp.compiler</id>
<phase>process-classes</phase>
<goals>
<goal>build</goal>
</goals>
<configuration>
<skip>false</skip>
<!-- 第一二次mvn clean mvn package skip都是false 第三次是true-->
<!-- 第一次mvn clean mvn package生成java代码的目录 -->
<outputDirectory>${basedir}/src/main/java/
</outputDirectory>
<!-- 第二次mvn clean mvn package生成jnidll的目录 -->
<!-- <outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/-->
<!-- </outputDirectory>-->
<deleteJniFiles>true</deleteJniFiles>
<classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
<copyLibs>false</copyLibs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
6、第二次执行 mvn clean 和 mvn package 时 pdfium的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.swdc</groupId>
<artifactId>javacpp-presets</artifactId>
<version>1.0</version>
</parent>
<artifactId>pdfium</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<javacpp.version>1.5.10</javacpp.version>
<build.skip>false</build.skip>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>${javacpp.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp-platform</artifactId>
<version>${javacpp.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>${javacpp.version}</version>
<configuration>
<encoding>ISO-8859-1</encoding>
<includePaths>
<!-- 对应 Platform注解中的 includePath-->
<!-- ${basedir} 为当前pom文件所在的项目目录 此处是videoai-->
<!-- .h头文件所在目录-->
<includePath>${basedir}/../platforms/Pdfium/include/</includePath>
<includePath>${basedir}/../platforms/Pdfium/ext/</includePath>
</includePaths>
<linkPaths>
<linkPath>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/</linkPath>
</linkPaths>
</configuration>
<executions>
<execution>
<id>javacpp.parser</id>
<phase>generate-sources</phase>
<goals>
<goal>build</goal>
</goals>
<configuration>
<skip>true</skip>
<!--输出目录生成jnidll的目录 三次 mvn clean mvn package skip都是true-->
<outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
</outputDirectory>
<classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
<deleteJniFiles>true</deleteJniFiles>
</configuration>
</execution>
<execution>
<id>javacpp.compiler</id>
<phase>process-classes</phase>
<goals>
<goal>build</goal>
</goals>
<configuration>
<skip>false</skip>
<!-- 第一二次mvn clean mvn package skip都是false 第三次是true-->
<!-- 第一次mvn clean mvn package生成java代码的目录 -->
<!-- <outputDirectory>${basedir}/src/main/java/-->
<!-- </outputDirectory>-->
<!-- 第二次mvn clean mvn package生成jnidll的目录 -->
<outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
</outputDirectory>
<deleteJniFiles>true</deleteJniFiles>
<classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
<copyLibs>false</copyLibs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
7、第三次执行 mvn clean 和 mvn package 时 pdfium的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.swdc</groupId>
<artifactId>javacpp-presets</artifactId>
<version>1.0</version>
</parent>
<artifactId>pdfium</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<javacpp.version>1.5.10</javacpp.version>
<build.skip>false</build.skip>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>${javacpp.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp-platform</artifactId>
<version>${javacpp.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>${javacpp.version}</version>
<configuration>
<encoding>ISO-8859-1</encoding>
<includePaths>
<!-- 对应 Platform注解中的 includePath-->
<!-- ${basedir} 为当前pom文件所在的项目目录 此处是videoai-->
<!-- .h头文件所在目录-->
<includePath>${basedir}/../platforms/Pdfium/include/</includePath>
<includePath>${basedir}/../platforms/Pdfium/ext/</includePath>
</includePaths>
<linkPaths>
<linkPath>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/</linkPath>
</linkPaths>
</configuration>
<executions>
<execution>
<id>javacpp.parser</id>
<phase>generate-sources</phase>
<goals>
<goal>build</goal>
</goals>
<configuration>
<skip>true</skip>
<!--输出目录生成jnidll的目录 三次 mvn clean mvn package skip都是true-->
<outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
</outputDirectory>
<classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
<deleteJniFiles>true</deleteJniFiles>
</configuration>
</execution>
<execution>
<id>javacpp.compiler</id>
<phase>process-classes</phase>
<goals>
<goal>build</goal>
</goals>
<configuration>
<skip>true</skip>
<!-- 第一二次mvn clean mvn package skip都是false 第三次是true-->
<!-- 第一次mvn clean mvn package生成java代码的目录 -->
<!-- <outputDirectory>${basedir}/src/main/java/-->
<!-- </outputDirectory>-->
<!-- 第二次mvn clean mvn package生成jnidll的目录 -->
<outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
</outputDirectory>
<deleteJniFiles>true</deleteJniFiles>
<classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
<copyLibs>false</copyLibs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
8、此时生成的pdfium-1.0.jar 便可以实现javacpp调用
9、详细代码连接如下
通过百度网盘分享的文件:javacpp-demo.zip
链接:https://pan.baidu.com/s/1ZDvctWkGG1rL1683xS8Srw?pwd=2e5y
提取码:2e5y
10、总结如下
第一步 mvn clean mvn package 是生成java 代码
第二步 mvn clean mvn package 是生成jni动态库
第三步 mvn clean mvn package 是生成可以使用的jar