PDFBox:从 ​​PDF 中删除单个字段

2023-12-19

我描述该问题的最简单方法是,我们使用 PDFbox 从 HelloSign 发送给我们的 PDF 中仅删除一个字段。 (例如信用卡号码)

  1. 有问题的数据将始终位于最后一页,并且始终位于页面中的相同坐标处。
  2. 需要从 PDF 中完全删除数据。我们不能简单地将字体更改为白色或在顶部绘制一个框,因为它仍然是可选的,因此可以复制。
  3. 只能删除该字段。我们仍然需要其他字段和签名。
  4. 我创建了一个示例文档并将其上传到 Dropbox。输入.pdf https://www.dropbox.com/s/oyv1vjyhkmao1t1/input.pdf?dl=0
  5. 为了解决这个问题,我们假设要删除的字段是我上传的文件中的街道地址。不是城市、州、邮政编码、签名或日期。 (在现实生活中,它将是敏感数据字段,例如信用卡号或 SSN。)

我在下面的第一条评论中对这个问题以及迄今为止我所尝试过的内容进行了冗长的解释。


这个答案中的代码可能出现有点通用,因为它首先确定文档中的字段映射,然后允许删除文本字段的任意组合。但请注意,它是仅使用此问题中的单个示例 PDF 开发的。因此,我无法确定我是否正确理解了 HelloSign 标记字段的方式,特别是 HelloSign 填充这些字段的方式。

这个答案提出了两个类,一个类分析 HelloSign 表单,另一个类通过清除选定的字段来操作它;后者依赖于前者收集的信息。这两个类都是基于 PDFBox 构建的PDFTextStripper实用类。

该代码是针对当前 PDFBox 开发版本 2.1.0-SNAPSHOT 开发的。它很可能也适用于所有 2.0.x 版本。

HelloSign分析仪

本课程分析给定的PDDocument寻找序列

  • [$varname ]它似乎定义了用于放置表单字段内容的占位符,以及
  • [def:$varname|type|req|signer|display|label]它似乎定义了占位符的属性。

它创建了一个集合HelloSignField每个实例都描述了这样一个占位符。如果可以在占位符上找到文本,它们还包含相应字段的值。

此外,它还存储页面上绘制的最后一个 xobject 的名称,在示例文档中,该名称是 HelloSign 绘制其字段内容的位置。

public class HelloSignAnalyzer extends PDFTextStripper
{
    public class HelloSignField
    {
        public String getName()
        { return name; }
        public String getValue()
        { return value; }
        public float getX()
        { return x; }
        public float getY()
        { return y; }
        public float getWidth()
        { return width; }
        public String getType()
        { return type; }
        public boolean isOptional()
        { return optional; }
        public String getSigner()
        { return signer; }
        public String getDisplay()
        { return display; }
        public String getLabel()
        { return label; }
        public float getLastX()
        { return lastX; }

        String name = null;
        String value = "";
        float x = 0, y = 0, width = 0;
        String type = null;
        boolean optional = false;
        String signer = null;
        String display = null;
        String label = null;

        float lastX = 0;

        @Override
        public String toString()
        {
            return String.format("[Name: '%s'; Value: `%s` Position: %s, %s; Width: %s; Type: '%s'; Optional: %s; Signer: '%s'; Display: '%s', Label: '%s']",
                    name, value, x, y, width, type, optional, signer, display, label);
        }

        void checkForValue(List<TextPosition> textPositions)
        {
            for (TextPosition textPosition : textPositions)
            {
                if (inField(textPosition))
                {
                    float textX = textPosition.getTextMatrix().getTranslateX();
                    if (textX > lastX + textPosition.getWidthOfSpace() / 2 && value.length() > 0)
                        value += " ";
                    value += textPosition.getUnicode();
                    lastX = textX + textPosition.getWidth();
                }
            }
        }

        boolean inField(TextPosition textPosition)
        {
            float yPos = textPosition.getTextMatrix().getTranslateY();
            float xPos = textPosition.getTextMatrix().getTranslateX();

            return inField(xPos, yPos);
        }

        boolean inField(float xPos, float yPos)
        {
            if (yPos < y - 3 || yPos > y + 3)
                return false;

            if (xPos < x - 1 || xPos > x + width + 1)
                return false;

            return true;
        }
    }

    public HelloSignAnalyzer(PDDocument pdDocument) throws IOException
    {
        super();
        this.pdDocument = pdDocument;
    }

    public Map<String, HelloSignField> analyze() throws IOException
    {
        if (!analyzed)
        {
            fields = new HashMap<>();

            setStartPage(pdDocument.getNumberOfPages());
            getText(pdDocument);

            analyzed = true;
        }
        return Collections.unmodifiableMap(fields);
    }

    public String getLastFormName()
    {
        return lastFormName;
    }

    //
    // PDFTextStripper overrides
    //
    @Override
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException
    {
        {
            for (HelloSignField field : fields.values())
            {
                field.checkForValue(textPositions);
            }
        }

        int position = -1;
        while ((position = text.indexOf('[', position + 1)) >= 0)
        {
            int endPosition = text.indexOf(']', position);
            if (endPosition < 0)
                continue;
            if (endPosition > position + 1 && text.charAt(position + 1) == '$')
            {
                String fieldName = text.substring(position + 2, endPosition);
                int spacePosition = fieldName.indexOf(' ');
                if (spacePosition >= 0)
                    fieldName = fieldName.substring(0, spacePosition);
                HelloSignField field = getOrCreateField(fieldName);

                TextPosition start = textPositions.get(position);
                field.x = start.getTextMatrix().getTranslateX();
                field.y = start.getTextMatrix().getTranslateY();
                TextPosition end = textPositions.get(endPosition);
                field.width = end.getTextMatrix().getTranslateX() + end.getWidth() - field.x;
            }
            else if (endPosition > position + 5 && "def:$".equals(text.substring(position + 1, position + 6)))
            {
                String definition = text.substring(position + 6, endPosition);
                String[] pieces = definition.split("\\|");
                if (pieces.length == 0)
                    continue;
                HelloSignField field = getOrCreateField(pieces[0]);

                if (pieces.length > 1)
                    field.type = pieces[1];
                if (pieces.length > 2)
                    field.optional = !"req".equals(pieces[2]);
                if (pieces.length > 3)
                    field.signer = pieces[3];
                if (pieces.length > 4)
                    field.display = pieces[4];
                if (pieces.length > 5)
                    field.label = pieces[5];
            }
        }

        super.writeString(text, textPositions);
    }

    @Override
    protected void processOperator(Operator operator, List<COSBase> operands) throws IOException
    {
        String currentFormName = formName; 
        if (operator != null && "Do".equals(operator.getName()) && operands != null && operands.size() > 0)
        {
            COSBase base0 = operands.get(0);
            if (base0 instanceof COSName)
            {
                formName = ((COSName)base0).getName();
                if (currentFormName == null)
                    lastFormName = formName;
            }
        }
        try
        {
            super.processOperator(operator, operands);
        }
        finally
        {
            formName = currentFormName;
        }
    }

    //
    // helper methods
    //
    HelloSignField getOrCreateField(String name)
    {
        HelloSignField field = fields.get(name);
        if (field == null)
        {
            field = new HelloSignField();
            field.name = name;
            fields.put(name, field);
        }
        return field;
    }

    //
    // inner member variables
    //
    final PDDocument pdDocument;
    boolean analyzed = false;
    Map<String, HelloSignField> fields = null;
    String formName = null;
    String lastFormName = null;
}

(HelloSignAnalyzer.java https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/main/java/mkl/testarea/pdfbox2/content/HelloSignAnalyzer.java#L31)

Usage

一个人可以应用HelloSignAnalyzer到一个文档如下:

PDDocument pdDocument = PDDocument.load(...);

HelloSignAnalyzer helloSignAnalyzer = new HelloSignAnalyzer(pdDocument);

Map<String, HelloSignField> fields = helloSignAnalyzer.analyze();

System.out.printf("Found %s fields:\n\n", fields.size());

for (Map.Entry<String, HelloSignField> entry : fields.entrySet())
{
    System.out.printf("%s -> %s\n", entry.getKey(), entry.getValue());
}

System.out.printf("\nLast form name: %s\n", helloSignAnalyzer.getLastFormName());

(PlayWithHelloSign.java https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/test/java/mkl/testarea/pdfbox2/content/PlayWithHelloSign.java#L43测试方法testAnalyzeInput)

对于OP的示例文档,输出是

Found 8 fields:

var1001 -> [Name: 'var1001'; Value: `123 Main St.` Position: 90.0, 580.0; Width: 165.53601; Type: 'text'; Optional: false; Signer: 'signer1'; Display: 'Address', Label: 'address1']
var1004 -> [Name: 'var1004'; Value: `12345` Position: 210.0, 564.0; Width: 45.53601; Type: 'text'; Optional: false; Signer: 'signer1'; Display: 'Postal Code', Label: 'zip']
var1002 -> [Name: 'var1002'; Value: `TestCity` Position: 90.0, 564.0; Width: 65.53601; Type: 'text'; Optional: false; Signer: 'signer1'; Display: 'City', Label: 'city']
var1003 -> [Name: 'var1003'; Value: `AA` Position: 161.0, 564.0; Width: 45.53601; Type: 'text'; Optional: false; Signer: 'signer1'; Display: 'State', Label: 'state']
date2 -> [Name: 'date2'; Value: `2016/12/09` Position: 397.0, 407.0; Width: 124.63202; Type: 'date'; Optional: false; Signer: 'signer2'; Display: 'null', Label: 'null']
signature1 -> [Name: 'signature1'; Value: `` Position: 88.0, 489.0; Width: 236.624; Type: 'sig'; Optional: false; Signer: 'signer1'; Display: 'null', Label: 'null']
date1 -> [Name: 'date1'; Value: `2016/12/09` Position: 397.0, 489.0; Width: 124.63202; Type: 'date'; Optional: false; Signer: 'signer1'; Display: 'null', Label: 'null']
signature2 -> [Name: 'signature2'; Value: `` Position: 88.0, 407.0; Width: 236.624; Type: 'sig'; Optional: false; Signer: 'signer2'; Display: 'null', Label: 'null']

Last form name: Xi0

HelloSign 机械手

这个类利用了以下信息HelloSignAnalyzer已聚集并清除其姓名给出的文本字段的内容。

public class HelloSignManipulator extends PDFTextStripper
{
    public HelloSignManipulator(HelloSignAnalyzer helloSignAnalyzer) throws IOException
    {
        super();
        this.helloSignAnalyzer = helloSignAnalyzer;
        addOperator(new SelectiveDrawObject());
    }

    public void clearFields(Iterable<String> fieldNames) throws IOException
    {
        try
        {
            Map<String, HelloSignField> fieldMap = helloSignAnalyzer.analyze();
            List<HelloSignField> selectedFields = new ArrayList<>();
            for (String fieldName : fieldNames)
            {
                selectedFields.add(fieldMap.get(fieldName));
            }
            fields = selectedFields;

            PDDocument pdDocument = helloSignAnalyzer.pdDocument;
            setStartPage(pdDocument.getNumberOfPages());
            getText(pdDocument);
        }
        finally
        {
            fields = null;
        }
    }

    class SelectiveDrawObject extends OperatorProcessor
    {
        @Override
        public void process(Operator operator, List<COSBase> arguments) throws IOException
        {
            if (arguments.size() < 1)
            {
                throw new MissingOperandException(operator, arguments);
            }
            COSBase base0 = arguments.get(0);
            if (!(base0 instanceof COSName))
            {
                return;
            }
            COSName name = (COSName) base0;

            if (replacement != null || !helloSignAnalyzer.getLastFormName().equals(name.getName()))
            {
                return;
            }

            if (context.getResources().isImageXObject(name))
            {
                throw new IllegalArgumentException("The form xobject to edit turned out to be an image.");
            }

            PDXObject xobject = context.getResources().getXObject(name);

            if (xobject instanceof PDTransparencyGroup)
            {
                throw new IllegalArgumentException("The form xobject to edit turned out to be a transparency group.");
            }
            else if (xobject instanceof PDFormXObject)
            {
                PDFormXObject form = (PDFormXObject) xobject;
                PDFormXObject formReplacement = new PDFormXObject(helloSignAnalyzer.pdDocument);
                formReplacement.setBBox(form.getBBox());
                formReplacement.setFormType(form.getFormType());
                formReplacement.setMatrix(form.getMatrix().createAffineTransform());
                formReplacement.setResources(form.getResources());
                OutputStream outputStream = formReplacement.getContentStream().createOutputStream(COSName.FLATE_DECODE);
                replacement = new ContentStreamWriter(outputStream);

                context.showForm(form);

                outputStream.close();
                getResources().put(name, formReplacement);
                replacement = null;
            }
        }

        @Override
        public String getName()
        {
            return "Do";
        }
    }

    //
    // PDFTextStripper overrides
    //
    @Override
    protected void processOperator(Operator operator, List<COSBase> operands) throws IOException
    {
        if (replacement != null)
        {
            boolean copy = true;
            if (TjTJ.contains(operator.getName()))
            {
                Matrix transformation = getTextMatrix().multiply(getGraphicsState().getCurrentTransformationMatrix());
                float xPos = transformation.getTranslateX();
                float yPos = transformation.getTranslateY();
                for (HelloSignField field : fields)
                {
                    if (field.inField(xPos, yPos))
                    {
                        copy = false;
                    }
                }
            }

            if (copy)
            {
                replacement.writeTokens(operands);
                replacement.writeToken(operator);
            }
        }
        super.processOperator(operator, operands);
    }

    //
    // helper methods
    //
    final HelloSignAnalyzer helloSignAnalyzer;
    final Collection<String> TjTJ = Arrays.asList("Tj", "TJ");
    Iterable<HelloSignField> fields;
    ContentStreamWriter replacement = null;
}

(HelloSignManipulator.java https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/main/java/mkl/testarea/pdfbox2/content/HelloSignManipulator.java#L42)

用途:清除单个字段

一个人可以应用HelloSignManipulator按如下方式对文档清除单个字段:

PDDocument pdDocument = PDDocument.load(...);

HelloSignAnalyzer helloSignAnalyzer = new HelloSignAnalyzer(pdDocument);

HelloSignManipulator helloSignManipulator = new HelloSignManipulator(helloSignAnalyzer);

helloSignManipulator.clearFields(Collections.singleton("var1001"));

pdDocument.save(...);

(PlayWithHelloSign.java https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/test/java/mkl/testarea/pdfbox2/content/PlayWithHelloSign.java#L77测试方法testClearAddress1Input)

用法:一次清除多个字段

一个人可以应用HelloSignManipulator按如下方式对文档进行一次清除多个字段:

PDDocument pdDocument = PDDocument.load(...);

HelloSignAnalyzer helloSignAnalyzer = new HelloSignAnalyzer(pdDocument);

HelloSignManipulator helloSignManipulator = new HelloSignManipulator(helloSignAnalyzer);

helloSignManipulator.clearFields(Arrays.asList("var1004", "var1003", "date2"));

pdDocument.save(...);

(PlayWithHelloSign.java https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/test/java/mkl/testarea/pdfbox2/content/PlayWithHelloSign.java#L107测试方法testClearZipStateDate2Input)

用法:连续清除多个字段

一个人可以应用HelloSignManipulator对文档进行如下操作,依次清除多个字段:

PDDocument pdDocument = PDDocument.load(...);

HelloSignAnalyzer helloSignAnalyzer = new HelloSignAnalyzer(pdDocument);

HelloSignManipulator helloSignManipulator = new HelloSignManipulator(helloSignAnalyzer);

helloSignManipulator.clearFields(Collections.singleton("var1004"));
helloSignManipulator.clearFields(Collections.singleton("var1003"));
helloSignManipulator.clearFields(Collections.singleton("date2"));

pdDocument.save(...);

(PlayWithHelloSign.java https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/test/java/mkl/testarea/pdfbox2/content/PlayWithHelloSign.java#L138测试方法testClearZipStateDate2SuccessivelyInput)

Caveat

这些类只是概念验证。一方面,它们是基于单个示例 HelloSign 文件构建的,因此很有可能错过重要细节。另一方面,有一些内置的假设,例如在里面HelloSignField method inField.

此外,通常操作签名的 HelloSign 文件可能不是一个好主意。如果我正确地理解了他们的概念,他们会存储每个签名文档的哈希值以允许验证内容,如果文档如上所示进行操作,则哈希值将不再匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDFBox:从 ​​PDF 中删除单个字段 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will

随机推荐

  • 让 AVAudioPCMBuffer 正常工作(AVAudioFile.mm 错误代码 -50)

    我正在尝试在 Swift Playground 中设置一个基本示例 代码如下 但也使用 Objective C 进行了尝试 得到了相同的结果 import AVFoundation let fileURL have tried a wav
  • 为什么 Lucene.Net 索引器会抛出 System.IO.IOException 未处理?

    有时会抛出异常 说文件write lock无法使用 因为它正在被另一个进程使用 但是这是 Lucene Net 的一个非常简单的测试应用程序 没有其他进程使用它 不知道这可能是怎么回事 异常详情如下 System IO IOExceptio
  • 德尔福有“操纵杆”控件吗?

    我想使用鼠标将对象在 X 和 Y 方向上对齐 将其移动到位 我可以通过使用各种旋转控件 或按钮 来滚动解决方案 但它很混乱 我想知道是否有一个控件 例如操纵杆 可以使用鼠标提供 2 轴控制并以不同的速率触发事件它的地位 Afaik Jedi
  • 静态类的扩展方法? [复制]

    这个问题在这里已经有答案了 我知道我可以执行以下操作来延长课程 我有一个静态类 我想扩展 我可以怎样做呢 我想写ClassName MyFunc static public class SomeName static public int
  • GCC 下缺少返回语句的错误

    如何在 GCC 下生成缺少 return 语句的错误 cpfsfuse c 184 警告 函数中没有 return 语句返回非 void 我能够返回隐式函数声明的错误 Werror implicit function declaration
  • 有没有办法在 Azure 数据工厂中插入带有嵌套数组的文档?

    我正在尝试在 CosmosDb 中添加具有嵌套数组的文档 我正在使用Copy Activity 样本文件 itemNumber D10001 readings value 25 ets 100011111 value 35 ets 1000
  • 您可以将 RolePrincipal 包装在自定义 IPrincipal 对象中吗?

    我在 ASP NET 框架内使用带有表单身份验证的自定义成员资格和角色提供程序 这些效果很好 角色提供者使用 cookie 来保存角色 在每个 Web 请求上保存一次数据库访问 我还在 FormsAuthenticationTicket 中
  • 如何使用 CTCallCenter:setCallEventHandler: 获取应用程序暂停时发生的通话事件?

    CTCallCenter setCallEventHandler 的文档指出 但是 调用事件也可能在您的应用程序运行时发生 暂停 暂停期间 您的申请不会收到 调用事件 当您的应用程序恢复活动状态时 它 为每个更改状态的呼叫接收一个呼叫事件
  • 如何将用户添加到 SQL Server 2008 Management Studio

    我正在尝试安装 DotNetNuke CMS 我在 Microsoft SQL Server Management Studio 2008 中创建了一个数据库 该数据库是在安装 Microsoft Visual Studio 2010 后安
  • 如何为 ollydbg 2.x.x 设置插件? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我从其官方网站下载了最新的ollydbg 2 x版本以及tuts4you的一些插件 但如何启用 安装插件呢 要么将插件 dll 放入专用目录中 例如P
  • 如何在Python 2.7.3版本中提取7z zip文件

    如何在 python 中提取 7z zip 文件 请让我知道是否有任何库可以实现这一点 我已经在 python 2 7 3 版本中安装了 libarchive 库 但我无法使用该库 您可以使用PyLZMA and py7zlib要提取的库7
  • C# 为 DSA 加密算法生成公钥和私钥 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何为 DSA 算法生成字节数组格式
  • 在 Eclipse Ubuntu 中重新索引存储库

    我只是安装 git 存储库并为 eclipse 安装 EGit 插件 当我更改代码并尝试保存时 Eclipse 开始重新索引存储库 然而这个过程永远不会结束 并且日食变得更慢 我只是在网上搜索并尝试应用一些建议的解决方案 但它们不起作用 任
  • CMake 无法在 macOS 上找到 LAPACK sgemm

    我正在尝试编译这段代码 https github com ElmerCSC elmerfem tree wip mac 但是运行时cmake 在构建文件夹中我收到消息 Looking for Fortran sgemm Looking fo
  • PHP 如何使用curl 打开多个源?

    我有一些代码来获取 site1 的 json 内容 但我还需要获取 site2 的内容 我应该为 site2 再次重写所有这些行吗 或者也许我可以在curl setopt ch curl init curl setopt ch CURLOP
  • 如何在react-native中使jwplayer全屏

    我打算在react native中使用jwplayer 截至目前 Github 上还没有可用的 jwplayer React Native 插件 因此我正在开发一个 Native 模块 该模块将在 React Native 中渲染 jwpl
  • SmartPointer:基类和派生类之间的转换

    假设你有一个这样的函数 SmartPtr a doSomething SmartPtr a a 和这样的课程 class A class B public A 现在我这样做 SmartPtr a foo new B doSomething
  • Java 检查点

    我希望我的问题不太模糊 但我正在寻找有关 Java 检查点的更多信息 我必须生成一个大搜索树 我希望能够在程序中断后 例如突然重新启动后等 恢复计算 因此我需要检查点 我发现关于这方面的文档很少 而且我的印象是很多开发在 90 年代中期就停
  • NSArray 对象和铸造

    我有课A有财产NSString name 如果有一个NSArray并添加许多A对象放入此数组中 每次检索对象时是否都需要进行转换 IE NSString n NSString arr objectAtIndex 1 或者有另一种方法可以做到
  • PDFBox:从 ​​PDF 中删除单个字段

    我描述该问题的最简单方法是 我们使用 PDFbox 从 HelloSign 发送给我们的 PDF 中仅删除一个字段 例如信用卡号码 有问题的数据将始终位于最后一页 并且始终位于页面中的相同坐标处 需要从 PDF 中完全删除数据 我们不能简单