replacePDF 替换PDF文字[v1.0]
[i=s] 本帖最后由 CrLf 于 2017-10-15 00:37 编辑 [/i]下载地址:[url]http://www.bathome.net/s/tool/?down=replacePDF[/url]
附上中文说明:
[quote]replacePDF - 替换PDF文字 version 1.0 by CrLf [bathome.net]
Usage: replacePDF.exe textSrc textDst fileSrc fileDst [/option value]
textSrc 替换前的文字
textDst 替换后的文字
fileSrc 来源的文件
fileDst 保存的文件
/index num 只替换第 N 个匹配项
/font fontName 指定替换后的字体名,例如 "Verdana"
/size fontSize 指定替换后的字号,例如 12.5
/color color 指定文字颜色,例如 "red" 或 "#ff0000"
/bgcolor color 指定背景颜色,例如 "red" 或 "#ff0000"
/underline bool 指定是否加上下划线,例如 "true" 或 "false"[/quote]
以下为 C# 源码,基于 .Net2.0,依赖 Aspose.Pdf.dll(2015年的10.1版),若要打包单文件版请自行引入 dll 资源,并将最开始处的注释取消[code]using System;
using System.Drawing;
using System.Text;
using Aspose.Pdf;
using Aspose.Pdf.Text;
namespace replacePDF
{
class Program
{
//以下注释中的代码用于打包单文件版
//static Program() {
// AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
//}
//static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
//{
// //获取加载失败的程序集的全名
// var assName = new System.Reflection.AssemblyName(args.Name).FullName;
// if (args.Name == "Aspose.Pdf, Version=10.1.0.0, Culture=neutral, PublicKeyToken=00725b1ceb58d0a9")
// {
// //读取资源
// using (var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("replacePDF.Aspose.Pdf.dll"))
// {
// var bytes = new byte[stream.Length];
// stream.Read(bytes, 0, (int)stream.Length);
// return System.Reflection.Assembly.Load(bytes);//加载资源文件中的dll,代替加载失败的程序集
// }
// }
// throw new DllNotFoundException(assName);
//}
class textStyle
{
public bool hasFont = false;
public Aspose.Pdf.Text.Font Font;
public int Underline = -1;
public int Index;
public float Size = -1;
public float LineSpacing = -1;
public System.Drawing.Color Color = System.Drawing.Color.Empty;
public System.Drawing.Color BgColor = System.Drawing.Color.Empty;
}
static void Usage()
{
Console.WriteLine(
"replacePDF - Replace text in Pdf. version 1.0 by CrLf [bathome.net]\r\n" +
"\r\n" +
"Usage: replacePDF.exe textSrc textDst fileSrc fileDst [/option value]\r\n"+
" textSrc The text before replace\r\n"+
" textDst The text after replace\r\n"+
" fileSrc Specifies the source file to replace\r\n"+
" fileDst Specifies the file to save\r\n" +
" /index num Replace on the NO.? Matchs\r\n" +
" /font fontName Specifies the font name, such as \"Verdana\"\r\n"+
" /size fontSize Specifies the font size, such as 12.5\r\n"+
" /color color Specifies the text color, such as \"red\" or \"#ff0000\"\r\n"+
" /bgcolor color Specifies the background color, such as \"red\" or \"#ff0000\"\r\n"+
" /underline bool Enable text underline, such as \"true\" or \"false\"\r\n"
);
exit(0);
}
static int Replace(String textSrc, String textDst, String fileSrc, String fileDst, textStyle style)
{
int count_replace = 0,
count_success = 0,
count_fail = 0;
Document pdfDocument = new Document(fileSrc);
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(textSrc);
//accept the absorber for all the pages
//textFragmentAbsorber.TextSearchOptions.;
pdfDocument.Pages.Accept(textFragmentAbsorber);
//get the extracted text fragments
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;
//loop through the fragments
foreach (TextFragment textFragment in textFragmentCollection)
{
try
{
count_replace ++;
if (style.Index>0 && style.Index == count_replace) continue;
//update text and other properties
textFragment.Text = textDst;
if (style.hasFont) textFragment.TextState.Font = style.Font;
if (style.Size >= 0) textFragment.TextState.FontSize = style.Size;
if (style.LineSpacing >= 0) textFragment.TextState.LineSpacing = style.LineSpacing;
if (style.Color != System.Drawing.Color.Empty) textFragment.TextState.ForegroundColor = Aspose.Pdf.Color.FromRgb(style.Color);
if (style.BgColor != System.Drawing.Color.Empty) textFragment.TextState.ForegroundColor = Aspose.Pdf.Color.FromRgb(style.BgColor);
if (style.Underline >= 0) textFragment.TextState.Underline = style.Underline > 0;
count_success ++;
Console.Error.WriteLine("* Replaced["+count_success+"]: Successfully on page "+textFragment.Page.Number);
}
catch (Exception e)
{
count_fail ++;
Console.Error.WriteLine("* Error[" + count_fail + "]: " + e.Message);
}
}
pdfDocument.Save(fileDst);
if (count_success != 0)
{
Console.WriteLine("Success: \"" + fileSrc + "\"");
}
else
{
Console.WriteLine("Fail: \"" + fileSrc + "\"");
}
return count_fail != 0 ? 1 : 0;
}
static void exit(int exitCode) {
Environment.Exit(exitCode);
}
static void Main(string[] args)
{
String textSrc = "",
textDst = "",
fileSrc = "",
fileDst = "";
textStyle style = new textStyle();
if (args.Length >= 4)
{
textSrc = args[0];
textDst = args[1];
fileSrc = args[2];
fileDst = args[3];
for (int i = 4; i < args.Length; i += 2)
{
String option = args[i].ToLower();
String value;
try
{
switch (option)
{
case "/help":
case "/?":
Usage();
break;
}
if (i + 1 >= args.Length)
{
throw new Exception("Error: Wrong value \"\".");
}
else
{
value = args[i + 1];
}
switch (option)
{
case "/font":
style.Font = FontRepository.FindFont(value);
style.hasFont = true;
break;
case "/size":
if (!float.TryParse(value, out style.Size) || style.Size <= 0)
{
throw new Exception("Error: Wrong value \"" + value + "\".");
}
break;
case "/index":
if (!int.TryParse(value, out style.Index) || style.Index <= 0)
{
throw new Exception("Error: Wrong value \"" + value + "\".");
}
break;
case "/height":
if (!float.TryParse(value, out style.LineSpacing) || style.LineSpacing <= 0)
{
throw new Exception("Error: Wrong value \"" + value + "\".");
}
break;
case "/color":
style.Color = System.Drawing.ColorTranslator.FromHtml(value);
break;
case "/bgcolor":
style.BgColor = System.Drawing.ColorTranslator.FromHtml(value);
break;
case "/underline":
if (value.ToLower() == "true")
{
style.Underline = 1;
}
else if (value.ToLower() == "false")
{
style.Underline = 0;
}
else
{
throw new Exception("Error: Wrong value \"" + value + "\".");
}
break;
default:
throw new Exception("Error: Unknow option \"" + option + "\".");
}
}
catch (Exception e)
{
Console.Error.WriteLine("Error: " + e.Message);
Environment.Exit(2);
}
}
try
{
int exitCode = Replace(textSrc, textDst, fileSrc, fileDst, style);
Environment.Exit(exitCode);
}
catch (Exception e)
{
Console.Error.WriteLine("Error: " + e.Message);
}
}
else {
Usage();
}
}
}
}[/code] [i=s] 本帖最后由 happy886rr 于 2017-10-15 01:06 编辑 [/i]
[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=203797&ptid=45873]1#[/url] [i]CrLf[/i] [/b]
这么久了,最近才发现大师的踪影。 [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=203799&ptid=45873]2#[/url] [i]happy886rr[/i] [/b]
:) 请教下大师,如何在pdf中插入一个空白页?这个dll能否实现?我用acrobat的dll,没有发现这样的操作,只能手动搞。 [i=s] 本帖最后由 CrLf 于 2017-10-15 14:10 编辑 [/i]
[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=203803&ptid=45873]4#[/url] [i]zhanglei1371[/i] [/b]
acrobat 没这个功能?不太可能吧
aspose 确实有 Pages.Insert,这里用 powershell 作个例子:[code][reflection.assembly]::LoadFile("z:\Aspose.Pdf.dll")
$pdf=[aspose.pdf.document]"input.pdf"
$pages = $pdf.Pages
$page_old = $pages[1]
$width = $page_old.Rect.Width
$height = $page_old.Rect.Height
$page_new = $pages.Insert(1)
$page_new.SetPageSize($width, $height)
$pdf.save("output.pdf")
[/code] 谢谢,我研究下这个。不过acroba似乎却是没提供新建空白页的代码,请教个几个人都没解决。虽然里面有insert,只能插入现有文件,但无法插入空白页。除非新建个空的只有一页的pdf插进去 [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=203807&ptid=45873]6#[/url] [i]zhanglei1371[/i] [/b]
复制页面再删除元素呢?
总觉得应该是有直接插入空页面的办法,这么基础的功能要是没有那也太奇怪了
另外,powershell 的实现方式改了一下
页:
[1]