本文介绍使用Spire.XLS for Java来获取Excel工作表中的超链接,包括获取超链接所在单元格坐标位置、超链接显示文本、超链接屏幕提示词、超链接地址、超链接类型等等。
如下用于测试的Excel文档,包含多种类型的超链接类型,包括链接到网页地址、邮件地址、文档位置、工作表单元格、网络路径等等,通过本文方法可一并获取。

import com.spire.xls.*;
import com.spire.xls.collections.HyperLinksCollection;
public class GetHyperlink {
public static void main(String[] args) {
//加载包含超链接的Excel工作簿
Workbook wb = new Workbook();
wb.loadFromFile("test.xlsx");
//获取工作表
Worksheet sheet = wb.getWorksheets().get(0);
//获取超链接集合
HyperLinksCollection hyperLinks = sheet.getHyperLinks();
//遍历所有超链接
for (int i = 0; i< hyperLinks.getCount();i++)
{
//获取包含超链接的单元格行、列坐标
int row = hyperLinks.get(i).getRange().getRow();
int column = hyperLinks.get(i).getRange().getColumn();
//获取超链接文本、地址
String text = hyperLinks.get(i).getTextToDisplay();
String address = hyperLinks.get(i).getAddress();
//输出超链接获取结果
System.out.println(String.format("单元格[%d, %d] 显示文本:" ,row ,column)+ text +"\n"+ " 链接地址:"+ address);
}
}
}
超链接获取结果:

Spire.PDF 7.1已发布。该版本支持了自定义签名图片的功能。此外还增强了转换PDF到EXEL以及转换XPS到PDF的功能。详情请阅读以下内容。
新功能:
PdfSignature signature = new PdfSignature(doc, page, cert, "123456");
signature.ConfigureCustomGraphics(DrawGraphics);
private void DrawGraphics(PdfCanvas g)
{
PointF point1 = new PointF(10, 20);
PointF point2 = new PointF(25, 50);
PointF point3 = new PointF(60, 20);
PointF[] pntArr = { point1, point2, point3 };
PdfRGBColor color = new PdfRGBColor(Color.Red);
g.DrawPolygon(new PdfPen(color), pntArr);
g.DrawRectangle(new PdfPen(Color.Green), new RectangleF(70, 10, 20, 30));
g.DrawLine(new PdfPen(Color.Blue), new PointF(120, 50), new PointF(95, 5));
g.DrawLine(new PdfPen(Color.Blue), new PointF(100, 30), new PointF(130, 20));
}
问题修复:
前面我们介绍了如何比较两个Word文档的内容。从Spire.Doc V8.12.14始,我们支持获取两个 Word 文档之间比较出的差异并返回list. 该文将介绍如何获取两个Word文档之间比较出的差异。
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using Spire.Doc.Formatting.Revisions;
using System;
namespace GetWordDifferences
{
class Program
{
static void Main(string[] args)
{
//加载第一个Word文档
Document doc1 = new Document();
doc1.LoadFromFile("https://cdn.e-iceblue.cn/Sample1.docx");
//加载第二个Word文档
Document doc2 = new Document();
doc2.LoadFromFile("https://cdn.e-iceblue.cn/Sample2.docx");
//比较文档
doc1.Compare(doc2, "Author");
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;
}
}
}
}
}
//获取差异
DifferRevisions differRevisions = new DifferRevisions(doc1);
var insetRevisionsList = differRevisions.InsertRevisions;
var deletRevisionsList = differRevisions.DeleteRevisions;
}
}
}
Imports Spire.Doc
Imports Spire.Doc.Documents
Imports Spire.Doc.Fields
Imports Spire.Doc.Formatting.Revisions
Imports System
Namespace GetWordDifferences
Class Program
Private Shared Sub Main(ByVal args() As String)
'加载第一个文档
Dim doc1 As Document = New Document
doc1.LoadFromFile("https://cdn.e-iceblue.cn/Sample1.docx")
'加载第二个文档
Dim doc2 As Document = New Document
doc2.LoadFromFile("https://cdn.e-iceblue.cn/Sample2.docx")
'比较两个文档
doc1.Compare(doc2, "Author")
For Each sec As Section In doc1.Sections
For Each docItem As DocumentObject In sec.Body.ChildObjects
If (TypeOf docItem Is Paragraph) Then
Dim para As Paragraph = CType(docItem,Paragraph)
If para.IsInsertRevision Then
Dim insRevison As EditRevision = para.InsertRevision
Dim insType As EditRevisionType = insRevison.Type
Dim insAuthor As String = insRevison.Author
Dim insDateTime As DateTime = insRevison.DateTime
ElseIf para.IsDeleteRevision Then
Dim delRevison As EditRevision = para.DeleteRevision
Dim delType As EditRevisionType = delRevison.Type
Dim delAuthor As String = delRevison.Author
Dim delDateTime As DateTime = delRevison.DateTime
End If
For Each paraItem As ParagraphBase In para.ChildObjects
If paraItem.IsInsertRevision Then
Dim insRevison As EditRevision = paraItem.InsertRevision
Dim insType As EditRevisionType = insRevison.Type
Dim insAuthor As String = insRevison.Author
Dim insDateTime As DateTime = insRevison.DateTime
ElseIf paraItem.IsDeleteRevision Then
Dim delRevison As EditRevision = paraItem.DeleteRevision
Dim delType As EditRevisionType = delRevison.Type
Dim delAuthor As String = delRevison.Author
Dim delDateTime As DateTime = delRevison.DateTime
End If
Next
End If
Next
Next
'获取差异
Dim differRevisions As DifferRevisions = New DifferRevisions(doc1)
Dim insetRevisionsList = differRevisions.InsertRevisions
Dim deletRevisionsList = differRevisions.DeleteRevisions
End Sub
End Class
End Namespace 本文介绍如何使用Spire.XLS for Java将工作表按照数据拆分成多个工作表。
原文档截图如下:

import com.spire.xls.CellRange;
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
public class SplitWorksheetIntoMultiSheets {
public static void main(String[] args) {
//创建Workbook对象,加载Excel文档
Workbook bookOriginal = new Workbook();
bookOriginal.loadFromFile("C:\\Users\\Administrator\\Desktop\\Employees.xlsx");
//获取第一个工作表
Worksheet sheet = bookOriginal.getWorksheets().get(0);
//获取标题行
CellRange headRow = sheet.getCellRange(1, 1, 1, 5);
//获取两个数据区域
CellRange range1 = sheet.getCellRange(2, 1, 6, 5);
CellRange range2 = sheet.getCellRange(7, 1, 11, 5);
//添加一个工作表,命名为“销售部”
Worksheet sheet2 = bookOriginal.getWorksheets().add("销售部");
//将标题行和数据区域1复制到“销售部”工作表
sheet.copy(headRow, sheet2, 1, 1, true, false);
sheet.copy(range1, sheet2, 2, 1, true, false);
//添加一个工作表,命名为“技术部”
Worksheet sheet3 = bookOriginal.getWorksheets().add("技术部");
//将标题行和数据区域2复制到“技术部”工作表
sheet.copy(headRow, sheet3, 1, 1, true, false);
sheet.copy(range2, sheet3, 2, 1, true, false);
//将第一个工作表中的列宽应用到新加的两个做工作表
for (int i = 0; i < sheet.getLastColumn(); i++) {
sheet2.setColumnWidth(i + 1, sheet.getColumnWidth(i + 1));
sheet3.setColumnWidth(i + 1, sheet.getColumnWidth(i + 1));
}
//保存文档
bookOriginal.saveToFile("Splited.xlsx", ExcelVersion.Version2016);
}
}
结果文档:

TIFF,即 Tagged Image File Format,这是一种比较灵活的图像格式,具有不依赖于具体硬件、可移植等特点。使用 Spire.PDF for Java,可将 PDF 转为 TIFF 保存到本地指定路径;支持转换 PDF 文档的所有页面或者指定页面为 TIFF 格式。本文,将对此作详细介绍。
首先,您需要在 Java 程序中添加 Spire.Pdf.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.pdf</artifactId>
<version>11.11.11</version>
</dependency>
</dependencies>
通过使用 Spire.PDF for Java 将 PDF 转为 TIFF 格式时,可通过设置 PdfDocument.saveToTiff() 方法中的不同参数,来实现将整个 PDF 转为 TIFF 格式或将指定页数范围的 PDF 页面转为 TIFF 格式。下面是实现转换的主要代码:
import com.spire.pdf.*;
public class PDFtoTiff {
public static void main(String[] args) {
//加载PDF测试文档
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("https://cdn.e-iceblue.cn/input.pdf");
//将整篇文档保存为tiff格式
pdf.saveToTiff("ToTiff.tiff");
//将指定页面范围保存为tiff格式(第2页到第3页,并设置水平和垂直分辨率),
pdf.saveToTiff("ToTiff2.tiff",1,2,400,600);
}
}所有页面转换结果:

指定页面转换结果:

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 获取有效期 30 天的临时许可证。
Spire.Office for Java 3.12.1已发布。在本次版本更新中,Spire.PDF for Java支持了转换PDF到TIFF,改善了doc.getPages().get(0).isBlank()方法逻辑,实现了提取PDF文本按照段落断行以及读取和写入XMP元数据的功能。此外,该版本还增强了转换PDF到Image/Excel/Word的功能。详情请阅读以下内容。
获取Spire.Office for Java 3.12.1, 请点击:https://www.e-iceblue.cn/Downloads/Spire-Office-JAVA.html
新功能:
PdfDocument pdf=new PdfDocument();
pdf.loadFromFile("C:/Test.pdf");
pdf.saveToTiff("C:/1.tiff");
pdf.saveToTiff("C:/2.tiff",1,2,TiffCompressionTypes.DEFAULT);
PdfDocument doc = new PdfDocument();
// 加载PDF文档
doc.loadFromFile(InputPath);
doc.getConvertOptions().setKeepParagraph(true);
File file = new File(OutputPath);
file.createNewFile();
FileWriter fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw);
StringBuilder builder = new StringBuilder();
PdfPageBase pageBase;
for (int i = 0; i < doc.getPages().getCount(); i++) {
pageBase = doc.getPages().get(i);
builder.append(pageBase.extractText(false) + "\r\n");
}
bw.write(builder.toString());
bw.flush();
bw.close();
fw.close();
doc.close();
PdfDocument pdf=new PdfDocument();
pdf.loadFromFile("C:/test.pdf");
//Get Xmp meta data
String lcXml = pdf.getXmpMetaData().getXmlString();
PdfDocument newDoc=new PdfDocument();
newDoc.getPages().add();
//Write Xmp meta data to PDF
newDoc.getXmpMetaData().load(lcXml);
newDoc.saveToFile("C:/new.pdf");
问题修复:
Spire.PDF for Java 3.12.6已发布。该版本支持了转换PDF到TIFF,改善了doc.getPages().get(0).isBlank()方法逻辑,实现了提取PDF文本按照段落断行以及读取和写入XMP元数据的功能。此外,该版本还增强了转换PDF到Image/Excel/Word的功能。详情请阅读以下内容。
新功能:
PdfDocument pdf=new PdfDocument();
pdf.loadFromFile("C:/Test.pdf");
pdf.saveToTiff("C:/1.tiff");
pdf.saveToTiff("C:/2.tiff",1,2,TiffCompressionTypes.DEFAULT);
PdfDocument doc = new PdfDocument();
// 加载PDF文档
doc.loadFromFile(InputPath);
doc.getConvertOptions().setKeepParagraph(true);
File file = new File(OutputPath);
file.createNewFile();
FileWriter fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw);
StringBuilder builder = new StringBuilder();
PdfPageBase pageBase;
for (int i = 0; i < doc.getPages().getCount(); i++) {
pageBase = doc.getPages().get(i);
builder.append(pageBase.extractText(false) + "\r\n");
}
bw.write(builder.toString());
bw.flush();
bw.close();
fw.close();
doc.close();
PdfDocument pdf=new PdfDocument();
pdf.loadFromFile("C:/test.pdf");
//Get Xmp meta data
String lcXml = pdf.getXmpMetaData().getXmlString();
PdfDocument newDoc=new PdfDocument();
newDoc.getPages().add();
//Write Xmp meta data to PDF
newDoc.getXmpMetaData().load(lcXml);
newDoc.saveToFile("C:/new.pdf");
问题修复:
本文介绍如何使用Spire.XLS for Java将Excel文档拆分成多个文档,每一个拆分后的文档包含一个源文档中的工作表。
import com.spire.xls.FileFormat;
import com.spire.xls.Workbook;
public class SplitWorkbook {
public static void main(String[] args) {
//创建Workbook对象
Workbook wb = new Workbook();
//加载Excel文档
wb.loadFromFile("C:\\Users\\Administrator\\Desktop\\data.xlsx");
//声明Workbook变量
Workbook newWb;
//声明String类型变量
String sheetName;
//指定拆分生成的文档的存放路径
String folderPath = "C:\\Users\\Administrator\\Desktop\\Output\\";
//遍历所有工作表
for (int i = 0; i < wb.getWorksheets().getCount(); i++) {
//初始化Workbook对象
newWb = new Workbook();
//删除默认工作表
newWb.getWorksheets().clear();
//将源文档中的指定工作表复制到新的Workbook
newWb.getWorksheets().addCopy(wb.getWorksheets().get(i));
//获取工作表表名
sheetName = wb.getWorksheets().get(i).getName();
//将新的Workbook保存为Excel文档
newWb.saveToFile(folderPath + sheetName + ".xlsx", FileFormat.Version2013);
}
}
}

Spire. Office 5.12.8已正式发布。该版本带来了很多新的功能,比如:Spire.Doc 支持获取两个 Word 文档之间比较出的差异;Spire.XLS 支持调整弯箭头的折线位置;Spire.PDF 支持了添加页面标签,以及支持通过外部服务进行数字签名并且支持设置PDF包中文件的字段并对文件进行排序等等。同时,该版本修复了大量问题。详情请阅读以下内容。
该版本涵盖了最新版的Spire.Doc, Spire.PDF, Spire.XLS, Spire.Presentation, Spire.Email, Spire.DocViewer, Spire.PDFViewer, Spire.Spreadsheet, Spire.OfficeViewer, Spire.DataExport, Spire.Barcode。
版本信息如下:
https://www.e-iceblue.cn/Downloads/Spire-Office-NET.html
新功能:
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);
问题修复:
新功能:
GeomertyAdjustValue ad = line.ShapeAdjustValues.AddAdjustValue(GeomertyAdjustValueFormulaType.LiteralValue);
// x是中间点的位置,小于0时在左边点的左侧,等于0时与左边点位置相同,等于50在图形中间,等于100时与右边点位置相同,大于100将超出右边点。
ad.SetFormulaParameter(x);
问题修复:
问题修复:
优化:
新功能:
//当文档没有页面标签时
PdfDocument doc = new PdfDocument(inputFile);
doc.PageLabels = new PdfPageLabels();
doc.PageLabels.AddRange(0, PdfPageLabels.Decimal_Arabic_Numerals_Style, "label ");
doc.SaveToFile(outputPDF);
//当文档有页面标签时
PdfDocument doc = new PdfDocument(inputFile);
PdfPageLabels label = doc.PageLabels;
label.AddRange(2, PdfPageLabels.Decimal_Arabic_Numerals_Style, "new label ");
doc.SaveToFile(outputPDF);
PdfStandardsConverter converter = new PdfStandardsConverter("in.pdf");
converter.ToPdfX1A2001("out.pdf");
signature.ConfigureCustomGraphics(DrawGraphics);
private void DrawGraphics(PdfCanvas g)
{
g.DrawString("Signed by:Tom", new PdfFont(PdfFontFamily.Helvetica, 12f), PdfBrushes.Red, new Rectangle(0, 0, 120, 20));
string inputFile = "C:/image.png";
PdfImage img = PdfImage.FromFile(inputFile);
g.DrawImage(img, 0, 60, 150, 50);
}
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);
问题修复:
人们常常需要出于各种原因替换 PDF 文档中的文本。这可能是为了纠正错误或打字错误,更新过时的信息,为特定的受众个性化定制内容,或者为符合法律或监管变化要求。通过在 PDF 中替换文本,可以保持文档的完整性,并提高所呈现信息的整体质量和相关性。在本文中,你将学习如何使用 Spire.PDF for Java 在 PDF 文档中查找替换文本。
首先,您需要在 Java 程序中添加 Spire.Pdf.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.pdf</artifactId>
<version>11.11.11</version>
</dependency>
</dependencies>
在 Spire.PDF for Java 中,PdfTextReplacer 类用于 PDF 文档中的文本替换操作。它的主要方法之一 replaceAllText(),支持将 PDF 页面上指定文本替换为新的文本。具体步骤如下:
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.texts.PdfTextReplaceOptions;
import com.spire.pdf.texts.PdfTextReplacer;
import com.spire.pdf.texts.ReplaceActionType;
import java.util.EnumSet;
public class ReplaceTextInPage
{
public static void main(String[] args)
{
// 创建一个PdfDocument对象
PdfDocument doc = new PdfDocument();
// 加载一个PDF文件
doc.loadFromFile("https://cdn.e-iceblue.cn/in.pdf");
// 创建一个PdfTextReplaceOptions对象
PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions();
// 指定文本替换的选项
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase));
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));
// 获取特定的页面
PdfPageBase page = doc.getPages().get(0);
// 根据页面创建一个PdfTextReplacer对象
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 设置替换选项
textReplacer.setOptions(textReplaceOptions);
// 将所有目标文本实例替换为新文本
textReplacer.replaceAllText("荷塘", "池塘");
// 将文档保存到不同的PDF文件
doc.saveToFile("out.pdf");
// 释放资源
doc.dispose();
}
}
上面介绍了如何在单页中替换文本。要在整个 PDF 文档中将所有特定文本替换为新文本,只需遍历文档的每一页,具体实现如下:
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.texts.PdfTextReplaceOptions;
import com.spire.pdf.texts.PdfTextReplacer;
import com.spire.pdf.texts.ReplaceActionType;
import java.util.EnumSet;
public class ReplaceTextInDocument
{
public static void main(String[] args)
{
// 创建一个PdfDocument对象
PdfDocument doc = new PdfDocument();
// 加载一个PDF文件
doc.loadFromFile("https://cdn.e-iceblue.cn/in.pdf");
// 创建一个PdfTextReplaceOptions对象
PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions();
// 指定文本替换的选项
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase));
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));
//遍历PDF文档所有页面
for (int i = 0; i < doc.getPages().getCount(); i++)
{
PdfPageBase page = doc.getPages().get(i);
// 根据页面创建一个PdfTextReplacer对象
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 设置替换选项
textReplacer.setOptions(textReplaceOptions);
// 将所有目标文本实例替换为新文本
textReplacer.replaceAllText("荷塘", "池塘");
}
// 将文档保存到不同的PDF文件
doc.saveToFile("out.pdf");
// 释放资源
doc.dispose();
}
}

在 Java 中替换 PDF 第一个匹配的目标文本,使用 PdfTextReplacer 类的 replaceText() 方法。具体参考以下步骤:
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.texts.PdfTextReplaceOptions;
import com.spire.pdf.texts.PdfTextReplacer;
import com.spire.pdf.texts.ReplaceActionType;
import java.util.EnumSet;
public class ReplaceFirstInstance {
public static void main(String[] args)
{
// 创建一个PdfDocument对象
PdfDocument doc = new PdfDocument();
// 加载一个PDF文件
doc.loadFromFile("https://cdn.e-iceblue.cn/in.pdf");
// 创建一个PdfTextReplaceOptions对象
PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions();
// 指定文本替换的选项
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase));
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));
// 获取特定页面
PdfPageBase page = doc.getPages().get(0);
// 根据页面创建一个PdfTextReplacer对象
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 设置替换选项
textReplacer.setOptions(textReplaceOptions);
// 将目标文本的第一个实例替换为新文本
textReplacer.replaceText("荷塘", "池塘");
// 将文档保存到不同的PDF文件
doc.saveToFile("out.pdf");
// 释放资源
doc.dispose();
}
}

正则表达式是一种非常强大和灵活的模式,通常用于匹配文本。在 Spire.PDF for Java 中,同样可以利用正则表达式在 PDF 文档页面中匹配特定文本并替换为新文本,步骤如下:
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.texts.PdfTextReplaceOptions;
import com.spire.pdf.texts.PdfTextReplacer;
import com.spire.pdf.texts.ReplaceActionType;
import java.util.EnumSet;
public class ReplaceBasedOnRegularExpression {
public static void main(String[] args) {
// 创建一个PdfDocument对象
PdfDocument doc = new PdfDocument();
// 加载一个PDF文件
doc.loadFromFile("https://cdn.e-iceblue.cn/in.pdf");
// 创建一个PdfTextReplaceOptions对象
PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions();
// 将替换类型设置为Regex
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.Regex));
// 获取特定页面
PdfPageBase page = doc.getPages().get(0);
// 根据页面创建一个PdfTextReplacer对象
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 设置替换选项
textReplacer.setOptions(textReplaceOptions);
// 指定正则表达式
String regularExpression = "荷.月";
// 将所有匹配正则表达式的目标文本替换为新文本
textReplacer.replaceAllText(regularExpression, "池塘花");
// 将文档保存到不同的PDF文件
doc.saveToFile("out.pdf");
// 释放资源
doc.dispose();
}
}

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。