我打开现有的pdf。如果受到保护,请检查保护并询问密码,并使用以下命令打开密码:
PdfReader pdfReader = null;
Stream outputStream = null;
PdfStamper pdfStamper = null;
try
{
pdfReader = GetPdfReaderObject();
outputStream = new FileStream(filePathDestination, FileMode.Create, FileAccess.Write, FileShare.None);
pdfStamper = new PdfStamper(pdfReader, outputStream);
PdfLayer layer = new PdfLayer("watermark", pdfStamper.Writer);
for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) {
pdfStamper.FormFlattening = false;
iTextSharp.text.Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex);
PdfContentByte pdfData = pdfStamper.GetOverContent(pageIndex);
pdfData.BeginLayer(layer);
PdfGState graphicsState = new PdfGState();
graphicsState.FillOpacity = 0.5F;
pdfData.SetGState(graphicsState);
pdfData.BeginText();
iTextSharp.text.Image watermarkImage = iTextSharp.text.Image.GetInstance(System.Drawing.Image.FromFile(watermarkImagePath), ImageFormat.Png);
float width = pageRectangle.Width;
float height = pageRectangle.Height;
watermarkImage.SetAbsolutePosition(width / 2 - watermarkImage.Width / 2, height / 2 - watermarkImage.Height / 2);
pdfData.AddImage(watermarkImage);
pdfData.EndText();
pdfData.EndLayer();
}
}
pdfStamper.Close();
outputStream.Close();
outputStream.Dispose();
pdfReader.Close();
pdfReader.Dispose();
} catch (Exception e) {
....
}
}
我修改后保存它但保护被破坏了。
为什么保护会被破坏? 如何保存原始文档的保护并将其添加到我修改过的文档中。
此致
答案 0 :(得分:3)
您使用PdfStamper
来操纵现有PDF。
对于任何来源PDF:如果您希望对结果进行加密,可以适当使用SetEncryption
方法。
查看EncryptionPdf.cs,尤其是方法EncryptPdf
:
PdfReader reader = ...;
using (MemoryStream ms = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(reader, ms))
{
stamper.SetEncryption(
USER, OWNER,
PdfWriter.ALLOW_PRINTING,
PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA
);
}
return ms.ToArray();
}
此处USER
和OWNER
是您选择的用户和所有者密码。您可能希望使用一组不同的权限。
对于已加密的源PDF ,您也可以选择在追加模式下使用PdfStamper
(即使用PdfStamper
构造函数设置bool append
参数true
)。在这种情况下,原始加密也将应用于更新的PDF。
答案 1 :(得分:1)
您使用的是哪个版本的iText?
当使用owner
密码打开受密码保护的PDF并由PdfStamper
操纵时,所有原始密码保护确实已被删除。这在iText 5.3.5中有所改变。请参阅changelog:
重要提示:我们现在在盖章时保留原始所有者密码。
换句话说:对于5.3.5之前的所有iText版本,所有者密码将丢失。从5.3.5开始,应该保留。