前面我们介绍了使用PdfGrid类创建表格,该文将介绍如何使用PdfTable类创建并格式化表格。
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.tables.*;
import java.awt.*;
import java.awt.geom.Point2D;
public class CreatePDFTable {
public static void main(String[] args) {
//创建PDF文档
PdfDocument doc = new PdfDocument();
//设置margin
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
PdfMargins margin = new PdfMargins();
margin.setTop(unitCvtr.convertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point));
margin.setBottom(margin.getTop());
margin.setLeft(unitCvtr.convertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point));
margin.setRight(margin.getLeft());
// 添加一页
PdfPageBase page = doc.getPages().add(PdfPageSize.A4, margin);
//添加表格
PdfTable table = new PdfTable();
PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(Color.black));
table.getStyle().setBorderPen(new PdfPen(brush, 0.5f));
table.getStyle().getHeaderStyle().setStringFormat(new PdfStringFormat(PdfTextAlignment.Center));
table.getStyle().setHeaderSource(PdfHeaderSource.Rows);
table.getStyle().setHeaderRowCount(1);
table.getStyle().setShowHeader(true);
table.getStyle().setCellPadding(2);
table.getStyle().setHeaderSource(PdfHeaderSource.Rows);
table.getStyle().setHeaderRowCount(1);
table.getStyle().setShowHeader(true);
//设置表头字体和样式
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体",Font.PLAIN, 12));
table.getStyle().getHeaderStyle().setFont(font);
table.getStyle().getHeaderStyle().setBackgroundBrush(PdfBrushes.getCadetBlue());
PdfTrueTypeFont fontBody = new PdfTrueTypeFont(new Font("宋体", Font.PLAIN,10));
//设置偶数行字体
table.getStyle().getDefaultStyle().setFont(fontBody);
//设置奇数行字体
table.getStyle().getAlternateStyle().setFont(fontBody);
//定义数据
String[] data = {"洲;国家;人口;世界人口占比;备注",
"亚洲;中国;1,391,190,000;18.2%; ",
"亚洲;日本;126,490,000;1.66%; ",
"欧洲;英国;65,648,054;0.86%; ",
"欧洲;德国;82,665,600;1.08%; ",
"北美洲;加拿大;37,119,000;0.49%; ",
"北美洲;美国;327,216,000;4.29%; "
};
String[][] dataSource = new String[data.length][];
for (int i = 0; i < data.length; i++) {
dataSource[i] = data[i].split("[;]", -1);
}
table.setDataSource(dataSource);
for(int i = 0; i < table.getColumns().getCount();i++)
{
PdfColumn column= table.getColumns().get(i);
column.setStringFormat(new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle));
}
//添加表格
table.draw(page, new Point2D.Float(0, 50));
//保存文档
doc.saveToFile("output/addTable.pdf", FileFormat.PDF);
}
}
效果图:

Spire.Doc 8.12.14已发布。该版本支持获取两个Word文档之间比较出的差异,并且支持获取修订的作者和时间。此外,该版本还增强了转换Word到PDF的功能以及修复了克隆文档时出现的问题。详情请阅读以下内容。
新功能:
Document doc1 = new Document();
doc1.LoadFromFile("C:/1.docx");
Document doc2 = new Document();
doc2.LoadFromFile("C:/2.docx");
doc1.Compare(doc2, "spire.support");
foreach (Section sec in doc1.Sections)
{
foreach (DocumentObject docItem in sec.Body.ChildObjects)
{
if (docItem is Paragraph)
{
Paragraph para = docItem as Paragraph;
if (para.IsInsertRevision)
{
EditRevision insRevison = para.InsertRevision;
EditRevisionType insType = insRevison.Type;
string insAuthor = insRevison.Author;
DateTime insDateTime = insRevison.DateTime;
}
else if (para.IsDeleteRevision)
{
EditRevision delRevison = para.DeleteRevision;
EditRevisionType delType = delRevison.Type;
string delAuthor = delRevison.Author;
DateTime delDateTime = delRevison.DateTime;
}
foreach (ParagraphBase paraItem in para.ChildObjects)
{
if (paraItem.IsInsertRevision)
{
EditRevision insRevison = paraItem.InsertRevision;
EditRevisionType insType = insRevison.Type;
string insAuthor = insRevison.Author;
DateTime insDateTime = insRevison.DateTime;
}
else if (paraItem.IsDeleteRevision)
{
EditRevision delRevison = paraItem.DeleteRevision;
EditRevisionType delType = delRevison.Type;
string delAuthor = delRevison.Author;
DateTime delDateTime = delRevison.DateTime;
}
}
}
}
}
//Get the difference about revisions
DifferRevisions differRevisions = new DifferRevisions(doc1);
doc1.SaveToFile("C:/result.docx", FileFormat.Docx);
问题修复:
Spire.PDF 6.12.20已发布。该版本支持通过外部服务进行数字签名并且支持设置PDF包中文件的字段并对文件进行排序。此外还增强了PDF转换到PDF/A 和PDF/A -3b的功能,以及修复了在查找文本中出现的问题。详情请阅读以下信息。
新功能:
void Sign()
{
PdfDocument doc = new PdfDocument();
doc.LoadFromFile(inputPath);
//Load the certificate
X509Certificate2 cert = new X509Certificate2(certPath, passwd);
CustomPKCS7SignatureFormatter customPKCS7SignatureFormatter = new CustomPKCS7SignatureFormatter(cert);
PdfSignature signature = new PdfSignature(doc, doc.Pages[0], customPKCS7SignatureFormatter, "signature0");
signature.Bounds = new RectangleF(new PointF(90, 550), new SizeF(270, 90));
//Set the dispay mode of graphics, if not set any, the default one will be applied
signature.GraphicsMode = GraphicMode.SignDetail;
signature.NameLabel = "Signer:";
signature.Name = "gary";
signature.ContactInfoLabel = "ContactInfo:";
signature.DateLabel = "Date:";
signature.Date = DateTime.Now;
signature.LocationInfoLabel = "Location:";
signature.LocationInfo = "Chengdu";
signature.ReasonLabel = "Reason: ";
signature.Reason = "The certificate of this document";
signature.DistinguishedNameLabel = "DN: ";
signature.DocumentPermissions = PdfCertificationFlags.AllowFormFill | PdfCertificationFlags.ForbidChanges;
signature.SignDetailsFont = new PdfFont(PdfFontFamily.TimesRoman, 10f);
signature.SignNameFont = new PdfFont(PdfFontFamily.Courier, 15);
signature.SignImageLayout = SignImageLayout.None;
//Save pdf file.
doc.SaveToFile(outputPath, Spire.Pdf.FileFormat.PDF);
}
class CustomPKCS7SignatureFormatter : IPdfSignatureFormatter
{
/// <summary>
/// If encapsulate is true, a copy of the message will be included in the signature.
/// </summary>
private bool m_encapsulate = true;
/// <summary>
/// The signing certificate.
/// </summary>
private X509Certificate2 m_certificate = null;
public Dictionary<String, Object> m_parameters = new Dictionary<string, object>();
/// <summary>
/// Parameters for the encoding of the signature.
/// 1.Key:Filter,String
/// Required
/// The name of the preferred signature handler to use when validating this signature.
/// 2.SubFilter,String
/// Required
/// A name that describes the encoding of the signature value.
/// PDF 1.6 defines the following values for public-key cryptographic signatures: adbe.x509.rsa_sha1, adbe.pkcs7.detached, and adbe.pkcs7.sha1
/// 3.Cert,X509Certificate2
/// Required when SubFilter is adbe.x509.rsa_sha1
/// </summary>
public Dictionary<String, Object> Parameters
{
get
{ return m_parameters; }
}
/// <summary>
/// Construct a new instance.
/// </summary>
/// <param name="certificate">The signing certificate.</param>
/// <param name="encapsulate">
/// If encapsulate is true, a copy of the message will be included in the signature.
/// </param>
public CustomPKCS7SignatureFormatter(X509Certificate2 certificate)
{
if (null == certificate)
{ throw new ArgumentNullException("certificate"); }
m_certificate = certificate;
Parameters.Add("Filter", "Adobe.PPKMS");
Parameters.Add("SubFilter", m_encapsulate ? "adbe.pkcs7.sha1" : "adbe.pkcs7.detached");
}
/// <summary>
/// Sign.
/// </summary>
/// <param name="content">The data that contains signature content.</param>
/// <returns>The signature</returns>
public byte[] Sign(byte[] content)
{
CmsSigner cmsSigner = new CmsSigner(m_certificate);
SHA1 sha1 = SHA1.Create();
SignedCms signedCms = new SignedCms(new ContentInfo(m_encapsulate ? sha1.ComputeHash(content) : content), !m_encapsulate);
signedCms.ComputeSignature(cmsSigner, true);
byte[] result = signedCms.Encode();
return result;
}
}
string[] files = Directory.GetFiles(@"files");
string inputFile = @"input.pdf";
string outputFile = @"result.pdf";
using (PdfDocument doc = new PdfDocument(inputFile))
{
//添加字段
doc.Collection.AddCustomField("No", "序号", Spire.Pdf.Collections.CustomFieldType.NumberField);
doc.Collection.AddFileRelatedField("FileName", "文件名称", Spire.Pdf.Collections.FileRelatedFieldType.FileName);
doc.Collection.AddFileRelatedField("Desc", "文件描述", Spire.Pdf.Collections.FileRelatedFieldType.Desc);
doc.Collection.AddFileRelatedField("CreateDate", "创建时间", Spire.Pdf.Collections.FileRelatedFieldType.CreationDate);
doc.Collection.AddFileRelatedField("ModDate", "修改时间", Spire.Pdf.Collections.FileRelatedFieldType.ModDate);
doc.Collection.AddFileRelatedField("FileSize", "文件大小", Spire.Pdf.Collections.FileRelatedFieldType.Size);
doc.Collection.AddCustomField("FileType", "文件类型", Spire.Pdf.Collections.CustomFieldType.TextField);
doc.Collection.AddCustomField("FileDate", "自定义时间", Spire.Pdf.Collections.CustomFieldType.DateField);
//根据字段对附件排序
doc.Collection.Sort(new string[] { "No", "fileName", "Desc", "CreateDate", "ModDate", "FileSize", "FileType", "FileDate" }, new bool[] { false, true, true, true, true, true, true, true });
for (int i = 0; i < files.Length; i++)
{
PdfAttachment attachment = new PdfAttachment(files[i]);
doc.Collection.AddAttachment(attachment);
}
int n = 1;
//设置字段值
foreach (PdfAttachment att in doc.Collection.AssociatedFiles)
{
att.SetFieldValue("No", n);
att.Description = n + "文件描述";
att.SetFieldValue("FileDate", DateTime.Today);
att.SetFieldValue("FileType", n + "文件");
n++;
}
doc.SaveToFile(outputFile, FileFormat.PDF);
doc.Dispose();
}
PdfDocument doc = new PdfDocument();
doc.LoadFromFile(inputPath);
PdfAttachment attachment = new PdfAttachment(attachmentPath);
doc.Attachments.Add(attachment,doc,Spire.Pdf.General.PdfAttachmentRelationship.Alternative);
doc.SaveToFile(outputPath);
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile(https://cdn.e-iceblue.cn/inputFile, FileFormat.PDF);
RectangleF rctg = new RectangleF(0, 0, 200, 100);
PdfTextFindCollection findCollection = pdf.Pages[0].FindText(rctg, "DEPOSIT", TextFindParameter.WholeWord);
PdfTextFindCollection findCollectionOut = pdf.Pages[0].FindText(rctg, "agreement", TextFindParameter.WholeWord);
foreach (PdfTextFind find in findCollection.Finds)
{ find.ApplyHighLight(Color.Green); }
foreach (PdfTextFind findOut in findCollectionOut.Finds)
{ findOut.ApplyHighLight(Color.Yellow); }
pdf.SaveToFile(outputFile, FileFormat.PDF);
问题修复:
超链接是非常方便的功能,在 Word 文档中十分常见。读者只需点击超链接,就可跳转到网页、内部文件、邮箱以及正在阅读的文档中的某一部分。本文将教大家使用 Spire.Doc for Java 查找并导出 Word 文档中的超链接。
首先,您需要在 Java 程序中添加 Spire.Doc.jar 文件作为依赖项。您可以从 这个链接 下载 JAR 文件;如果您使用 Maven,则可以通过在 pom.xml 文件中添加以下代码导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc</artifactId>
<version>13.12.2</version>
</dependency>
</dependencies>
详细操作步骤如下:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.Field;
import java.io.*;
import java.util.ArrayList;
public class findHyperlinks {
public static void main(String[] args) throws IOException {
// 创建 Document 的对象并从磁盘导入Word文档
String input = "D:/testp/示例.docx";
Document doc = new Document();
doc.loadFromFile(input);
// 创建 ArrayList<Field> 的对象
ArrayList<Field> hyperlinks = new ArrayList<Field>();
// 循环遍历Word文档中所有节下的 DocumentObject 对象,找到所有超链接
for (Section section : (Iterable<Section>) doc.getSections()) {
for (DocumentObject object : (Iterable<DocumentObject>) section.getBody().getChildObjects()) {
if (object.getDocumentObjectType().equals(DocumentObjectType.Paragraph)) {
Paragraph paragraph = (Paragraph) object;
for (DocumentObject cObject : (Iterable<DocumentObject>) paragraph.getChildObjects()) {
if (cObject.getDocumentObjectType().equals(DocumentObjectType.Field)) {
Field field = (Field) cObject;
if (field.getType().equals(FieldType.Field_Hyperlink)) {
hyperlinks.add(field);
}
}
}
}
}
}
//获取第一个超链接的文本和地址
String hyperlinksText = hyperlinks.get(0).getFieldText();
String hyperlinkAddress = hyperlinks.get(0).getValue();
//将第一个超链接的文本和链接地址保存到TXT文件
String output = "D:/javaOutput/超链接文本和地址.txt";
writeStringToText("Text:\r\n" + hyperlinksText+ "\r\n" + "Link:\r\n" + hyperlinkAddress, output);
}
//创建一个自定义方法将超链接文字和地址保存到TXT文件
public static void writeStringToText(String content, String textFileName) throws IOException {
File file = new File(textFileName);
if (file.exists())
{
file.delete();
}
FileWriter fWriter = new FileWriter(textFileName, true);
try {
fWriter.write(content);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
fWriter.flush();
fWriter.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
详细操作步骤如下:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.Field;
import java.io.*;
import java.util.ArrayList;
public class findHyperlinks {
public static void main(String[] args) throws IOException {
//创建 Document 的对象并从磁盘导入Word文档
String input = "D:/testp/示例.docx";
Document doc = new Document();
doc.loadFromFile(input);
//创建 ArrayList<Field> 的对象
ArrayList<Field> hyperlinks = new ArrayList<Field>();
String hyperlinkText = "";
String hyperlinkAddress = "";
//循环遍历Word文档中所有节下的 DocumentObject 对象,找到所有超链接
for (Section section : (Iterable<Section>) doc.getSections()) {
for (DocumentObject object : (Iterable<DocumentObject>) section.getBody().getChildObjects()) {
if (object.getDocumentObjectType().equals(DocumentObjectType.Paragraph)) {
Paragraph paragraph = (Paragraph) object;
for (DocumentObject cObject : (Iterable<DocumentObject>) paragraph.getChildObjects()) {
if (cObject.getDocumentObjectType().equals(DocumentObjectType.Field)) {
Field field = (Field) cObject;
if (field.getType().equals(FieldType.Field_Hyperlink)) {
hyperlinks.add(field);
//获取所有超链接的文本和地址
hyperlinkText += field.getFieldText() + "\r\n";
hyperlinkAddress += field.getValue() + "\r\n";
}
}
}
}
}
}
//将所有超链接的文本和链接地址保存到TXT文件
String output = "D:/javaOutput/超链接文本和地址.txt";
writeStringToText("Text:\r\n " + hyperlinkText + "\r\n" + "Link:\r\n" + hyperlinkAddress + "\r\n", output);
}
//创建一个自定义方法将超链接文字和地址保存到TXT文件
public static void writeStringToText(String content, String textFileName) throws IOException {
File file = new File(textFileName);
if (file.exists())
{
file.delete();
}
FileWriter fWriter = new FileWriter(textFileName, true);
try {
fWriter.write(content);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
fWriter.flush();
fWriter.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
该文将介绍如何使用Spire.PDF for java 展开或折叠书签
展开PDF文档中的所有书签
import com.spire.pdf.PdfDocument;
public class expandBookmarks {
public static void main(String[] args) {
PdfDocument doc = new PdfDocument();
doc.loadFromFile("https://cdn.e-iceblue.cn/Sample.pdf");
// true为展开,false为折叠
doc.getViewerPreferences().setBookMarkExpandOrCollapse(true);
doc.saveToFile("output/expandAllBookmarks_out.pdf");
doc.close();
}
}
效果图:

仅展开特定书签
import com.spire.pdf.PdfDocument;
import com.spire.pdf.bookmarks.*;
public class expandSpecificBookmarks {
public static void main(String[] args) {
PdfDocument doc = new PdfDocument();
doc.loadFromFile("https://cdn.e-iceblue.cn/Sample.pdf");
//展开第一个书签
doc.getBookmarks().get(0).setExpandBookmark(true);
//设置BookMarkExpandOrCollapse 为 "false" 折叠第二个书签
PdfBookmarkCollection pdfBookmark = doc.getBookmarks().get(1);
pdfBookmark.get(0).setExpandBookmark(false);
doc.saveToFile("output/expandSpecificBookmarks_out.pdf");
doc.close();
}
}
效果图:

Spire.Doc 8.12.9已发布。该版本增强了转换Word/HTML 到PDF的功能,此外还修复了加载RTF文档时出现的问题。详情请阅读以下内容。
问题修复:
Spire.Spreadsheet 4.12.1已发布。该版本主要修复了加载Excel文档时,抛“System.ArgumentNullException”的问题。详情请阅读以下内容。
问题修复:
https://www.e-iceblue.cn/Downloads/Spire-Spreadsheet-NET.html
该文将详细介绍如何使用Spire.PDF for Java设置PDF 文档的页面显示样式及缩放比例。
PDF页面初始视图显示设置:
import com.spire.pdf.*;
public class viewerPreference {
public static void main(String[] args) {
//加载示例文档
PdfDocument doc = new PdfDocument();
doc.loadFromFile("https://cdn.e-iceblue.cn/Sample.pdf");
//居中窗口
doc.getViewerPreferences().setCenterWindow(true);
//隐藏标题
doc.getViewerPreferences().setDisplayTitle(false);
//不适合整页至窗口
doc.getViewerPreferences().setFitWindow(false);
//隐藏菜单栏
doc.getViewerPreferences().setHideMenubar(true);
//隐藏工具栏
doc.getViewerPreferences().setHideToolbar(true);
//页面布局设置为单页
doc.getViewerPreferences().setPageLayout(PdfPageLayout.Single_Page);
//保存文档
String output = "output/viewerPreference.pdf";
doc.saveToFile(output, FileFormat.PDF);
}
}
效果图:

设置PDF缩放比例
import com.spire.pdf.*;
import com.spire.pdf.actions.*;
import com.spire.pdf.general.*;
import java.awt.geom.*;
public class setZoomFactor {
public static void main(String[] args) {
//加载示例文档
PdfDocument doc = new PdfDocument();
doc.loadFromFile("https://cdn.e-iceblue.cn/Sample.pdf");
//获取第一页
PdfPageBase page = doc.getPages().get(0);
//设置PDF页面显示位置
PdfDestination dest = new PdfDestination(page);
dest.setMode(PdfDestinationMode.Location);
dest.setLocation(new Point2D.Float(-40f, -40f));
//设置缩放比例
dest.setZoom(0.8f);
//设置打开PDF文档时的页面显示缩放比例
PdfGoToAction gotoAction = new PdfGoToAction(dest);
doc.setAfterOpenAction(gotoAction);
//保存文档
String output = "output/setZoomFactor.pdf";
doc.saveToFile(output);
}
}
效果图:

本文介绍使用Spire.PDF for Java如何获取PDF文档中的数字签名信息,包括签名人、签名位置、日期、原因、联系方式、签名在文档中的坐标等等。
import com.spire.pdf.*;
import com.spire.pdf.security.PdfSignature;
import com.spire.pdf.widget.PdfFormFieldWidgetCollection;
import com.spire.pdf.widget.PdfFormWidget;
import com.spire.pdf.widget.PdfSignatureFieldWidget;
public class GetSignature {
public static void main(String[] args) {
//创建PdfDocument实例
PdfDocument pdf = new PdfDocument();
//加载含有签名的PDF文件
pdf.loadFromFile("https://cdn.e-iceblue.cn/AddSignature.pdf");
//获取域集合
PdfFormWidget pdfFormWidget = (PdfFormWidget) pdf.getForm();
PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();
//遍历域
for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i++) {
//判定是否为签名域
if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {
//获取签名域
PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);
//获取签名
PdfSignature signature = signatureFieldWidget.getSignature();
String location = signature.getLocationInfo();
String reason = signature.getReason();
String data = signature.getDate().toString();
String name = signature.getSignatureName();
System.out.println("签名位置信息:"+ location +"\n"+
"签名原因:" + reason +"\n"+
"签名日期:"+ data +"\n"+
"签名人:"+ name +"\n"+
"文档中的签名坐标:X = "+ signatureFieldWidget.getLocation().getX()+ " Y = "+ signatureFieldWidget.getLocation().getY());
}
}
}
}
签名获取结果:

Spire.PDF 6.12.10已正式发布。 该版本支持嵌入所有使用的字体到已有的PDF,并且修复了转换PDF为Excel和图片、打印PDF 文档、设置对齐方式等操作是出现的一些问题。功能优化及问题修复详情,参见以下内容。
优化:
问题修复: