我正在使用iTextSharp产品更改PDF属性,如下所示。 我无法更改" PDF制作人"财产。请建议,我哪里出错了。
代码行 信息["制作人"] ="我的制作人&#34 ;;
无法正常工作。
string sourcePath = tbPath.Text;
IList<string> dirs = null;
string pdfName = string.Empty;
string OutputPath = string.Empty;
DirectoryInfo di = new DirectoryInfo(sourcePath);
DirectoryInfo dInfo = Directory.CreateDirectory(sourcePath + "\\" + "TempDir");
OutputPath = Path.Combine(sourcePath,"TempDir");
dirs = Directory.GetFiles(di.FullName, "*.pdf").ToList();
for (int i = 0; i <= dirs.Count - 1; i++)
{
try
{
PdfReader pdfReader = new PdfReader(dirs[i]);
using (FileStream fileStream = new FileStream(Path.Combine(OutputPath, Path.GetFileName(dirs[i])),
FileMode.Create,
FileAccess.Write))
{
PdfStamper pdfStamper = new PdfStamper(pdfReader, fileStream);
Dictionary<string, string> info = pdfReader.Info;
info["Title"] = "";
info["Author"] = "";
info["Producer"] = "My producer"; ////THIS IS NOT WORKING..
pdfStamper.MoreInfo = info;
pdfStamper.Close();
pdfReader.Close();
}
答案 0 :(得分:7)
如果您拥有许可证密钥,则只能更改生产线。需要从iText Software购买许可证密钥。有关如何应用许可证密钥的说明与该密钥一起发送。
如果您想免费使用iText,则无法更改生产线。请参阅开源版iText中每个文件的许可证标题:
* In accordance with Section 7(b) of the GNU Affero General Public License,
* a covered work must retain the producer line in every PDF that is created
* or manipulated using iText.
您的信息:iText集团已成功起诉一家德国公司,该公司在未购买许可证的情况下更改了生产线。您可以在此处找到与此案例相关的一些文档:IANAL: What developers should know about IP and Legal(幻灯片57-62)
顺便说一句,我通过这次演讲获得了JavaOne Rockstar奖:https://twitter.com/itext/status/704278659012681728
摘要:如果您没有iText的商业许可,则无法合法更改iText中的生产线。如果您拥有商业许可证,则需要应用许可证密钥。
答案 1 :(得分:0)
如果使用已知的生产者,则可以替换PDF文件中的字节。 您需要生产者至少是您公司(或生产者替代文本)名称的长度。 在此示例中,我假设生产者至少有20个字符。您必须通过使用文本编辑器编辑PDF文件来确定。 在使用用于创建PDF的程序的此检查许可证之前 这是C#中的示例。
// find producer bytes: "producer... " in array and replace
// them with "COMPANY", and after fitth with enough spaces (code: 32)
var textForReplacement = "producer";
var bytesForReplacement = System.Text.Encoding.UTF8.GetBytes(textForReplacement);
var newText = "COMPANY";
var newBytes = System.Text.Encoding.UTF8.GetBytes(newText);
var result = this.Search(pdf, bytesForReplacement);
if (result > -1)
{
var j = 0;
for (var i = result; i < result + 20; i++)
{
// if we have new bytes, then replace them
if (i < result + newBytes.Length)
{
pdf[i] = newBytes[j];
j++;
}
// if not, fill spaces (32)
else
{
pdf[i] = 32;
}
}
}
return pdf;
}
int Search(byte[] src, byte[] pattern)
{
int c = src.Length - pattern.Length + 1;
int j;
for (int i = 0; i < c; i++)
{
if (src[i] != pattern[0]) continue;
for (j = pattern.Length - 1; j >= 1 && src[i + j] == pattern[j]; j--) ;
if (j == 0) return i;
}
return -1;
}