【发布时间】:2017-01-17 08:59:47
【问题描述】:
我有一个添加了水印的 pdf 文档。结果很好,但是如果我尝试在结果 pdf 下划线,水印会被视为文本文档的一部分,因此下划线结果是错误的。
这是我用来应用水印的代码:
using (System.IO.MemoryStream memWatermark = new MemoryStream(pdfWatermark))
using (System.IO.MemoryStream memIn = new MemoryStream(pdfin))
using (System.IO.MemoryStream memOut = new MemoryStream())
{
memWatermark.Position = 0;
memIn.Position = 0;
memOut.Position = 0;
PdfReader reader = new PdfReader(memIn);
PdfReader wmReader = new PdfReader(memWatermark);
int j = wmReader.NumberOfPages;
if (wmReader.NumberOfPages > 0)
{
Rectangle wmSize = wmReader.GetPageSize(1);
int wmRotation = wmReader.GetPageRotation(1);
using (Document doc = new Document(wmSize))
{
PdfWriter writer = PdfWriter.GetInstance(doc, memOut);
doc.Open();
PdfImportedPage waterMarkPage = writer.GetImportedPage(wmReader, 1);
PdfImportedPage currentPage;
for (int i = 1; i <= reader.NumberOfPages; i++)
{
currentPage = writer.GetImportedPage(reader, i);
//Add the first file to coordinates 0,0
if (wmRotation == 90 || wmRotation == 270)
{
writer.DirectContent.AddTemplate(currentPage, 0, -1f, 1f, 0, 0, wmReader.GetPageSizeWithRotation(i).Height);
}
else
{
writer.DirectContent.AddTemplate(currentPage, 1f, 0, 0, 1f, 0, 0);
}
// set transparency for watermark
var gstate = new PdfGState { FillOpacity = 0.2f, StrokeOpacity = 0.4f };
writer.DirectContent.SaveState();
writer.DirectContent.SetGState(gstate);
//Since we don't call NewPage the next call will operate on the same page
if (wmRotation == 90 || wmRotation == 270)
{
writer.DirectContent.AddTemplate(waterMarkPage, 0, -1f, 1f, 0, 0, wmReader.GetPageSizeWithRotation(1).Height);
}
else
{
writer.DirectContent.AddTemplate(waterMarkPage, 1f, 0, 0, 1f, 0, 0);
}
// reset transparency state to default before adding next page
writer.DirectContent.RestoreState();
// now move to following page
if (i < reader.NumberOfPages)
{
doc.NewPage();
}
}
// flush writer but leave the stream open!
writer.Flush();
writer.CloseStream = false;
}
}
memOut.Position = 0;
if (memOut.Length > 0)
{
pdfout = new byte[memOut.Length];
pdfout = memOut.ToArray();
done = true;
}
}
【问题讨论】:
-
“下划线”是否意味着添加签名?您还需要显示该代码,因为您声明添加水印本身会产生所需的结果,但在向文档添加更多内容时会中断。
-
@Filburt 我正在使用 Android 上的 pspdfkit sdk 编辑最终的 pdf(原始文件+水印)。 “下划线”是指对文档文本进行注释和下划线,而不是签名。
-
感谢您的澄清。您提到 pspdfkit 很重要,因为人们可能会觉得您也在使用 itextsharp 进行下划线部分。
-
首先,您选择了破坏性水印例程,它会丢弃所有交互式内容,这不是推荐的方式。这是设计好的吗?此外,您将水印页面叠加到每个文档页面上。因此,如果原始水印 PDF 的内容需要下划线,则其叠加表示也是如此。如果您不希望您的水印受到干扰,请使用无干扰水印模板开始。
-
@mkl 不幸的是,这不是我编写的代码,我认为执行此操作的人并不确切知道他做了什么。我不确定我是否理解您的解决方案,请您在网上给我一个参考以了解我需要做什么?